《python深度学习》学习笔记与代码实现(第六章,6.3 循环神经网络的高级用法)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值