我有 tf.RandomShuffleQueue
调用data_queue定义如下:
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.labels
的tf.rank
时,我得到以下内容:
标签张量(“Rank:0”,shape =(),dtype = float32)图像张量(“Rank_1:0”,shape =(),dtype = int32)
它是什么原因?
NOTE 我不想使用 tf.placeholder
和 feed_dict
. 我想将 self.data_queue
直接连接到图表 .
1 回答
我自己找到了解决方案 . 如果其他人在将来需要帮助,请将其发布在此处 .
卷积层的输出必须重新整形,保持批量大小相同 . 这很重要,否则完全连接的计算没有意义 . 不幸的是,
tf.layers.dense
here的文档在这方面非常模糊,并没有做适当的重塑 .我使用
tf.contrib.layers.flatten
进行了重塑,它就像一个魅力