Keras/Tensorflow网络初始权重获取及自定义模型权重为空问题咨询
我正尝试获取指定网络的初始权重。
有讨论指出获取初始权重需要明确指定输入维度,另有讨论指出模型编译完成后即可获取权重。
请在模型编译完成后、训练开始前保存初始权重。
我已成功复现上述方案的运行结果,但该方案无法适配我的使用场景,我的测试代码如下:
import numpy as np from keras.models import Sequential from keras.layers import Dense import tensorflow as tf # 复现测试逻辑 # 未指定input_dim的第一个模型输出空权重列表 model = Sequential() model.add(Dense(5, weights=[np.ones((3, 5)), np.zeros(5)], activation='relu')) print(model.get_weights()) # 指定了input_dim的第二个模型可正常输出赋值的权重 model1 = Sequential() model1.add(Dense(5, weights=[np.ones((3, 5)), np.zeros(5)], input_dim=3, activation='relu')) model1.add(Dense(1, activation='sigmoid')) print(model1.get_weights()) class Test(tf.keras.Model): def __init__(self, n_inputs: int, neurons=10): super(Test, self).__init__(name="Test") self.neurons = neurons # 初始化器配置 mean, std = 0., 0.0005 bias_normalization = None kernel_initializer = tf.keras.initializers.RandomNormal(mean=mean, stddev=std) self.h1 = Dense(n_inputs, activation="linear", name="h1", kernel_initializer=kernel_initializer, bias_initializer=bias_normalization, input_dim=n_inputs) def call(self, inputs): x = self.h1(inputs) return x # 自定义模型测试 test = Test(n_inputs=1, neurons=100) test.get_weights() # 输出空,符合预期 test.compile() test.get_weights() # 输出空,不符合预期
问题原因
该现象是Keras子类模型的延迟构建机制导致的:
- Sequential、函数式API模型在指定
input_dim或Input输入层时就会确定张量形状,立刻完成权重初始化 - 子类模型的层参数形状需要等第一次接收到真实输入张量时才会确定,即便在Dense层配置了
input_dim参数、完成模型编译,也不会触发权重初始化流程,因此调用get_weights()会返回空列表。
解决方案
编译完成后手动触发模型构建即可,两种常用实现方式:
- 调用
build方法指定输入形状
test = Test(n_inputs=1, neurons=100) test.compile() # 手动指定输入形状,第一个维度为batch_size,填None代表支持可变batch test.build(input_shape=(None, 1)) print(test.get_weights()) # 此时可正常获取初始化权重
- 传入dummy输入触发构建
test = Test(n_inputs=1, neurons=100) test.compile() # 传入符合输入形状要求的空张量即可,不需要真实数据 dummy_input = tf.zeros((1,1)) test(dummy_input) print(test.get_weights()) # 此时可正常获取初始化权重
内容的提问来源于stack exchange,提问作者deckard
相关产品推荐
相关产品推荐

