Tensorflow:何时使用tf.expand_dims?
Tensorflow教程包括使用Tensorflow:何时使用tf.expand_dims?,tensorflow,Tensorflow,Tensorflow教程包括使用tf.expand_dims向tensor添加“批量维度”。我已经阅读了这个函数的文档,但它对我来说仍然是相当神秘的。有人确切地知道在什么情况下必须使用这个吗 我的代码如下。我的目的是根据预测和实际垃圾箱之间的距离来计算损失。(例如,如果predictedBin=10和truthBin=7则bindinstanceloss=3) 在这种情况下,是否需要将tf.expand_dims应用到predictedBin和bindinstanceloss?提前感谢。扩展di
tf.expand_dims
向tensor添加“批量维度”。我已经阅读了这个函数的文档,但它对我来说仍然是相当神秘的。有人确切地知道在什么情况下必须使用这个吗
我的代码如下。我的目的是根据预测和实际垃圾箱之间的距离来计算损失。(例如,如果predictedBin=10
和truthBin=7
则bindinstanceloss=3
)
在这种情况下,是否需要将
tf.expand_dims
应用到predictedBin
和bindinstanceloss
?提前感谢。扩展dims
不会在张量中添加或减少元素,它只是通过向维度添加1
来更改形状。例如,包含10个元素的向量可以被视为10x1矩阵
我在使用expand_dims时遇到的情况是,我试图构建一个ConvNet来对灰度图像进行分类。灰度图像将作为大小矩阵加载[320320]
。但是,tf.nn.conv2d
要求输入为[批次,在\u高度,在\u宽度,在\u通道中]
,其中我的数据中缺少在本例中应为1
。因此,我使用了expand_dims
来添加一个维度
在你的情况下,我不认为你需要扩展_dims
来添加到大同的答案中,你可能需要同时扩展多个维度。例如,如果要对秩1的向量执行TensorFlow的conv1d
操作,则需要为它们提供秩3
多次执行expand_dims
是可读的,但可能会给计算图带来一些开销。通过重塑
,您可以在一行程序中获得相同的功能:
将tensorflow导入为tf
#有一些秩1的张量,它可能是音频信号,一个词向量。。。
张量=tf.one(100)
打印(张量.get_-shape())#=>(100,)
#扩展其维度以适合conv2d
张量扩展=tf.expand\u dims(张量,0)
张量扩展=tf.expand\u dims(张量扩展,0)
张量扩展=tf.expand\u dims(张量扩展,-1)
打印(张量展开。获取形状())#=>(1,1100,1)
#使用“重塑”在一行中执行相同操作
tensor_整形=tf.整形(tensor[1,1,tensor.get_shape().as_list()[0,1]))
打印(张量重塑。获取形状())#=>(1,1100,1)
注意:如果出现错误TypeError:无法将类型的对象转换为张量。
,请尝试传递tf.shape(x)[0]
,而不是按照建议传递x.get\u shape()[0]
希望有帮助
干杯,
Andres您是否运行过任何测试,以查看执行一次重塑
是否比执行两次或三次展开
更快?不太可能!我查看了一下,但无法理解gen_array_ops在哪里,所以我不能说太多。。。我肯定有兴趣看一些测试,我在这个答案中真正喜欢的是能够使用张量定义的形状,而不仅仅是一个整数。这确实解决了我的问题,我需要在tf.reforme中指定一个维度为None,另一个维度由当前输入(批量大小不同)加上已经预定义的维度指定。重塑中的tf.shape(x)[0]挽救了这一天:)非常感谢(即使我没有问这个问题)!很高兴它有帮助!是的,声明式语法有它的怪癖:)。如果你想有一个更迫切,直接的味道,但你确实需要坚持的TF你可能想看看最近添加的。还有其他选择,尤其是PyTorch。我最近做过,如果你愿意,请随意看一看并提供反馈。干杯
batch_size = tf.size(truthValues_placeholder)
labels = tf.expand_dims(truthValues_placeholder, 1)
predictedBin = tf.argmax(logits)
binDistanceLoss = tf.abs(tf.sub(labels, logits))