我想得到我的自定义层的权重,但我无法通过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
1条答案
按热度按时间nxagd54h1#
我找到了这个问题发生的原因。
同时使用其它Keras层并通过
我想这两个库可能不兼容,所以我的自定义层被拆分成了几个操作层,这样权重就无法获取和更新了,我把所有的导入都改成了tensorflow.keras,现在一切都好了。