簡體   English   中英

TimeseriesGenerator feed 和 Dense 層的形狀不兼容 - Keras/Tensorflow

[英]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 數據。

您仍然可以通過一些技巧將TimeseriesGeneratorDense層一起使用。

TimeseriesGeneratorlength更改為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM