Python CNN LSTM(值误差步幅的长度应为 1、1 或 3,但为 2)



我一直在尝试在mnist数据集上训练一个convlstm模型,以拓宽我在模型开发方面的知识。我无法逃脱标题中包含的错误。任何帮助或提示不胜感激!

我知道步幅的默认值是 (1,1(,但不确定如何设置 2。

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM, CuDNNLSTM, TimeDistributed, Reshape
from keras.utils import to_categorical
from keras.layers.convolutional import Conv2D, Conv3D
from keras.layers.pooling import MaxPooling2D, MaxPool3D
from keras.layers.core import Flatten
def prep_pixels(train, test):
# convert from integers to floats
train_norm = train.astype('float32')
test_norm = test.astype('float32')
# normalize to range 0-1
train_norm = train_norm / 255.0
test_norm = test_norm / 255.0
# return normalized images
return train_norm, test_norm
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
x_train, x_test = prep_pixels(x_train, x_test)
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))))
model.add(TimeDistributed((MaxPooling2D((2, 2)))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(32, activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=1, validation_data=(x_test, y_test))

错误

model.fit(x_train, y_train, epochs=1, validation_data=(x_test, y_test((

步幅 = _get_sequence(步幅、n、channel_index、"步幅"(

值错误:步幅的长度应为 1、1 或 3,但为 2

您似乎还没有为 ConvLSTM 创建窗口数据集。因此,您可能需要在调用model.fit之前执行此操作

d_train = tf.keras.preprocessing.sequence.TimeseriesGenerator(x_train, y_train, length=5, batch_size=64) # window size = 5
d_test = tf.keras.preprocessing.sequence.TimeseriesGenerator(x_test, y_test, length=5)
model.fit(d_train, epochs=1, validation_data=d_test)

为了与损失函数保持一致,您需要禁用返回序列(或添加另一个不返回序列的层(。

model.add(tf.keras.layers.LSTM(32, activation='relu', return_sequences=False))

最新更新