Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keras CNN-LSTM:列车运行时出错_Keras_Conv Neural Network_Lstm_Recurrent Neural Network_Train Test Split - Fatal编程技术网

Keras CNN-LSTM:列车运行时出错

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

这是我第一次在这里问问题(这意味着我真的需要帮助),并为我糟糕的英语道歉。我想制作一个cnn lstm层,用于Keras中的视频分类,但我在制作y_列车时遇到了一个问题。我会在这之后描述我的问题。 我有视频数据集(1个视频有10帧),我将视频转换为图像。 首先,我将数据集拆分为xtrain、xtest、ytrain和ytest(20%测试,80%训练),并完成了这项工作

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