将CNN更改为LSTM keras tensorflow

时间:2017-09-30 04:10:16

标签: python tensorflow keras lstm rnn

我有CN​​N并希望将其更改为LSTM,但当我修改我的代码时,我收到相同的错误:ValueError:输入0与图层gru_1不兼容:预期ndim = 3,发现ndim = 4

我已经更改了ndim但没有工作。

关注我的cnn

def build_model(X,Y,nb_classes):
    nb_filters = 32  # number of convolutional filters to use
    pool_size = (2, 2)  # size of pooling area for max pooling
    kernel_size = (3, 3)  # convolution kernel size
    nb_layers = 4
    input_shape = (1, X.shape[2], X.shape[3])

    model = Sequential()
    model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
                        border_mode='valid', input_shape=input_shape))

    model.add(BatchNormalization(axis=1))
    model.add(Activation('relu'))

    for layer in range(nb_layers-1):
        model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
        model.add(BatchNormalization(axis=1))
        model.add(ELU(alpha=1.0))  
        model.add(MaxPooling2D(pool_size=pool_size))
        model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(128))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation("softmax"))
    return model

并按照我喜欢的方式来做我的LSTM

data_dim = 41
timesteps = 20
num_classes = 10

model = Sequential()

model.add(LSTM(256, return_sequences=True, input_shape=(timesteps, data_dim)))  
model.add(Dropout(0.5))

model.add(LSTM(128, return_sequences=True, input_shape=(timesteps, data_dim)))  
model.add(Dropout(0.25))

model.add(LSTM(64))  
model.add(Dropout(0.2))

model.add(Dense(num_classes, activation='softmax'))

我做错了什么? 感谢

1 个答案:

答案 0 :(得分:2)

LSTM代码很好,它执行时没有任何错误。 您看到的错误与模型本身中的张量的内部不兼容性有关,与训练数据无关,在这种情况下,您将得到“例外:输入形状无效”

错误中令人困惑的是它引用的是GRU图层,它不包含在模型定义的任何位置。如果您的模型仅包含LSTM,则应该收到一个错误,该错误会调出与其冲突的LSTM图层。

也许检查

model.get_config()

并确保所有图层和配置都符合您的意图。 特别是,第一层应该这样说:

batch_input_shape': (None, 20, 41)