2017-12-21 22 views
0

機械学習とテンソルフロー。私は、テンソルフローサイトでのMNISTチュートリアルに従って始めました。シンプルなバージョンを手に入れましたが、深いCNNに従うときにエラーが見つかりました。Tensorflow MNIST:ValueError:形状はランク4である必要がありますが、入力形状が 'Conv2D'(op: 'Conv2D')の場合はランク1です。[?、28,28,1]、[4]

ValueError: Shape must be rank 4 but is rank 1 for 'Conv2D' (op: 'Conv2D') with input shapes: [?,28,28,1], [4].

は問題がラインにあるようだ:任意の助け

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

おかげで、私は少しここで失いましたよ。

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

import tensorflow as tf 

x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.matmul(x, W) + b 

y_ = tf.placeholder(tf.float32, [None, 10]) 

#improvements 
def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') 

#layer 1 
W_conv1 = ([5,5,1,32]) 
b_conv1 = ([32]) 

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

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

#layer 2 
W_conv2 = weight_variable([5, 5, 32, 64]) 
b_conv2 = bias_variable([64]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

#fully connected layer 
W_fc1 = weight_variable([3136, 1024]) 
b_fc1 = bias_variable([1024]) 

h_pool2_flat = tf.reshape(h_pool2, [-1, 3136]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 

#dropout 
keep_prob = tf.placeholder(tf.float32) 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 

#readout, similar to softmax 
W_fc2 = weight_variable([1024, 10]) 
b_fc2 = bias_variable([10]) 

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 

#optimization 
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) 

#training 
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
correct = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) 

#evaluate 
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) 

#the session 
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: 
      training_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0}) 
      print("step: %i accuracy: %a" % (i, training_accuracy)) 
     train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 
    print("test accuracy: %s" % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) 

答えて

2

あなたのエラーは、あなたの第一畳み込み層である - あなたが作成したweight_variable()bias_variable()機能を使用していないので、あなたの変数W_conv1b_conv1だけで(それゆえ1ランク)一覧表示されます!

関連する問題