【问题标题】:Why CNN-LSTM is faster than LSTM?为什么 CNN-LSTM 比 LSTM 快?
【发布时间】:2020-03-13 13:59:38
【问题描述】:

我对加速的原因感到困惑。训练和预测速度的提升是巨大的,超过 50 倍。

这就是我创建 LSTM 模型的方式:

def create_model(learning_rate, num_LSTM_layers,
                 num_LSTM_nodes, dropout_rate):


    #CREATE THE LSTM NEURAL NETWORK
    model = Sequential()
    if num_LSTM_layers > 1:
        model.add(LSTM(num_LSTM_nodes, return_sequences=True ))
    if num_LSTM_layers == 1:
        model.add(LSTM(num_LSTM_nodes, return_sequences=False))
    model.add(Activation('relu'))
    model.add(Dropout(dropout_rate))

    if num_LSTM_layers > 1:
        for i in range(num_LSTM_layers-1):
            if i+1 == num_LSTM_layers-1:
                model.add(layers.LSTM(num_LSTM_nodes, return_sequences=False))
            else:
                model.add(layers.LSTM(num_LSTM_nodes, return_sequences=True))
            model.add(Activation('relu'))
            model.add(Dropout(dropout_rate))

    model.add(Dense(1))
    model.add(Activation('linear'))


    # Use the Adam method for training the network.
    # We want to find the best learning-rate for the Adam method.
    optimizer = Adam(lr=learning_rate)

    # In Keras we need to compile the model so it can be trained.
    model.compile(loss='mean_squared_error', optimizer=optimizer)

    return model

这就是我创建 CNN-LSTM 模型的方式:

def create_model_TD(learning_rate, num_conv_layers, num_LSTM_layers,
                 num_LSTM_nodes, dropout_rate, filter_size, kernel_height, pool_size):

    #CREATE THE LSTM NEURAL NETWORK
    model = Sequential()
    model.add(TimeDistributed(Conv1D(input_shape=(None, X_train.shape[2], X_train.shape[3]) , 
                                     filters= int(filter_size), kernel_size= int(kernel_height), activation='relu', padding='causal')))
    if num_conv_layers == 2:
        model.add(TimeDistributed(Conv1D(filters=int(filter_size), kernel_size= int(kernel_height), activation='relu', padding='causal')))
    model.add(TimeDistributed(MaxPooling1D(pool_size=int(pool_size))))
    model.add(TimeDistributed(Flatten()))
    if num_LSTM_layers > 1:
        model.add(LSTM(num_LSTM_nodes, return_sequences=True))
    if num_LSTM_layers == 1:
        model.add(LSTM(num_LSTM_nodes, return_sequences=False))
    model.add(Activation('relu'))
    model.add(Dropout(dropout_rate))

    if num_LSTM_layers > 1:
        for i in range(num_LSTM_layers-1):
            if i+1 == num_LSTM_layers-1:
                model.add(LSTM(num_LSTM_nodes, return_sequences=False))
            else:
                model.add(LSTM(num_LSTM_nodes, return_sequences=True))
            model.add(Activation('relu'))
            model.add(Dropout(dropout_rate))

    model.add(Dense(1))
    model.add(Activation('linear'))


    # Use the Adam method for training the network.
    # We want to find the best learning-rate for the Adam method.
    optimizer = Adam(lr=learning_rate)

    # In Keras we need to compile the model so it can be trained.
    model.compile(loss='mean_squared_error', optimizer=optimizer)

    return model

但是当我查看可训练参数的数量时,CNN-LSTM 的参数似乎比经典 LSTM 还要多。有人知道原因吗?非常感谢您的帮助,谢谢。

【问题讨论】:

    标签: python keras time-series conv-neural-network lstm


    【解决方案1】:

    CNN 通过专注于关键特征来降低各种不同的复杂性。卷积层的使用导致张量的大小减小。此外,池化的使用导致进一步减少。最后但并非最不重要的一点是,ReLu 层降低了复杂性。因为训练时间减少了

    在 cnn 中更深入的初学者看看

    https://www.semanticscholar.org/paper/Introduction-to-Convolutional-Neural-Networks-Wu/450ca19932fcef1ca6d0442cbf52fec38fb9d1e5

    【讨论】:

      猜你喜欢
      • 2019-02-28
      • 2016-10-11
      • 2023-01-31
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多