回答編集履歴
3
修正
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
改善
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
修正の反映
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
|
```
|