首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在keras密集层设置预先训练好的权重

在keras密集层设置预先训练好的权重
EN

Stack Overflow用户
提问于 2021-04-27 21:03:51
回答 1查看 46关注 0票数 0

我在使用Keras工作时遇到了一个可怕的问题,这是一个问题;

代码语言:javascript
运行
复制
encoder_path = "my own encoder path"
if (os.path.exists(encoder_path)):
    encoder = tf.keras.models.load_model(encoder_path, compile=False)
    # encoder.summary()
    print("Encoder model exist & loaded ...")

else:
    print("There is no file! Check " + encoder_path + ' ...')

## Making latent vector layer code ##
loc_z_mean = len(encoder.layers) - 11
loc_z_log_var = len(encoder.layers) - 10
z_mean = encoder.layers[loc_z_mean]
z_log_var = encoder.layers[loc_z_log_var]
print(z_mean.get_weights())
z_mean_weights = z_mean.get_weights()[0]
z_mean_bias = z_mean.get_weights()[1]
print(np.shape(z_mean_weights))
print(np.shape(z_mean_bias))
z_log_var_weights = z_log_var.get_weights()[0]
z_log_var_bias = z_log_var.get_weights()[1]

z_weights = z_mean_weights + np.exp(0.5 * z_log_var_weights)
z_bias = z_mean_bias + np.exp(0.5 * z_log_var_bias)
# z_weights_init = z_weights.numpy()
# z_bias_init = z_bias.numpy()
z = tf.keras.layers.Dense(16, name="latent_z").set_weights([z_weights, z_bias])
# z = tf.keras.layers.Dense(16, kernel_initializer=z_weights_init, bias_initializer=z_bias_init, name="latent_z")
# z.trainable = False # Freeze layer
print(z)

我正在试着从以前的模型中增加一个新的重量。但它在尝试的时候不起作用

代码语言:javascript
运行
复制
z = tf.keras.layers.Dense(16, name="latent_z").set_weights([z_weights, z_bias])

使用此错误;

代码语言:javascript
运行
复制
ValueError: You called `set_weights(weights)` on layer "latent_z" with a weight list of length 2, but the layer was expecting 0 weights. Provided weights: [array([[0.85919297, 0.39330506, 1.4273021 , 0.780...

我分别设置了z_weightsz_bias的大小,(16, 16)(16,)的形状,因为这些大小与第一次加载的权重完全相同,但它不起作用。

有什么解决方案吗?

提前谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2021-04-27 22:18:48

需要为具有所需input_shape的图层调用build(),然后才能设置权重

代码语言:javascript
运行
复制
z = tf.keras.layers.Dense(16, name="latent_z")
# set shape
z.build(input_shape=(100,)

# using random weights and bias for now
bias = np.random.randn(16)
weight = np.random.randn(100,16)
z.set_weights([weight, bias])

如果不调用build(),则不会定义层的权重,因为权重的形状取决于输入的形状。在上面的示例代码中,输入形状是100,因此权重形状是100,16。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67283621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档