当前位置: 首页 > 知识库问答 >
问题:

Keras CNN-LSTM:制作y_train时出错

吴俊晤
2023-03-14

这是我第一次在这里问问题(这意味着我真的需要帮助),很抱歉我的英语不好。我想制作一个cnn lstm层,用于Keras中的视频分类,但我在制作y\U列车时遇到了一个问题。之后我会描述我的问题。我有视频数据集(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:]

X_train形状:(2280, 64, 64, 1)-

y\u列车形状:(2280,26)-

然后我必须在进入cnn-lstm过程之前重塑它们。*注意:我对x_test和y_test做同样的事情

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_train形状:(228, 10, 64, 64, 1),y_train形状:(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.

我该怎么办?我知道这个问题,但我不知道如何解决它。请帮助我。

共有1个答案

窦彦君
2023-03-14

我重新创建了一个稍微简化的情况,以再现问题。基本上,LSTM层似乎只为整个时间步序列输出一个结果,从而将输出中的维数从3降到2。如果您运行下面的程序,我已经添加了模型。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_train(目标)数据的维度以与模型保持一致,还是更改模型。我希望这有所帮助。

 类似资料:
  • 我正试图找出适合我所尝试的模型的正确语法。这是一个时间序列预测问题,我想在将时间序列输入LSTM之前,使用几个密集层来改进时间序列的表示。 下面是我正在处理的一个虚拟系列: 首先,我将拟合一个前面没有密集层的LSTM。这需要我重塑数据: 这是正确的吗? 这些教程使得单个时间序列的第一维度应该是1,然后是时间步数(1000),然后是协变量数(3)。但当我这样做时,模型就无法编译。 在这里,我编译并训

  • 问题内容: 我正在尝试为我要适应的模型找出正确的语法。这是一个时间序列预测问题,在将其输入LSTM之前,我想使用一些密集层来改善时间序列的表示形式。 这是我正在使用的虚拟系列: 首先,我将安装没有密集层的LSTM。这要求我重塑数据: 这个对吗? 这些教程使单个时间序列在第一个维度上应该具有1,然后是时间步数(1000),然后是协变量数(3)。但是,当我这样做时,模型无法编译。 在这里,我编译并训练

  • 有关 Keras LSTM 模型的更多文档 在输入/输出对上训练模型,其中输入是生成的长度为 input_len 的均匀分布随机序列, 输出是窗口长度为 tsteps 的输入的移动平均值。input_len 和 tsteps 都在 "可编辑参数" 部分中定义。 较大的 tsteps 值意味着 LSTM 需要更多的内存来确定输入输出关系。 该内存长度由 lahead 变量控制(下面有更多详细信息)。

  • 本文向大家介绍LSTM和GRU?相关面试题,主要包含被问及LSTM和GRU?时的应答技巧和注意事项,需要的朋友参考一下 lstm如何来防止梯度爆炸和梯度消失的? 针对RNN, 要解决梯度爆炸可以使用梯度裁剪的方式来进行,而对于梯度消失,由于 传统的RNN是用覆盖的的方式计算状态: ,也就是说,这有点类似于复合函数,那么根据链式求导的法则,复合函数求导:设f和g为x的可导函数,则 ,他们是一种乘积的

  • 如下面的代码所示,我发现了一个关于下面一行的错误,因为转换不正确 请让我知道如何解决这个问题。 注: 代码: 公共类MainActivity扩展AppCompatActivity{ logcat:

  • Output after 4 epochs on CPU: ~0.8146. Time per epoch on CPU (Core i7): ~150s. 在 CPU 上经过 4 个轮次后的输出:〜0.8146。 CPU(Core i7)上每个轮次的时间:〜150s。 from __future__ import print_function import numpy as np from k