等效于tf.depth_to_space

时间:2019-07-18 21:08:29

标签: python keras

我想在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

1 个答案:

答案 0 :(得分:1)

您应该使用Keras Lamda层

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()

Summary