把5维张量变成4维张量进行卷积操作,再变回5维张量,类似于tf.keras.layers.TimeDistributed操作,手动操作如下:
import numpy as np
import tensorflow.compat.v1 as tf
# 定义维张量
time_step=6
input = tf.convert_to_tensor(np.random.random((4, time_step, 256, 256, 3)).astype(np.float64))
# 张量变形,5维变成4维
input = [tf.squeeze(t,axis=1) for t in tf.split(input,num_or_size_splits=time_step,axis=1)]
input = tf.concat(input,axis=0)
# 把4维张量再复原成5维张量
input_re = [tf.expand_dims(t,axis=1) for t in tf.split(input,num_or_size_splits=time_step,axis=0)]
input_re = tf.concat(input_re,axis=1)
# 验证是否相等
with tf.Session() as sess:
input,input_re = sess.run([input,input_re])
print(input_re==input)
输出:
[[[[[ True True True]
[ True True True]
[ True True True]
...
[ True True True]
[ True True True]
[ True True True]][[ True True True]
[ True True True]
[ True True True]
...
[ True True True]
[ True True True]
[ True True True]]...
结论:复原后与原来相同,说明操作成功
核心代码可整理如下:
def dim5_to_dim4(dim5_tensor,time_step):
dim4_tensor = tf.concat([tf.squeeze(t, axis=1) for t in tf.split(dim5_tensor, num_or_size_splits=time_step, axis=1)],axis=0)
return dim4_tensor
def dim4_to_dim5(dim4_tensor,time_step):
dim5_tensor = tf.concat([tf.expand_dims(t, axis=1) for t in tf.split(dim4_tensor, num_or_size_splits=time_step, axis=0)],axis=1)
return dim5_tensor