为什么在Keras中将自定义层分解为多个操作?

jgzswidk  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(107)

我想得到我的自定义层的权重,但我无法通过model.layer().get_weights()[X]得到它们。因此我检查了模型的层,似乎自定义层被分解为几个操作,在这些层中找不到权重。
以下是自定义图层代码

class PixelBaseConv(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(PixelBaseConv, self).__init__(**kwargs)

    def build(self, input_shape):
        # kernel_shape: w*h*c*output_dim
        kernel_size = input_shape[1:]
        kernel_shape = (1,) + kernel_size + (self.output_dim, )
        self.kernel = self.add_weight(name='kernel', 
                                      shape=kernel_shape,
                                      initializer='uniform',
                                      trainable=True)
        super(PixelBaseConv, self).build(input_shape)

    def call(self, inputs):
        # output_shape: w*h*output_dim
        outputs = []
        inputs = K.cast(inputs, dtype="float32")
        for i in range(self.output_dim):
            #output = tf.keras.layers.Multiply()([inputs, self.kernel[..., i]])
            output = inputs*self.kernel[...,i]
            output = K.sum(output, axis=-1)
            if len(outputs) != 0:
                outputs = np.dstack([outputs, output])
            else:
                outputs = output[..., np.newaxis]
        return tf.convert_to_tensor(outputs)

    def compute_output_shape(self, input_shape):
        return input_shape + (self.output_dim, )

下面是模型结构enter image description here的一部分
我尝试了不同的方法来获得重量,但由于奇怪的层次,失败了。
预期:前五层被替换为具有可训练内核的单层。权重可通过get_weights()直接获取
我列出了前10层的重量清单长度和第1层的印刷重量,代码如下

for i in range(len(model.layers)):
    print("layer " + str(i), len(model.layers[i].get_weights()))
print(model.layers[1].get_weights()[0])

得到结果和误差enter image description here
enter image description here

nxagd54h

nxagd54h1#

我找到了这个问题发生的原因。

import tensorflow.python.keras

同时使用其它Keras层并通过

import tensorflow.keras

我想这两个库可能不兼容,所以我的自定义层被拆分成了几个操作层,这样权重就无法获取和更新了,我把所有的导入都改成了tensorflow.keras,现在一切都好了。

相关问题