python 测量土地温度_温度预测问题

本文介绍如何使用Python处理土地温度数据,构建神经网络模型进行预测。首先,对数据进行预处理和标准化,然后创建一个数据生成器。接着,建立一个基于常识的简单基准模型,通过小型密集连接网络进行预测。最后,探讨了在循环神经网络中应用dropout进行正则化,包括GRU层的使用和双向RNN的概念。
摘要由CSDN通过智能技术生成

### 准备数据:

* 将数据预处理为神经网络可以处理的格式-向量化。

* 数据中的每个时间序列位于不同的范围(比如温度通道位于 -20 到 +30 之间,但气压大约在 1000 毫巴上下)

* 对每个时间序列分别做标准化,让它们在相似的范围内都取较小的值。

* 编写一个 Python 生成器

* 以当前的浮点数数组作为输入,并从最近的数据中生成数据批量,同时生成未来的目标温度。

* 数据集中的样本是高度冗余的(对于第*N*个样本和第*N*+1 个样本,大部分时间步都是相同的),所以显式地保存每个样本是一种浪费。相反,我们将使用原始数据即时生成样本。

*****

### 合理性检查:

* 尝试一种**基于常识**的简单**方法**。它可以**作为**合理性**检查**

* **建立**一个**基准**,更高级的机器学习模型需要打败这个基准才能表现出其**有效性**

*****

### 基于常识的、非机器学习的基准方法

尝试机器学习方法之前,建立一个基于常识的基准方法是很有用的:

**小型的密集连接网络**

~~~

model = Sequential()

model.add(layers.Flatten(input_shape=(lookback//step, float_data.shape[-1])))#首先将数据展平

model.add(layers.Dense(32, activation='relu'))#通过两个Dense层并运行

model.add(layers.Dense(1))#最后一个Dense层没有使用激活函数,这对于回归问题是很常见的

model.compile(optimizer=RMSprop(), loss='mae')#使用 MAE 作为损失

history = model.fit_generator(train_gen,

steps_per_epoch=500,

epochs=20,

validation_data=val_gen,

validation_steps=val_steps)

~~~

### 使用循环 dropout 来降低过拟合

在循环网络中使用 dropout 的正确方法:对每个时间步应该使用相同的 dropout 掩码(dropout mask,相同模式的舍弃单元),而不是让 dropout 掩码随着时间步的增加而随机变化。此外,为了对`GRU`、`LSTM`等循环层得到的表示做正则化,应该将不随时间变化的 dropout 掩码应用于层的内部循环激活(叫作**循环**dropout 掩码)。对每个时间步使用相同的 dropout 掩码,可以让网络沿着时间正确地传播其学习误差,而随时间随机变化的 dropout 掩码则会破坏这个误差信号,并且不利于学习过程。

> 参见 Yarin Gal 的博士论文“Uncertainty in deep learning”。

Keras有两个与 dropout 相关的参数:

* `dropout`它是一个浮点数,指定该层输入单元的 dropout 比率

* `recurrent_dropout`指定循环单元的 dropout 比率

* 使用 dropout 正则化的网络总是需要更长的时间才能完全收敛,所以网络训练轮次增加为原来的 2 倍

循环层堆叠:

* 增加网络容量的通常做法是增加每层单元数或增加层数

* 在 Keras 中逐个堆叠循环层,所有中间层都应该返回完整的输出序列(一个 3D 张量),而不是只返回最后一个时间步的输出。这可以通过指定`return_sequences=True`来实现

~~~

model.add(layers.GRU(32,

dropout=0.1,

recurrent_dropout=0.5,

return_sequences=True,

input_shape=(None, float_data.shape[-1])))

model.add(layers.GRU(64, activation='relu',

dropout=0.1,

recurrent_dropout=0.5))

model.add(layers.Dense(1))

~~~

**双向 RNN**(bidirectional RNN):

RNN 按时间逆序处理输入序列(更晚的时间步在前)

* [ ] 编写一个数据生成器的变体,将输入序列沿着时间维度反转(即将最后一行代码替换为`yield samples[:, ::-1, :], targets`)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值