我想在Keras模型中完成tf.depth_to_space的等效功能。具体来说,Keras模型中的数据的形状为H x W x 4(即深度4),我想对数据进行置换,以使输出的大小为H x W x 1,并在查看4个输入时进行映射通道为2x2块;即
输入位置为y,x,k
输出位置为2 * y +(k // 2),2 * x +(k%2),1
我知道我可以通过以下方法获得正确的形状
outputs = keras.layers.Reshape((H*2,W*2,1), input_shape=(H,W,4))(inputs)
但是我认为映射将是
输入位置为y,x,k
Linear_addess是y * W * 4 + x * 4 + k
输出位置为Linear_addess //(H * 2),Linear_addess%(H * 2),1
这不是我想要的
我直接尝试使用
outputs = tf.depth_to_space(inputs, 2)
但是会导致错误: TypeError:模型的输出张量必须是Keras张量。找到Tensor(“ DepthToSpace:0”,shape =(?, 1024,1024,1),dtype = float32)
这个简单的功能可以解决问题
def simple_net(H=512, W=512):
inputs = keras.layers.Input((H, W, 4))
# gets the correct shape but not the correct order
outputs = keras.layers.Reshape((H*2,W*2,1), input_shape=(H,W,4))(inputs)
# Run time error message
#outputs = tf.depth_to_space(output_planes, 2)
model = keras.models.Model(inputs, outputs)
return model
答案 0 :(得分:1)
from keras.layers import Lambda
import tensorflow as tf
Subpixel_layer = Lambda(lambda x:tf.nn.depth_to_space(x,scale))
x = Subpixel_layer(inputs=x)
最小模型
import tensorflow as tf
from keras.layers import Input,Lambda
in=Input(shape=(32,32,3))
x = Conv2D(32, (3,3), activation='relu')(in)
x = Conv2D(32, (3,3), activation='relu')(x)
sub_layer = Lambda(lambda x:tf.nn.depth_to_space(x,2))
x = sub_layer(inputs=x)
model = Model(inputs=in, outputs=x)
# model.compile(optimizer = Adam(), loss = mean_squared_error)
model.summary()