Keras CNN-LSTM:列车运行时出错
这是我第一次在这里问问题(这意味着我真的需要帮助),并为我糟糕的英语道歉。我想制作一个cnn lstm层,用于Keras中的视频分类,但我在制作y_列车时遇到了一个问题。我会在这之后描述我的问题。 我有视频数据集(1个视频有10帧),我将视频转换为图像。 首先,我将数据集拆分为xtrain、xtest、ytrain和ytest(20%测试,80%训练),并完成了这项工作Keras CNN-LSTM:列车运行时出错,keras,conv-neural-network,lstm,recurrent-neural-network,train-test-split,Keras,Conv Neural Network,Lstm,Recurrent Neural Network,Train Test Split,这是我第一次在这里问问题(这意味着我真的需要帮助),并为我糟糕的英语道歉。我想制作一个cnn lstm层,用于Keras中的视频分类,但我在制作y_列车时遇到了一个问题。我会在这之后描述我的问题。 我有视频数据集(1个视频有10帧),我将视频转换为图像。 首先,我将数据集拆分为xtrain、xtest、ytrain和ytest(20%测试,80%训练),并完成了这项工作 X_train, X_test = img_data[:trainco], img_data[trainco:] y_trai
X_train, X_test = img_data[:trainco], img_data[trainco:]
y_train, y_test = y[:trainco], y[trainco:]
列车形状:(2280,64,64,1)->我有2280张图像,64x64高X宽,1个通道
y_列车形状:(2280,26)->26班
然后我必须在进入cnn lstm流程之前重塑它们*注意:我对x_测试和y_测试做了同样的事情
time_steps = 10 (because I have 10 frames per video)
X_train = X_train.reshape(int(X_train.shape[0] / time_steps), time_steps, X_train.shape[1], X_train.shape[2], X_train.shape[3])
y_train = y_train.reshape(int(y_train.shape[0] / time_steps), time_steps, y_train.shape[1])
X_列车形状:(228,10,64,64,1),y_列车形状:(228,10,26)
这是我的模型:
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3), strides=(2, 2), activation='relu', padding='same'), input_shape=X_train.shape[1:]))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(256, return_sequences=False, input_shape=(64, 64)))
model.add(Dense(128))
model.add(Dense(64))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])
checkpoint = ModelCheckpoint(fname, monitor='acc', verbose=1, save_best_only=True, mode='max', save_weights_only=True)
hist = model.fit(X_train, y_train, batch_size=num_batch, nb_epoch=num_epoch, verbose=1, validation_data=(X_test, y_test), callbacks=[checkpoint])
但我有一个错误说
ValueError: Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (228, 10, 26)
就像上面说的,我们希望有两个维度。我把密码改成
y_train = y_train.reshape(int(y_train.shape[0] / time_steps), y_train.shape[1])
我又犯了一个错误说
ValueError: cannot reshape array of size 59280 into shape (228,26)
然后我再次将代码更改为
y_train = y_train.reshape(y_train.shape[0], y_train.shape[1])
我还是犯了个错误
ValueError: Input arrays should have the same number of samples as target arrays. Found 228 input samples and 2280 target samples.
我该怎么办?我知道这个问题,但不知道如何解决。请帮帮我。我重新创建了一个稍微简化的版本来重现您的情况。基本上,LSTM层似乎只为整个时间步序列输出一个结果,从而将输出中的维数从3降到2。如果您运行下面的程序,我已经添加了model.summary(),它提供了体系结构的详细信息
from keras import Sequential
from keras.layers import TimeDistributed, Dense, Conv2D, MaxPooling2D, Flatten, LSTM
import numpy as np
X_train = np.random.random((228, 10, 64, 64, 1))
y_train = np.random.randint(2, size=(228, 10, 26))
num_classes = 26
# Create the model
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3), strides=(2, 2), activation='relu', padding='same'), input_shape=X_train.shape[1:]))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Flatten(),name='Flatten'))
model.add(LSTM(256, return_sequences=False, input_shape=(64, 64)))
model.add(Dense(128))
model.add(Dense(64))
model.add(Dense(num_classes, activation='softmax', name='FinalDense'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])
#
model.summary()
# hist = model.fit(X_train, y_train, epochs=1)
我相信您需要决定是要降低y_序列(目标)数据的维度以与模型保持一致,还是要更改模型。我希望这能有所帮助。谢谢你的回答。是的,我完全知道我应该把维度从3降到2。但正如我在上面的问题中所描述的,我已经降低了维度,但是还有另一个错误。我不知道如何正确地降低维度?当你降低目标的维度时,你必须保持样本数量与输入x数据相同(我认为是228)。这就是为什么会出现另一个错误。您可能需要选择当前目标的最后一个时间步长值来进行缩减。我相信类似于y_target_new=np.square(y_train[:,-1,:])或类似的东西。我希望这能帮上忙。天哪,它能工作!!非常感谢顺便说一句,你能告诉我np.squent(y_train[:,-1,:])是做什么的吗?如果我打印形状,它只打印(228,26)。再次感谢你:D