我有以下設定:
x,y=load_data_xy("file",[<input headers>],[<target headers>])
b_size=1024
history_length=100
data_gen = TimeseriesGenerator(x.to_numpy(), y.to_numpy(), shuffle=True,
length=history_length,
batch_size=b_size)
后來,我創建并訓練了 lstm 模型,然后,我想用模型評估原始資料。這就是我正在做的事情:
data_gen = TimeseriesGenerator(x.to_numpy(), y.to_numpy(),
length=history_length,
batch_size=b_size)
prediction_result=[]
for xg,yg in data_gen:
if len(prediction_result)==0:
ye=model.predict(xg,batch_size=b_size,verbose=0)
prediction_result =ye.tolist()
else:
ye=model.predict(xg[-1],batch_size=b_size,verbose=0)
prediction_result =ye.tolist()
prediction_result=[item for sublist in prediction_result for item in sublist]
print(x.shape)
print(len(prediction_result))
這個函式的輸出是:
(41020, 18)
40960
預測中缺少 60 個專案,這是一個我不知道它來自哪里的數字。如何獲得與輸入相對應的輸出?
更新 這是我定義模型的方式:
#NORMAL_LAYER_SIZE=
from tensorflow.keras import initializers
INNER_LAYER_SIZE=10
n_input=100
dropout_rate=1./5
model = keras.models.Sequential([
keras.layers.LSTM(
x.shape[1],
return_sequences=True,
batch_input_shape=(b_size, n_input,x.shape[1]), kernel_initializer=tf.keras.initializers.RandomUniform(),dropout=1.*dropout_rate/x.shape[1]
)
])
for i in range(2):
model.add(tf.keras.layers.BatchNormalization())
model.add(keras.layers.LSTM(INNER_LAYER_SIZE,return_sequences=True, kernel_initializer=tf.keras.initializers.RandomUniform(),dropout=1.*dropout_rate/INNER_LAYER_SIZE))
model.add(tf.keras.layers.BatchNormalization())
model.add(keras.layers.LSTM(INNER_LAYER_SIZE, kernel_initializer=tf.keras.initializers.RandomUniform(),dropout=1.*dropout_rate/INNER_LAYER_SIZE))
model.add(keras.layers.Dense(INNER_LAYER_SIZE, kernel_initializer=tf.keras.initializers.RandomUniform()))
model.add(tf.keras.layers.BatchNormalization())
model.add(keras.layers.LeakyReLU())
model.add(tf.keras.layers.Dropout(1.0*dropout_rate/INNER_LAYER_SIZE))
model.add(keras.layers.Dense(y.shape[1], kernel_initializer=tf.keras.initializers.RandomUniform()))
model.add(keras.layers.LeakyReLU())
model.compile(loss="mse", metrics=["mean_absolute_error"], optimizer=tf.keras.optimizers.SGD(
learning_rate=0.1, momentum=0.25, nesterov=True, decay=.001#/x.shape[0]
))#
last_loss=1
model.summary()
uj5u.com熱心網友回復:
似乎TimeseriesGenerator只給出了完整的批次(這里每個批次都有 1024 個專案),并丟棄了其余的。因為41020 % 1024is 60,所以缺少 60 個專案,生成器只給出40960專案。
x = np.random.random((41020, 1))
y = np.random.random((41020, 1))
b_size=1024
history_length=100
data_gen = TimeseriesGenerator(x, y, shuffle=True,
length=history_length,
batch_size=b_size)
現在獲取由 產生的批量大小TimeseriesGenerator:
data_len = [len(batch_x) for batch_x, batch_y in data_gen]
所有批次的長度為 1024,沒有最后一批大小為 60:
set(data_len)
輸出:
{1024}
所有批次的所有商品數量為:
sum(data_len)
輸出:
40960
一個解決方案是將批量大小更改為除以的數字41020,例如2051:
x = np.random.random((41020, 1))
y = np.random.random((41020, 1))
b_size=2051
history_length=100
data_gen = TimeseriesGenerator(x, y, shuffle=True,
length=history_length,
batch_size=b_size)
data_len = [len(batch_x) for batch_x, batch_y in data_gen]
sum(data_len)
輸出:
41020
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/511503.html
上一篇:如何加入兩個tf.data.Dataset張量切片?
下一篇:在JS回圈中添加多個變數
