如何通过Tensorflow conv2d提供成批图像序列

如何通过Tensorflow conv2d提供成批图像序列,tensorflow,recurrent-neural-network,convolutional-neural-network,Tensorflow,Recurrent Neural Network,Convolutional Neural Network,这似乎是一个微不足道的问题,但我一直找不到答案 我已经批量处理了形状的图像序列: [批量大小、帧数、帧高、帧宽、频道数] 我想让每一帧都通过一些卷积层和池层。但是,TensorFlow的conv2d层接受形状的4D输入: [批量大小、帧高、帧宽、频道数量] 我的第一次尝试是在axis=1上使用tf.map\fn,但我发现了这一点 我的第二次尝试是在第一个维度上使用tf.unstack,然后使用tf.while\u loop。但是,我的batch\u size和num\u帧是动态确定的(即两者都是

这似乎是一个微不足道的问题,但我一直找不到答案

我已经批量处理了形状的图像序列:

[批量大小、帧数、帧高、帧宽、频道数]

我想让每一帧都通过一些卷积层和池层。但是,TensorFlow的conv2d层接受形状的4D输入:

[批量大小、帧高、帧宽、频道数量]

我的第一次尝试是在axis=1上使用
tf.map\fn
,但我发现了这一点

我的第二次尝试是在第一个维度上使用
tf.unstack
,然后使用
tf.while\u loop
。但是,我的
batch\u size
num\u帧
是动态确定的(即两者都是
None
),如果
num
未指定,则
unstack
引发
{ValueError}无法从形状(?、30、30、3)推断num。我尝试指定
num=tf.shape(self.observations)[1]
,但这会导致
{TypeError}参数'num'不需要int。

因为所有图像(
num\u of\u frames
)都传递到同一个卷积模型,所以可以将批处理和帧堆叠在一起,并进行正常的卷积。只需使用
tf.resize
即可实现,如下所示:


x重塑输出大小将
(50、32、32、3)

输出大小与输入大小相同:
(10,5,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])
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) 

是的,我的室友指出了这一点。我想这是最简单的解决办法:D
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)