1

私はGooglenet開始ニューラルネットワークのバージョンを実装しようとしていますが、MNIST data setで10%の精度を得ています。単純なニューラルネットワークでは、このデータセットに対して97%の精度を得る必要があるため、これは心配です。だから、私は、最初のニューラルネットワークを正しく実装していないと確信しています。私は以下のコードを含んでいます。TensorFlowグーグルネーションの結果が悪い

The inception neural network that I am following

from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 
import tensorflow as tf 

x = tf.placeholder(dtype = tf.float32, shape = [None,784]) 
y_ = tf.placeholder(dtype = tf.float32, shape = [None,10]) 

x_input = tf.reshape(x,[-1,28,28,1]) 


# 1x1 Convolution 
W1x1 = tf.Variable(tf.random_normal([1,1,1,1])) 
b1x1 = tf.Variable(tf.random_normal([1])) 
output1x1 = tf.add(tf.nn.conv2d(x_input,W1x1, strides = [1,1,1,1], padding = 'SAME'),b1x1) 
output1x1 = tf.nn.relu(output1x1) 


# 5x5 Convolution 
W5x5 = tf.Variable(tf.random_normal([1,1,1,1])) 
b5x5 = tf.Variable(tf.random_normal([1])) 
output5x5 = tf.add(tf.nn.conv2d(output1x1,W5x5, strides = [1,1,1,1], padding = 'SAME'),b5x5) 
output5x5 = tf.nn.relu(output5x5) 


# 3x3 Convolution 
W3x3 = tf.Variable(tf.random_normal([1,1,1,1])) 
b3x3 = tf.Variable(tf.random_normal([1])) 
output3x3 = tf.add(tf.nn.conv2d(output1x1,W3x3, strides = [1,1,1,1], padding = 'SAME'),b3x3) 
output3x3 = tf.nn.relu(output3x3) 


# AveragePooling followed by 1x1 convolution 
outputPool = tf.nn.avg_pool(output1x1, ksize = [1,2,2,1], strides = [1,1,1,1], padding = "SAME") 
Wo1x1 = tf.Variable(tf.random_normal([1,1,1,1])) 
bo1x1 = tf.Variable(tf.random_normal([1])) 
outputo1x1 = tf.add(tf.nn.conv2d(outputPool,Wo1x1, strides = [1,1,1,1], padding = 'SAME'),bo1x1) 
outputo1x1 = tf.nn.relu(outputo1x1) 


# Concatonate the 4 convolution products 
finalouput = tf.concat([output1x1, output5x5, output3x3, outputo1x1], 3) 
finalouput = tf.reshape(finalouput, [-1, 7*7*64]) 

#Add a fully connected layer 
W_fc = tf.Variable(tf.random_normal([7*7*64,1024])) 
b_fc = tf.Variable(tf.random_normal([1024])) 
output_fc = tf.add(tf.matmul(finalouput,W_fc), b_fc) 
output_fc = tf.nn.relu(output_fc) 
output_fc = tf.nn.dropout(output_fc, keep_prob = 0.85) 

#Final layer 
W_final = tf.Variable(tf.random_normal([1024,10])) 
b_final = tf.Variable(tf.random_normal([10])) 
predictions = tf.add(tf.matmul(output_fc,W_final), b_final) 


# Train the model 
cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels = y_ ,logits = predictions)) 
optimiser = tf.train.AdamOptimizer(1e-3).minimize(cost) 
correct_prediction = tf.equal(tf.argmax(predictions, 1), tf.argmax(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(20000): 
     batch = mnist.train.next_batch(50) 
     if i % 100 == 0: 
      train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1]}) 
      print('step %d, training accuracy %g' % (i, train_accuracy)) 
     optimiser.run(feed_dict={x: batch[0], y_: batch[1]}) 
    print('test accuracy %g' % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels,})) 

答えて

2

問題は重みの初期化にあります。 tf.random_normal()を使用して初期化された重みは、標準偏差が1であり、その数が減少して問題を解決する必要があります。

変更重量の初期化へ:

W** = tf.Variable(tf.random_normal(..., stddev=0.01)) 
b** = tf.Variable(tf.random_normal(..., stddev=0.001)) 
0

あなたのモデルは非常に影です。 GoogLeNetには22のレイヤーがあります。

エラーが発生する可能性があるので、自分でレイヤーを実装することはお勧めしません。テンソルフロー抽象化を使用する方がよいでしょう。たとえば、hereのように、既存の実装を調べたり、既存の実装を使用したりすることもできます。

+0

しかし、写真のアルゴリズムからの結果、次の、私は良い結果を期待できますか? –

+0

あなたが見せた写真は1層のみです。あなたが良いことを意味するかどうかに応じて。あなたは1つの層で10%以上を得ているはずです。しかし、mnistが98%を超える状態のアート結果が必要な場合は、実際には複数のレイヤーが必要です。 – James

+0

この特定のデータセットでは、1つのレイヤであっても10%が本当に悪いです。しかし、私はコード内の問題が何であるか特定できません –

0

恐らくそれを別の順序で連結しようとしますか?

関連する問題