如何关闭/打开LSTM层?

时间:2019-01-21 07:02:56

标签: python keras scikit-learn lstm recurrent-neural-network

我正在寻找一种访问LSTM层的方法,以使层的添加和减少是事件驱动的。因此,当有功能触发器时,可以添加或减去图层。 例如(假设): 如果a = 2,则添加一个LSTM层;如果a = 3,则删除一个LSTM层。

这里a = 2和a = 3应该是一个python函数,该函数返回应添加或删除LSTM层的特定值。我想在图层上添加一个switch函数,以便可以基于python函数打开或关闭它。

有可能吗?

当前,我需要对所需的层进行硬编码。例如:

# Initialising the RNN 
regressor = Sequential()

# Adding the first LSTM layer and some Dropout regularization 
regressor.add(LSTM(units = 60, return_sequences = True, input_shape = 
(X_train.shape[1], X_train.shape[2])))
#regressor.add(Dropout(0.1))

# Adding the 2nd LSTM layer and some Dropout regularization 
regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.1))

我的目标是在运行时同时添加和减去这些层。 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

我找到了答案,并在其他人正在寻找解决方案的情况下发布。 这可以通过使用冻结Keras图层功能来完成。基本上,您需要将boolean可训练参数传递给图层构造函数以将其设置为不可训练。

例如:

 frozen_layer = Dense(32, trainable=False)

此外,如果要在实例化后将图层的可训练属性设置为True或False,请执行以下操作。修改可训练属性后,通过在模型上调用compile()。例如:

    x = Input(shape=(32,))
    layer = Dense(32)
    layer.trainable = False
    y = layer(x)

    frozen_model = Model(x, y)
    # the weights of layer will not be updated during training for below model
    frozen_model.compile(optimizer='rmsprop', loss='mse')

    layer.trainable = True
    trainable_model = Model(x, y)
    # the weights of the layer will be updated during training 
    # (which will also affect the above model since it uses the same layer instance)
    trainable_model.compile(optimizer='rmsprop', loss='mse')

    frozen_model.fit(data, labels)  # this does NOT update the weights of layer
    trainable_model.fit(data, labels)  # this updates the weights of layer

希望这会有所帮助!