【问题标题】:KERAS: Pretraining of a CNN model and after use it for a CNN-LSTM modelKERAS:CNN 模型的预训练,然后将其用于 CNN-LSTM 模型
【发布时间】:2020-07-22 23:20:12
【问题描述】:

我有这个 cnn 模型:

model = Sequential()
model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(n_rows,n_cols,1)))
model.add(Convolution2D(32, (3, 3), activation='relu'))
model.add(AveragePooling2D(pool_size=(1,3)))
#...
model.add(Flatten())

model.add(Dense(1024, activation='relu')) #needed?
model.add(Dense(3)) #default linear activation

然后训练它

在我想使用这个 CNN 的权重之后,在 CNN-LSTM 模型中使用它们。

所以我有这样的事情:

#Load from previous CNN (pre-trained!) (up to Flatten()) and use TimeDistributed on them
model.add(LSTM(1024, activation='relu', return_sequences=True))
model.add(LSTM(1024, activation='relu'))
model.add(Dense(3))

这有意义吗?怎么可能做到呢? 非常感谢!

【问题讨论】:

    标签: tensorflow keras lstm conv-neural-network


    【解决方案1】:

    你可以这样做。但是,为了成功实现这个新模型,您需要使用 Functional API (https://www.tensorflow.org/guide/keras/functional) 来实现。

    下面我将举例说明如何向预训练模型添加新层。

    # Initialize the base model
    # Say that this is the cnn model which is pretrained
    base_model = cnn_model(input_shape=(n_rows, n_cols, 1))
    base_model.trainable = False
    
    # Adding the first lstm layer
    x = tf.keras.layers.LSTM(1024,activation='relu',return_sequences='True')(base_model.output)
    
    # Adding the second lstm layer
    x = tf.keras.layers.LSTM(1024, activation='relu',return_sequences='False')(x)
    
    # Adding the output
    output = tf.keras.layers.Dense(3,activation='linear')(x)
    
    # Final model creation
    model = Model(inputs=[base_model.input], outputs=[output])
    

    【讨论】:

    • 感谢您的回答。我的疑惑:1.在flatten()之后的CNN模型中,放什么比较好? (1、2、3 密集层?) 2. 怎么说请停止 CNN 权重到 flatten()? 3.如何添加TimeDistributed并使用它们?谢谢!
    • 你可以只放一个密集层。请针对所有其他问题提出单独的问题,因为最初的问题已得到解答;这就是堆栈溢出的工作原理。也请接受并赞成提供的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多