【发布时间】:2020-04-30 09:00:15
【问题描述】:
目前,我正在尝试使用 Keras 中的温度预测示例(如 F. Chollet 的“Python 深度学习”一书的第 6.3 章中所述)。我在使用指定的生成器进行预测时遇到了一些问题。我的理解是我应该使用model.predict_generator 进行预测,但我不确定如何为该方法使用steps 参数,以及如何获取原始数据正确“形状”的预测。
理想情况下,我希望能够绘制测试集(索引 300001 直到结束)并绘制我对该测试集的预测(即具有预测值的相同长度的数组)。
示例(此处提供数据集:https://s3.amazonaws.com/keras-datasets/jena_climate_2009_2016.csv.zip)如下:
import numpy as np
# Read in data
fname = ('jena_climate_2009_2016.csv')
f = open(fname)
data = f.read()
f.close()
lines = data.split('\n')
col_names = lines[0].split(',')
col_names = [i.replace('"', "") for i in col_names]
# Normalize the data
float_data = np.array(df.iloc[:, 1:])
temp = float_data[:, 1]
mean = float_data[:200000].mean(axis=0)
float_data -= mean
std = float_data[:200000].std(axis=0)
float_data /= std
def generator(data, lookback, delay, min_index, max_index, shuffle=False, batch_size=128, step=6):
if max_index is None:
max_index = len(data) - delay - 1
i = min_index + lookback
while 1:
if shuffle:
rows = np.random.randint(
min_index + lookback, max_index, size=batch_size)
else:
if i + batch_size >= max_index:
i = min_index + lookback
rows = np.arange(i, min(i + batch_size, max_index))
i += len(rows)
samples = np.zeros((len(rows),
lookback // step,
data.shape[-1]))
targets = np.zeros((len(rows),))
for j, row in enumerate(rows):
indices = range(rows[j] - lookback, rows[j], step)
samples[j] = data[indices]
targets[j] = data[rows[j] + delay][1]
yield(samples, targets)
lookback = 720
step = 6
delay = 144
train_gen = generator(float_data, lookback=lookback, delay=delay,
min_index=0, max_index=200000, shuffle=True,
step=step, batch_size=batch_size)
val_gen = generator(float_data, lookback=lookback, delay=delay,
min_index=200001, max_index=300000, step=step,
batch_size=batch_size)
test_gen = generator(float_data, lookback=lookback, delay=delay,
min_index=300001, max_index=None, step=step,
batch_size=batch_size)
val_steps = (300000 - 200001 - lookback)
test_steps = (len(float_data) - 300001 - lookback)
from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSprop
model = Sequential()
model.add(layers.Flatten(input_shape=(lookback // step, float_data.shape[-1])))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer=RMSprop(), loss='mae')
model.fit_generator(train_gen, steps_per_epoch=500,
epochs=20, validation_data=val_gen,
validation_steps=val_steps)
在网上搜索了一番后,我尝试了一些类似于以下的技术:
pred = model.predict_generator(test_gen, steps=test_steps // batch_size)
但是,我返回的预测数组太长了,根本与我的原始数据不匹配。有人有什么建议吗?
【问题讨论】:
标签: python machine-learning keras prediction