回答編集履歴

3

修正

2017/11/09 16:46

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -16,9 +16,9 @@
16
16
 
17
17
  1. 学習ではlossが小さくなるように重みを更新します。なので、学習率次第ではaccuracyははじめのうちは変化しません。それに対して、lossが先が変動します。(学習している証拠です。)これを出力すべきです。今回の場合はtensorflowの泥臭いところを全部自分で書きたい(のかもしれない)ので、もとのコードに修正を加えましたが、Kerasなどの高度なライブラリを使うことで、デフォルトでaccuracyとlossの両方を出力させることができます。
18
18
 
19
- 2. cross_entropyの計算が正しくありませんでした。[本家](https://www.tensorflow.org/get_started/mnist/beginners)のチュートリアルを参考にするとよいのですが、reduction_indices=[1]が欠けているせいで、一定の精度以上学習できません。またyの値のクリッピングも学習にバイアスをあたえるので、ない方がよいです。理由はyが1以上であれば、みなlossがおなじになるので重みを更新しようがないことが挙げられます。
20
-
21
- 3. lossを出力させていないことにもつながりますが、重みの初期化次第ではlossがnanになることがあります。このような場合も学習することはできません。
19
+ 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がおなじになるので重みを更新しようがないことが挙げられます。
20
+
21
+ 3. lossを出力させていないことにもつながりますが、重みの初期化次第ではlossがnanになることがあります。このような場合も学習することはできません。(追記:lossがnanになるのはyの値をclipしていないことによるようですね。)
22
22
 
23
23
  4. 画像取り込みのpathに関するバグを修正しました。
24
24
 

2

改善

2017/11/09 16:46

投稿

mkgrei
mkgrei

スコア8560

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

1

修正の反映

2017/11/09 10:25

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -24,7 +24,9 @@
24
24
 
25
25
  5. 以前の回答でも指摘した、conv2d_firstのカッコの閉じる場所を修正しました。
26
26
 
27
- 6. 以前の回答の最後のコードのインデントが正しくな
27
+ 6. 以前の回答の最後のコードのインデントが正しくなかった箇所を修正しました。
28
+
29
+
28
30
 
29
31
  ```python
30
32
 
@@ -70,9 +72,7 @@
70
72
 
71
73
  def inference(images_placeholder, keep_prob):
72
74
 
73
- def weight_variable(shape,num):
75
+ def weight_variable(shape, num):
74
-
75
- #initial = tf.truncated_normal(shape, stddev=0.1/math.sqrt(float(num)))
76
76
 
77
77
  initial = tf.truncated_normal(shape, stddev=0.1, mean=0.)
78
78
 
@@ -100,22 +100,12 @@
100
100
 
101
101
 
102
102
 
103
- '''
104
-
105
- def max_pool_3x3(x):
103
+ def max_pool_2x2(x):
106
-
104
+
107
- return tf.nn.max_pool(x, ksize=[1, 3, 3, 1],
105
+ return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
108
106
 
109
107
  strides=[1, 2, 2, 1], padding='SAME')
110
108
 
111
- '''
112
-
113
- def max_pool_2x2(x):
114
-
115
- return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
116
-
117
- strides=[1, 2, 2, 1], padding='SAME')
118
-
119
109
 
120
110
 
121
111
  x_image = tf.reshape(images_placeholder, [-1, IMAGE_SIZE, IMAGE_SIZE, 3])
@@ -240,10 +230,6 @@
240
230
 
241
231
  def loss(logits, labels):
242
232
 
243
- #cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0))))
244
-
245
- #cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0)), reduction_indices=[1]))
246
-
247
233
  cross_entropy = tf.reduce_mean(-tf.reduce_sum(labels*tf.log(logits), reduction_indices=[1]))
248
234
 
249
235
 
@@ -464,18 +450,4 @@
464
450
 
465
451
  saver.restore(sess,"model.ckpt")
466
452
 
467
-
468
-
469
- '''
470
-
471
- for i in range(len(test_image)):
472
-
473
- hoge = np.argmax(logits.eval(feed_dict={images_placeholder: [test_image[i]],keep_prob: 1.0 })[0])
474
-
475
- print("%s"%hoge)
476
-
477
- exit()
478
-
479
- '''
480
-
481
453
  ```