为keras TimeDistributed图层按名称设置权重

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为keras TimeDistributed图层按名称设置权重相关的知识,希望对你有一定的参考价值。

我在Keras有一个模型如下:

data = Input(shape=input_shape)

# 512 x 640 x 3
pad1 = TimeDistributed(ZeroPadding2D(padding=(100, 100)))(data)

# 712 x 840 x 3
conv1_1 = TimeDistributed(Conv2D(8, (3,3), padding="valid", activation="relu", name="block1_conv1", data_format="channels_last"))(pad1)
conv1_2 = TimeDistributed(Conv2D(8, (3,3), padding="same", activation="relu", name="block1_conv2", data_format="channels_last"))(conv1_1)
pool1   = TimeDistributed(MaxPooling2D((2,2), strides=(2,2), padding="same", name="block1_pool", data_format="channels_last"))(conv1_2)

我希望能够将conv1_1和conv1_2的可训练权重参数设置为每个时间步长的预训练值。我可以这样做吗? Keras似乎将这些层视为具有自己的可训练参数的自己的实体,而不是具有相同共享可训练权重的Conv2D函数的集合。有没有办法改变这个?如何访问单个时间片的可训练权重并将其分配给所有时间片?

答案

你可以这样做:

data = Input(shape=input_shape)

# 512 x 640 x 3
pad1 = TimeDistributed(ZeroPadding2D(padding=(100, 100)))(data)

# 712 x 840 x 3
nd_conv1_1 = Conv2D(8, (3,3), padding="valid", activation="relu", name="block1_conv1", data_format="channels_last")
nd_conv1_2 = Conv2D(8, (3,3), padding="same", activation="relu", name="block1_conv2", data_format="channels_last")
conv1_1 = TimeDistributed(nd_conv1_1)(pad1)
conv1_2 = TimeDistributed(nd_conv1_2)(conv1_1)
pool1   = TimeDistributed(MaxPooling2D((2,2), strides=(2,2), padding="same", name="block1_pool", data_format="channels_last"))(conv1_2)

nd_conv1_1.trainable = True/False
nd_conv1_2.trainable = True/False

以上是关于为keras TimeDistributed图层按名称设置权重的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中 TimeDistributed 层的作用是啥?

TimeDistributed 与 TimeDistributedDense Keras

Keras 使用 TimeDistributed 预训练 CNN

Keras的TimeDistributed层

为啥我的 Keras LSTM 不需要 TimeDistributed?

Keras LSTM TimeDistributed,有状态