Python 如何使用tf.random_裁剪的可变面片大小定义形状?
我试图从不同大小的图像中随机获得作物(大小随时间变化并存储在Python 如何使用tf.random_裁剪的可变面片大小定义形状?,python,tensorflow,Python,Tensorflow,我试图从不同大小的图像中随机获得作物(大小随时间变化并存储在变量中)。面片的大小会发生变化,并表示为张量: patch_size = tf.Variable(128) patches = [] for i in xrange(num_patches): patch = tf.random_crop(images, [batch_size, patch_size, patch_size, 3]) patches.append(patch) patches = tf.stack(patche
变量中)。面片的大小会发生变化,并表示为张量:
patch_size = tf.Variable(128)
patches = []
for i in xrange(num_patches):
patch = tf.random_crop(images, [batch_size, patch_size, patch_size, 3])
patches.append(patch)
patches = tf.stack(patches, axis=0)
patches.set_shape([num_patches, patch_size, patch_size, 3])
但是我有一个错误TypeError:int()参数必须是字符串或数字,而不是最后一行的“张量”
。我有最后一行的原因是我的代码需要指定通道的数量,否则我会得到ValueError:应该定义输入的通道维度。找到“无”。
最终,我成功地做到了这一点:
patches.set_shape([num_patches, None, None, 3])
但我有以下几句话:
net = slim.flatten(net)
logits = slim.fully_connected(net, 1, activation_fn=None)
现在由于ValueError而失败:应该定义密集输入的最后一个维度。找到“无”。
所以这仍然是一个问题。如何处理不同大小的图像裁剪?使用set\u shape
方法不允许使用张量定义形状。这是合理的,因为它不进行TensorFlow操作。它实际上在现场重新定义了张量的静态形状
由于patch\u size
是动态的,因此不应使用它来设置静态形状。相反,正如您已经了解到的,这些尺寸必须保持未定义:
patches.set_shape([num_patches, None, None, 3])
第二个问题出现是因为某些操作需要定义输入的某些维度。特别是,完全连接的层保持权重矩阵[#I,#O]
,其中#I
和#O
分别是输入和输出的大小。如果输入处没有静态形状,则无法正确初始化此矩阵。即使在压平之后,致密层也不会立即起作用(这只是使其成为#I=W*H
)。另一方面,2D卷积工作,因为权重矩阵只取决于内核大小和过滤器的数量[nf,kh,kw]
不可避免地,这种动态性是有一定代价的:您的网络模型需要以一种独立于高度和宽度维度上输入大小的方式工作。在CNN中,一种可能的方法是使用N
过滤器执行1x1卷积,然后是全局平均2D池。后者的最短实现是tf.reduce_-mean(x[1,2])
。此时,你有一个静态形状的张量[B,N]
,其中N
是静态已知的,B
只是批量大小,在典型情况下可以是None
,patch\u size
必须是一个变量吗?是的,它随时间而变化。