【问题标题】:Dimension Error while using LSTM after Convolutional neural network in Keras在 Keras 卷积神经网络后使用 LSTM 时出现维度错误
【发布时间】:2017-02-26 09:07:52
【问题描述】:

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

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

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

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

ValueError: Input 0 is in compatible with layer lstm_layer: expected ndim=3, found 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))

【问题讨论】:

  • 请把LSTM的错误贴出来:)
  • ValueError: Input 0 is in compatible with layer lstm_layer: expected ndim=3, found ndim=2

标签: machine-learning neural-network keras lstm recurrent-neural-network


【解决方案1】:

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

TimeDistributed(Convolution2D(...))

您需要让您的模型知道您的数据是连续的,并且您希望对序列中的每个元素应用一些层。这就是 TimeDistributed 包装器的用途。

【讨论】:

    【解决方案2】:

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

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

    这对你有帮助吗?

    【讨论】:

    • 因为train_on_batch 只对一个批次应用梯度更新,我是否应该循环并为所有批次调用train_on_batch
    • 确实,如果您已经按批次拆分了数据,您应该遍历它们并逐个提供它们:) 否则,fit() 方法可以自动将您的数据拆分为批次。因此,您可以在一个数组 (200000,32,32,3) 中提供所有 200000 张图像,并将 batch_size 指定为 100,它将重新创建您的 (2000,100,32,32,3) 数组。如果您希望在每个时期创建批次之前对样本进行洗牌,请不要忘记将“洗牌”参数指定为 True 或 False。
    • 您是如何准备数据集的?你用过 imagedatagenerator 吗?
    【解决方案3】:

    LSTM 的输出维度应与您的时间步长相同。 试试这个:

    model.add(LSTM(output_dim=timesteps, return_sequences=True))
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2017-08-06
      • 2018-01-24
      • 1970-01-01
      • 2020-07-10
      • 2019-08-06
      相关资源
      最近更新 更多