6.3循环神经网络的高级用法
在这一节中,我们将回顾三种先进技术来提高递归神经网络的性能和泛化能力。在本节结束时,您将了解关于使用Keras的递归网络所知道的大部分内容。我们将展示一个天气预报问题的所有三个概念,在那里我们可以访问来自安装在建筑物屋顶上的传感器的数据点的时间,例如温度、气压和湿度,我们用来预测在收集最后一个数据点后24小时的温度。这是一个相当具有挑战性的问题,举例说明了在使用时间序列时遇到的许多常见困难。
我们将讨论以下技术:
1.循环dropout
2.堆叠循环层
3.双向循环层
观察耶拿数据集是一个记录温度的变化的数据集
下载地址为:
# 观察耶拿数据集
import os
data_dir = r'D:\study\Python\Deeplearning\Untitled Folder\jena_climate_2009_2016.csv'
fname = os.path.join(data_dir,'jena_climate_2009_2016.csv')
f = open(fname)
data = f.read()
f.close()
lines = data.split('\n')
header = lines[0].split(',')
lines = lines[1:]
print(header)
print(len(lines))
['"Date Time"', '"p (mbar)"', '"T (degC)"', '"Tpot (K)"', '"Tdew (degC)"', '"rh (%)"', '"VPmax (mbar)"', '"VPact (mbar)"', '"VPdef (mbar)"', '"sh (g/kg)"', '"H2OC (mmol/mol)"', '"rho (g/m**3)"', '"wv (m/s)"', '"max. wv (m/s)"', '"wd (deg)"']
420551
# 将数据转换为numpy数组,解析数据
import numpy as np
float_data = np.zeros((len(lines),len(header)-1))
for i,line in enumerate(lines):
values = [float(x) for x in line.split(',')[1:]]
float_data[i,:] = values
# 绘制温度时间序列
import matplotlib.pyplot as plt
temp = float_data[:,1]
plt.plot(range(len(temp)),temp)
# 绘制前十天的温度时间序列
plt.plot(range(1440),temp[:1440])
现在问题的确切表述如下
一个时间步长是10分钟,每steps个时间步采样一次数据,给定过去lookback个时间步之内的数据,能否预测delay个时间步之后的温度?
lookback = 720, 给定过去5天内的观测数据
steps = 6, 观测数据的采样频率是每小时一个数据点
delay = 144, 目标是未来24小时之后的数据
# 1.数据标准化
mean = float_data[:200000].mean(axis = 0)
float_data -= mean
std = float_data[:200000].std(axis = 0)
float_data /= std
生成器代码
下面是我们将使用的数据生成器。它产生一个元组(samples,targets),其中samples是输入数据的一个批量,targets是相应的目标温度阵列。
生成器参数如下:
data:浮点数据组成的原始数据,我们在上边对其进行了标准化
lookback: 输入数据应该包含过去多少个时间步
delay: 目标应该在未来多少个时间步之后
min_index 和 max_index:data数据中的索引,用于界定需要抽取那些时间步,这有助于保存一部分数据用于验证,另一部分用于测试
shuffle: 是打乱样本,还是按照顺序抽取样本
batch_size: 每个批量的样本数
step: 数据采样的周期(单位:时间步),我们将其设置为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
用这个抽象的generator函数实例化三个生成器,一个用于训练,一个用于验证,一个用于测试
训练生成器:0-200000
验证生成器:200000-300000
测试生成器:剩下的
lookback = 1440
step = 6
delay = 144
batch_size = 128
train_gen = generator(float_data,
look