teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2017/11/09 16:46

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -7,8 +7,8 @@
7
7
  詳しくはコードを追っていただくとして、ポイントをいくつかだけ。
8
8
  0. おそらくオリジナルのコードで一番問題となったのは教師データをシャッフルしていないことだと思います。エポックごとにシャッフルすべきです。
9
9
  1. 学習ではlossが小さくなるように重みを更新します。なので、学習率次第ではaccuracyははじめのうちは変化しません。それに対して、lossが先が変動します。(学習している証拠です。)これを出力すべきです。今回の場合はtensorflowの泥臭いところを全部自分で書きたい(のかもしれない)ので、もとのコードに修正を加えましたが、Kerasなどの高度なライブラリを使うことで、デフォルトでaccuracyとlossの両方を出力させることができます。
10
- 2. cross_entropyの計算が正しくありませんでした。[本家](https://www.tensorflow.org/get_started/mnist/beginners)のチュートリアルを参考にするとよいのですが、reduction_indices=[1]が欠けているせいで、一定の精度以上学習できません。またyの値のクリッピングも学習にバイアスをあたえるので、ない方がよいです。理由はyが1以上であれば、みなlossがおなじになるので重みを更新しようがないことが挙げられます。
11
- 3. lossを出力させていないことにもつながりますが、重みの初期化次第ではlossがnanになることがあります。このような場合も学習することはできません。
10
+ 2. cross_entropyの計算が正しくありませんでした。[本家](https://www.tensorflow.org/get_started/mnist/beginners)のチュートリアルを参考にするとよいのですが、reduction_indices=[1]が欠けているせいで、一定の精度以上学習できません。(追記:[勾配に対してclipをつけろと言われていすね](https://stackoverflow.com/questions/36498127/how-to-effectively-apply-gradient-clipping-in-tensor-flow)。またyの値のクリッピングも学習にバイアスをあたえるので、ない方がよいです。理由はyが1以上であれば、みなlossがおなじになるので重みを更新しようがないことが挙げられます。
11
+ 3. lossを出力させていないことにもつながりますが、重みの初期化次第ではlossがnanになることがあります。このような場合も学習することはできません。(追記:lossがnanになるのはyの値をclipしていないことによるようですね。)
12
12
  4. 画像取り込みのpathに関するバグを修正しました。
13
13
  5. 以前の回答でも指摘した、conv2d_firstのカッコの閉じる場所を修正しました。
14
14
  6. 以前の回答の最後のコードのインデントが正しくなかった箇所を修正しました。

2

改善

2017/11/09 16:46

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  確実に学習したというモデルを上げておきます。
2
2
  手元のパソコンにとってAlexNetは非常に重いので、いたるところでパラメータが縮小されています。
3
- 少なくとも有名なKaggleの犬猫分類に対して判定精度99を超えることができます。
3
+ 少なくとも有名なKaggleの犬猫分類に対して判定精度99%(追記:教師データに対して100%に過学習できるほど学習できる……このパラメータではテストデータに対しては70%程度ですね。)を超えることができます。
4
4
  犬猫分類のパラメータなので、2値分類です。
5
5
  多クラスに使う場合は修正を忘れずに。
6
6
 

1

修正の反映

2017/11/09 10:25

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -11,7 +11,8 @@
11
11
  3. lossを出力させていないことにもつながりますが、重みの初期化次第ではlossがnanになることがあります。このような場合も学習することはできません。
12
12
  4. 画像取り込みのpathに関するバグを修正しました。
13
13
  5. 以前の回答でも指摘した、conv2d_firstのカッコの閉じる場所を修正しました。
14
- 6. 以前の回答の最後のコードのインデントが正しくな
14
+ 6. 以前の回答の最後のコードのインデントが正しくなかった箇所を修正しました。
15
+
15
16
  ```python
16
17
  import sys
17
18
  import cv2
@@ -34,8 +35,7 @@
34
35
  flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.')
35
36
 
36
37
  def inference(images_placeholder, keep_prob):
37
- def weight_variable(shape,num):
38
+ def weight_variable(shape, num):
38
- #initial = tf.truncated_normal(shape, stddev=0.1/math.sqrt(float(num)))
39
39
  initial = tf.truncated_normal(shape, stddev=0.1, mean=0.)
40
40
  return (tf.Variable(initial).initialized_value())
41
41
 
@@ -49,11 +49,6 @@
49
49
  def conv2d(x,W):
50
50
  return (tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME'))
51
51
 
52
- '''
53
- def max_pool_3x3(x):
54
- return tf.nn.max_pool(x, ksize=[1, 3, 3, 1],
55
- strides=[1, 2, 2, 1], padding='SAME')
56
- '''
57
52
  def max_pool_2x2(x):
58
53
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
59
54
  strides=[1, 2, 2, 1], padding='SAME')
@@ -119,8 +114,6 @@
119
114
  return y_conv
120
115
 
121
116
  def loss(logits, labels):
122
- #cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0))))
123
- #cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0)), reduction_indices=[1]))
124
117
  cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels*tf.log(logits), reduction_indices=[1]))
125
118
 
126
119
  tf.summary.scalar("cross_entropy", cross_entropy)
@@ -231,11 +224,4 @@
231
224
  saver = tf.train.Saver()
232
225
  hoge = sess.run(tf.global_variables_initializer())
233
226
  saver.restore(sess,"model.ckpt")
234
-
235
- '''
236
- for i in range(len(test_image)):
237
- hoge = np.argmax(logits.eval(feed_dict={images_placeholder: [test_image[i]],keep_prob: 1.0 })[0])
238
- print("%s"%hoge)
239
- exit()
240
- '''
241
227
  ```