在进入代码之前,先对数据进行一点描述:
具有14个特征的时间序列,但我们只关注于预测指数为2的温度。另外,给定的数据间隔为10分钟:
["Date Time","p (mbar)","T (degC)","Tpot (K)","Tdew (degC)","rh (%)","VPmax (mbar)","VPact (mbar)","VPdef (mbar)","sh (g/kg)","H2OCmmol/mol)","rho (g/m**3)","wv (m/s)","max. wv (m/s)","wd (deg)"]
接下来,作者解析文件并将其存储为numpy数组(注意:float_data
不包含时间戳:
接下来是一个规范化步骤,我在这里跳过。到目前为止还很简单。下面的步骤定义一个生成器,它生成一个元组(samples, targets)
,其中samples
是一批输入数据,targets
是相应的目标温度数组。它采用以下参数:
data:浮点数据的原始数组,我们在上面的代码片段中对其进行了规范化。
回顾:我们的输入数据应该返回多少时间步。
延迟:未来我们的目标应该是多少时间步。
min_index和max_index:数据数组中的索引,用于限定从哪个时间步进行绘制。这对于保留一段数据用于验证和另一段用于测试非常有用。
洗牌:是洗牌还是按时间顺序画。
批次大小:每批次的样本数。
步骤:我们采样数据的时间段。我们将设置为6,以便每小时绘制一个数据点。在
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 = 1440 # Basically, going back 10 days
step = 6 # Taking an hourly sample
delay = 144 # Want to forecast temperature for the next 24 hours
batch_size = 128
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)
现在,我明白代码的作用了。如果我错了,请纠正我。它将以以下格式生成输入数据:
每个批次将有128个序列,其中每个序列的长度为240个。例如:
第0批:[[0-239],[1-240],[2-241],…[127-366]]
第1批:[[128-367],。。。,。。。。]在
在这之后,作者训练了一个简单的模型:
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')
history = model.fit_generator(train_gen,
steps_per_epoch=500,
epochs=20,
validation_data=val_gen,
validation_steps=val_steps)
我的问题
首先,我不明白为什么数据以这种方式生成并输入神经网络。换句话说,为什么数据不能像下面这样?公司名称:
第0批:[[0-240],[241-479],………]
第二,在train_gen
中,为什么shuffle
参数设置为True
?这将导致数据失去时间顺序。在
数据的索引从0开始:因为序列长度是240:
当你想训练的时候shuffle被设置为True,当你想要评估的时候你把它设置为False
我想这是Francois Chollet的《深度学习Python》中的一个例子。 Look back是从中生成样本中的观测值的数量。在
步骤将定义观察顺序:
观察指标如下:
批处理数量=此类观察的数量
例如:输入数据
^{pr2}$对于以下参数:
lookback = 6 step = 2 delay = 2 batch_size = 3
输出为:
设置shuffle=True并不重要,因为观察总是从索引回溯到特定索引。在
过去10天的每小时读数用于预测24小时后的温度。因此,以这种格式生成数据[[0-240],[241-479],………]将不能提供预测(24小时+10分钟)温度的观测值
相关问题 更多 >
编程相关推荐