首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow -不能为形状'(?,28,28,1)的张量提供形状值(256,784)

Tensorflow -不能为形状'(?,28,28,1)的张量提供形状值(256,784)
EN

Stack Overflow用户
提问于 2018-10-07 07:11:27
回答 2查看 1.7K关注 0票数 2

这是我的简单眼镜片。我的输入是28 * 28 *1(灰度)。我已经声明输入占位符是(None,28,28,1),以容纳批处理,并与conv筛选器形状一起工作。当我对模型进行评估时,我认为它期待的是大小为28*28*1的图像,但它会得到一个行向量。但是,即使在输入feed_dict之前,我将图像重塑为28*28*1,它仍然给了我错误。请帮我改正一下好吗?

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data


def batches(batch_size, features, labels):
    """
    Create batches of features and labels
    :param batch_size: The batch size
    :param features: List of features
    :param labels: List of labels
    :return: Batches of (Features, Labels)
    """
    assert len(features) == len(labels)
    outout_batches = []

    sample_size = len(features)
    for start_i in range(0, sample_size, batch_size):
        end_i = start_i + batch_size
        batch = [features[start_i:end_i], labels[start_i:end_i]]
        outout_batches.append(batch)

    return outout_batches


mnist = input_data.read_data_sets('/datasets/ud730/mnist', one_hot=True)
train_features = mnist.train.images
test_features = mnist.test.images

train_labels = mnist.train.labels.astype(np.float32)
test_labels = mnist.test.labels.astype(np.float32)

batch_size = 256
n_input = 28 * 28
n_labels = 10
learning_rate = 0.001
n_hidden_layer = 256
n_hidden_layer2 = 64
mu = 0.0
sigma = 0.1

########### CONVOLUTION LAYER NETWORK START ########################################################################
### INPUT --> LAYER 1 : CONV1(5*5 FILTER, DEPTH=6, S=1, P=YES/'SAME') --> RELU --> MAXPOOL -->
###           LAYER 2 :  --> CONV2(5*5 FILTER, DEPTH=16, S=1, P=YES/'SAME') --> RELU --> MAXPOOL -->
###           LAYER 3, 4, OUTPUT: --> DENSE --> DENSE --> OUTPUT --> ACTIVATION

# INPUT         : 28 * 28
# LAYER 1, d=6  : (28-5+1/1 = 24) = 24 * 24 * 6
# MAXPOOL1      : 12 * 12 * 6
# LAYER 2, d=16 : (12-5+1/1 = 8) = 8 * 8 * 16
# MAXPOOL2      : 4 * 4 * 16
# DENSE 1       : 256 --> 128
# DENSE 2       : 128 --> 64
# DENSE 3       : 64  --> 10

#LAYER1
#w1 is the convolution filter weight, not the complete weight 

features = tf.placeholder(tf.float32, [None, 28, 28, 1])
labels = tf.placeholder(tf.float32, [None])


w1 = tf.Variable(tf.truncated_normal(shape=[5, 5, 1, 6], mean=mu, stddev=sigma))
b1 = tf.Variable(tf.zeros(6))
conv1 = tf.nn.conv2d(features, w1, strides=[1,1,1,1], padding='VALID')
conv1 = tf.nn.relu(conv1)
conv1 = tf.nn.max_pool(conv1, strides=[1,2,2,1], ksize=[1,2,2,1], padding='SAME')

w2 = tf.Variable(tf.truncated_normal(shape=[5,5,6,16], mean=mu, stddev=sigma))
b2 = tf.Variable(tf.zeros(16))
conv2 = tf.nn.conv2d(conv1, w2, strides=[1,1,1,1], padding='VALID')
conv2 = tf.nn.relu(conv2)
conv2 = tf.nn.max_pool(conv2, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

flattened_vector = tf.contrib.layers.flatten(conv2)

w3 = tf.Variable(tf.truncated_normal(shape=[256, 128], mean=mu, stddev=sigma))
b3 = tf.Variable(tf.zeros(128))
layer3 = tf.add(tf.matmul(flattened_vector, w3), b3)
layer3 = tf.nn.relu(layer3)

w4 = tf.Variable(tf.truncated_normal(shape=[128, 64], mean=mu, stddev=sigma))
b4 = tf.Variable(tf.zeros(64))
layer4 = tf.add(tf.matmul(layer3, w4), b4)
layer4 = tf.nn.relu(layer4)

w5 = tf.Variable(tf.truncated_normal(shape=[64, 10], mean=mu, stddev=sigma))
b5 = tf.Variable(tf.zeros(10))
layer5 = tf.add(tf.matmul(layer4, w5), b5)
logits = tf.nn.relu(layer5)

########### CONVOLUTION LAYER NETWORK END ########################################################################


cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels,1))
accuracy = tf.reduce_mean(tf.cast(prediction, tf.float32))


############ EVALUATING THE MODEL ############
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for batch_images, batch_labels in batches(batch_size, train_features, train_labels):
        sess.run(optimizer, feed_dict={features:batch_images, labels:batch_labels})

    total_accuracy = sess.run(accuracy, feed_dict={features:test_features, labels:test_labels})
    print(total_accuracy)

错误

代码语言:javascript
复制
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-3f341fec1373> in <module>
    106     sess.run(init)
    107     for batch_images, batch_labels in batches(batch_size, train_features, train_labels):
--> 108         sess.run(optimizer, feed_dict={features:batch_images, labels:batch_labels})
    109 
    110     total_accuracy = sess.run(accuracy, feed_dict={features:test_features, labels:test_labels})

F:\ProgramFiles\miniconda\envs\IntroToTensorFlow\lib\site-packages\tensorflow\python\client\session.py in run(self, fetches, feed_dict, options, run_metadata)
    875     try:
    876       result = self._run(None, fetches, feed_dict, options_ptr,
--> 877                          run_metadata_ptr)
    878       if run_metadata:
    879         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

F:\ProgramFiles\miniconda\envs\IntroToTensorFlow\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
   1074                              'which has shape %r' %
   1075                              (np_val.shape, subfeed_t.name,
-> 1076                               str(subfeed_t.get_shape())))
   1077           if not self.graph.is_feedable(subfeed_t):
   1078             raise ValueError('Tensor %s may not be fed.' % subfeed_t)

ValueError: Cannot feed value of shape (256, 784) for Tensor 'Placeholder_26:0', which has shape '(?, 28, 28, 1)'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-07 08:02:25

代码中有两个问题。

你应该重塑你的投入。例如,通过这样做:

代码语言:javascript
复制
mnist = input_data.read_data_sets('/tmp/datasets/ud730/mnist', one_hot=True)
train_features = [d.reshape(28, 28, 1) for d in mnist.train.images]
test_features = [d.reshape(28, 28, 1) for d in mnist.test.images]

此外,您的标签的尺寸应该是:

代码语言:javascript
复制
...
features = tf.placeholder(tf.float32, [None, 28, 28, 1])
labels = tf.placeholder(tf.float32, [None, 10])
...
票数 1
EN

Stack Overflow用户

发布于 2018-10-07 07:28:08

我看不出你在哪里重塑输入数据。正如错误消息所述,它期望输入与占位符的形状相同。所以你要么需要

代码语言:javascript
复制
np.reshape(batch_images, (-1, 28, 28, 1))

在放进sess.run()

代码语言:javascript
复制
features = tf.reshape(features, (-1, 28, 28, 1))

在模型定义中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52686275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档