如何通过 Tensorflow conv2d 提供批量图像序列
How to Feed Batched Sequences of Images through Tensorflow conv2d
这似乎是一个微不足道的问题,但我一直找不到答案。
我有批处理的形状图像序列:
[batch_size, number_of_frames, frame_height, frame_width, number_of_channels]
我想通过几个卷积层和池化层传递每一帧。但是,TensorFlow 的 conv2d
层接受形状为的 4D 输入:
[batch_size, frame_height, frame_width, number_of_channels]
我的第一次尝试是在 axis=1 上使用 tf.map_fn
,但我发现 this function does not propagate gradients.
我的第二次尝试是在第一个维度上使用 tf.unstack
,然后使用 tf.while_loop
。但是,我的 batch_size
和 number_of_frames
是动态确定的(即都是 None
),如果 num
未指定,tf.unstack
会引发 {ValueError} Cannot infer num from shape (?, ?, 30, 30, 3)
。我尝试指定 num=tf.shape(self.observations)[1]
,但这引发了 {TypeError} Expected int for argument 'num' not <tf.Tensor 'A2C/infer/strided_slice:0' shape=() dtype=int32>.
由于所有图像 (num_of_frames
) 都传递给同一个卷积模型,您可以将批次和帧堆叠在一起并进行正常卷积。只需使用 tf.resize
即可实现,如下所示:
# input with size [batch_size, frame_height, frame_width, number_of_channels
x = tf.placeholder(tf.float32,[None, None,32,32,3])
# reshape for the conv input
x_reshapped = tf.reshape(x,[-1, 32, 32, 3])
x_reshapped 输出大小将为 (50, 32, 32, 3)
# define your conv network
y = tf.layers.conv2d(x_reshapped,5,kernel_size=(3,3),padding='SAME')
#(50, 32, 32, 3)
#Get back the input shape
out = tf.reshape(x,[-1, tf.shape(x)[1], 32, 32, 3])
输出大小与输入相同:(10, 5, 32, 32, 3
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(out, {x:np.random.normal(size=(10,5,32,32,3))}).shape)
#(10, 5, 32, 32, 3)
这似乎是一个微不足道的问题,但我一直找不到答案。
我有批处理的形状图像序列:
[batch_size, number_of_frames, frame_height, frame_width, number_of_channels]
我想通过几个卷积层和池化层传递每一帧。但是,TensorFlow 的 conv2d
层接受形状为的 4D 输入:
[batch_size, frame_height, frame_width, number_of_channels]
我的第一次尝试是在 axis=1 上使用 tf.map_fn
,但我发现 this function does not propagate gradients.
我的第二次尝试是在第一个维度上使用 tf.unstack
,然后使用 tf.while_loop
。但是,我的 batch_size
和 number_of_frames
是动态确定的(即都是 None
),如果 num
未指定,tf.unstack
会引发 {ValueError} Cannot infer num from shape (?, ?, 30, 30, 3)
。我尝试指定 num=tf.shape(self.observations)[1]
,但这引发了 {TypeError} Expected int for argument 'num' not <tf.Tensor 'A2C/infer/strided_slice:0' shape=() dtype=int32>.
由于所有图像 (num_of_frames
) 都传递给同一个卷积模型,您可以将批次和帧堆叠在一起并进行正常卷积。只需使用 tf.resize
即可实现,如下所示:
# input with size [batch_size, frame_height, frame_width, number_of_channels
x = tf.placeholder(tf.float32,[None, None,32,32,3])
# reshape for the conv input
x_reshapped = tf.reshape(x,[-1, 32, 32, 3])
x_reshapped 输出大小将为 (50, 32, 32, 3)
# define your conv network
y = tf.layers.conv2d(x_reshapped,5,kernel_size=(3,3),padding='SAME')
#(50, 32, 32, 3)
#Get back the input shape
out = tf.reshape(x,[-1, tf.shape(x)[1], 32, 32, 3])
输出大小与输入相同:(10, 5, 32, 32, 3
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(out, {x:np.random.normal(size=(10,5,32,32,3))}).shape)
#(10, 5, 32, 32, 3)