[英]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.