首页 文章

Keras中卷积神经网络后使用LSTM时的尺寸误差

提问于
浏览
4

在keras 1.2.2中,我创建了一个具有以下维度的数据集:

X_train: (2000, 100, 32, 32, 3) 
y_train: (2000,1)

这里,2000是实例数(批量数据),100是每批中的样本数,32是图像行和列,3是通道数(RGB) .

我已经编写了这个代码,它在CNN之后应用了LSTM,但是,我得到了这个错误:

ValueError:输入0与图层lstm_layer不兼容:预期ndim = 3,发现ndim = 2

这是我的代码:

import keras
from keras.layers import Input ,Dense, Dropout, Activation, LSTM
from keras.layers import Convolution2D, MaxPooling2D, Flatten, Reshape
from keras.models import Sequential
from keras.layers.wrappers import TimeDistributed
from keras.layers.pooling import GlobalAveragePooling1D
from keras.optimizers import SGD
from keras.utils import np_utils
from keras.models import Model


import numpy as np

timesteps=100;
number_of_samples=2500;
nb_samples=number_of_samples;
frame_row=32;
frame_col=32;
channels=3;

nb_epoch=1;
batch_size=timesteps;

data= np.random.random((2500,timesteps,frame_row,frame_col,channels))
label=np.random.random((2500,timesteps,1))

X_train=data[0:2000,:]
y_train=label[0:2000]

X_test=data[2000:,:]
y_test=label[2000:,:]

#%%

model=Sequential();                          

model.add(Convolution2D(32, 3, 3, border_mode='same',
                        input_shape=X_train.shape[2:]))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))


model.add(Dense(35, input_shape=(timesteps,512), name="first_dense" ));
#model.add(Dense(1, name="test_dense"));         

model.add(LSTM(20, return_sequences=True, name="lstm_layer"));

#%%
model.add(TimeDistributed(Dense(1), name="time_distr_dense_one"))
model.add(GlobalAveragePooling1D(name="global_avg"))

#%%

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
#%%
model.fit(X_train, y_train,
          batch_size=batch_size,
          nb_epoch=nb_epoch,
          validation_data=(X_test, y_test))

2 回答

  • 3

    尝试将每个 Convolution2D(...) 交换为:

    TimeDistributed(Convolution2D(...))
    

    您需要让模型知道您的数据是顺序的,并且您希望将某个图层应用于序列中的每个元素 . 这就是 TimeDistributed 包装器的用途 .

  • 0

    你确定 fit() 是正确的使用方法吗?我会使用 train_on_batch ,因为您的训练数据已经分批分割 .

    为了更好地控制input_shape,我建议你在第一层明确定义它 . 而不是 X_train.shape[1:] ,使用 (32,32,3) 以避免任何意外 .

    这对你有帮助吗?

相关问题