我有一个名为data_queue的tf.RandomShuffleQueue
定义如下:
self.data_queue = tf.RandomShuffleQueue(capacity=1024,
min_after_dequeue=21,
dtypes=[tf.float32,
tf.int32],
shapes=[[221, 221, 3], []],
name="data_queue")
我能够成功地将数据项排入其中。
出列操作定义如下:
[self.batch_images, self.batch_labels] = self.data_queue.dequeue_up_to(self.batchsize)
在上面的代码段self.batchsize
中是一个恒定的张量。
问题现在开始如下:
我想将这些直接推送到我的图表中。为清楚起见,我的图表的第一层如下:
conv1 = tf.layers.conv2d(self.batch_images, filters=96, kernel_size=7,
strides=2,
activation=tf.nn.relu,
kernel_regularizer=tf
.random_uniform_initializer,
name='conv1')
引用错误的最后几行是:
drop2 = tf.layers.dropout(fc2, name='drop2')
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=drop2,
labels=self.batch_labels,
name="cross_entropy_per_example")
我收到的错误是:
line 1709, in sparse_softmax_cross_entropy_with_logits
(labels_static_shape.ndims, logits.get_shape().ndims))
ValueError: Rank mismatch: Rank of labels (received 1) should equal rank of logits minus 1 (received 4).
当我检查tf.rank
和self.images
的{{1}}时,我得到了以下内容:
标签 张量("等级:0",形状=(),dtype = float32) 图片 张量(" Rank_1:0",shape =(),dtype = int32)
它是什么原因?
注意 我不想使用self.labels
和tf.placeholder
。我想将feed_dict
直接连接到图表。
答案 0 :(得分:1)
我自己找到了解决方案。如果其他人在将来需要帮助,请将其发布在此处。
卷积层的输出必须重新整形,保持批量大小相同。这很重要,否则完全连接的计算没有意义。
不幸的是,tf.layers.dense
here的文档在这方面非常模糊,并没有做适当的重塑。
我使用tf.contrib.layers.flatten
进行了整形,它就像一个魅力