[英]Incompatible shapes of TimeseriesGenerator feed and Dense layer - Keras/Tensorflow
当我将Dense
层与TimeseriesGenerator
结合使用时,我遇到了一些尺寸问题。
我的训练数据如下所示:
X = (1 000 000, 6)
y = (1 000 000, 2)
我把所有这些都放在TimeseriesGenerator
:
train_gen = TimeseriesGenerator(X, y, length=4, batch_size=32, stride=1)
我收到:
train_gen[0][0].shape
(32, 4, 6)
train_gen[0][1].shape
(32, 2)
之后我创建了一个简单的模型:
optimizer = keras.optimizers.RMSprop()
model = Sequential()
model.add(Dense(12, input_shape=(4,6), activation='tanh'))
model.add(Dense(40, activation='tanh'))
model.add(Dense(2, activation='tanh'))
model.compile(loss='mean_absolute_error', optimizer= optimizer, metrics=['mean_absolute_error', 'accuracy'])
最后一步 - 拟合数据:
mw = model.fit_generator(generator=train_gen, epochs=1, verbose=1)
现在我收到一个错误。 最后一层有一个维度问题:
InvalidArgumentError: Incompatible shapes: [32,4,2] vs. [32,2] [Op:Sub] name: loss/dense_44_loss/sub/
我假设模型想要将模型的 [32,4,2] 形输出与给定的 [32,2] 形训练数据进行比较。
我还没有找到解决办法。 我想我肯定需要TimeseriesGenerator
因为我的原始数据集有 1600 亿个样本,而且我没有足够的 RAM。 有人能帮我吗?
你的最后一层有一个维度错误,你可以简单地通过添加一个 Flatten() 层来修复它,如下所示:
import numpy as np
from keras.preprocessing.sequence import TimeseriesGenerator
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.optimizers import RMSprop
X = np.random.rand(996, 6)
y = np.random.rand(996, 2)
t_gen = TimeseriesGenerator(X, y, length=4, batch_size=32, stride=1)
optimizer = RMSprop()
model = Sequential()
model.add(Dense(12, input_shape=(4,6), activation='tanh'))
model.add(Dense(40, activation='tanh'))
model.add(Flatten())
model.add(Dense(2, activation='tanh'))
model.compile(loss='mean_absolute_error',
optimizer= optimizer,
metrics=['mean_absolute_error', 'accuracy'])
mw = model.fit_generator(generator=t_gen, epochs=1, verbose=1)
结果将是这样的:
Epoch 1/1
31/31 [==============================] - 0s 12ms/step - loss: 0.2817 - mean_absolute_error: 0.2817 - accuracy: 0.4748
你的新模型是这样的:
通常TimeseriesGenerator
用于为时间序列应用程序创建 3D 数据,然后您使用LSTM
来处理此 3D 数据。
您仍然可以通过一些技巧将TimeseriesGenerator
与Dense
层一起使用。
将TimeseriesGenerator
的length
更改为1
。
train_gen = TimeseriesGenerator(X, y, length=1, batch_size=32, stride=1)
#shapes : train_gen[0][0] : (32,1,6)
现在你的数据本质上是一个二维数据,中间维度是没有用的。 因此,只需创建一个Lambda layer
,将模型中的这个中间维度作为第一层。
import keras.backend as K
from keras.layers import Lambda
optimizer = keras.optimizers.RMSprop()
model = Sequential()
model.add(Lambda(lambda inp: K.squeeze(inp, axis=1),input_shape=(1,6)))
model.add(Dense(12, activation='tanh'))
model.add(Dense(40, activation='tanh'))
model.add(Dense(2, activation='tanh'))
model.compile(loss='mean_absolute_error', optimizer= optimizer, metrics=['mean_absolute_error', 'accuracy'])
print(model.output_shape) #(None,2)
您的模型输出形状必须与您的标签形状匹配。
mw = model.fit_generator(generator=train_gen, epochs=1, verbose=1) #runs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.