【问题标题】:How to init None shape for output tensor in Tensorflow custom layer?如何在 Tensorflow 自定义层中为输出张量初始化无形状?
【发布时间】:2020-09-05 04:55:02
【问题描述】:

我有自定义层:

  class ConvCustom(tf.keras.layers.Layer):
        def __init__(self, kernel):
            super(ConvCustom, self).__init__()
            self.w = tf.convert_to_tensor(kernel, dtype=tf.float32)

    def call(self, inputs):
        np_res = np.zeros((1, 24, FEATURE_MAP_HEIGHT, FEATURE_MAP_WIDTH))

        if (inputs.shape[0] == None):
            self.result = tf.convert_to_tensor(np_res, dtype=tf.float32) # TODO How to build Tensor with None shape?
            return self.result

        size = inputs.shape[0]

        np_res = np.zeros((size, 24, FEATURE_MAP_HEIGHT, FEATURE_MAP_WIDTH))

        for dim in range(0, size):
            for i in range(0,24):
                new_kernel = self.__recombinate_kernel(self.w, i)
                np_res[dim, i,:,:] = tf.math.multiply(inputs[dim, :, :], new_kernel)


        self.result = tf.convert_to_tensor(np_res, dtype=tf.float32)

        return self.result

    def __recombinate_kernel(self, kernel, i):
        k_n = np.zeros((FEATURE_MAP_HEIGHT, FEATURE_MAP_WIDTH))

        for l in range(0, 24):
            j = l

            sh_1 = j + (12 - i)
            sh_2 = j - (12 + i)

            if j < 12:
                k_n[:, j] = kernel[:, sh_1]
            else: 
                k_n[:, j] = kernel[:, sh_2]


        return k_n

inp = tf.keras.layers.Input(shape=(90,24))
conv = ConvCustom(all_medians_parall)(inp)

test_model = tf.keras.models.Model(inp, conv)

test_model.summary()

它产生输出:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_42 (InputLayer)        [(None, 90, 24)]          0         
_________________________________________________________________
conv_custom_56 (ConvCustom)     (1, 24, 90, 24)           0         
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0

自定义层得到 (None, 90, 24) 形状没有拟合,我需要输出形状也包含 None 形状:(None, 24, 90, 24) 而不是 (1, 24, 90, 24) 怎么做?我没有找到创建无形状张量的解决方案。

【问题讨论】:

    标签: tensorflow tensorflow2.0 keras-layer


    【解决方案1】:

    我认为你可以使用

    tf.shape(inputs)[0]
    

    而不是

    inputs.shape[0]
    

    处理时获取batch的实际大小,省去处理None。

    【讨论】:

    • 不幸的是,它导致了同样的结果。
    • 嘿,对不起,我忘了检查过去一周的 stackoverflow。但是,如果您仍然需要这方面的帮助,您能否通过修改更新您的代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多