高级神经网络模型与经典机器学习技术解析
立即解锁
发布时间: 2025-08-30 00:50:09 阅读量: 3 订阅数: 11 AIGC 

# 高级神经网络模型与经典机器学习技术解析
## 1. 门控循环单元(GRU)
### 1.1 GRU简介
GRU(Gated Recurrent Unit)由Cho等人提出,可以看作是简化版的LSTM,有一些独特的变化。与LSTM主要区别在于只有两个门,且没有显式状态。这些简化能加速训练和预测阶段,同时避免梯度消失问题。
### 1.2 GRU的门
- **重置门(Reset Gate)**:通常用字母 r 表示,作用类似于LSTM的遗忘门,决定保留上一输出的哪些内容及保留程度。新输出的累加贡献计算方式与遗忘门类似,通过调制历史信息的保留量,决定哪些历史信息可丢弃。
- **更新门(Update Gate)**:作用类似于LSTM的输入门,控制对新输出(及状态)有贡献的信息量。其值介于0到1之间,GRU训练时通过类似加权平均的操作混合旧输出和新累加贡献。更新门可选择每个流的哪些分量作为输出并存储供下一操作使用。
### 1.3 GRU与LSTM性能对比
GRU结构比LSTM简单,计算效率更高。许多基准测试表明,其性能与LSTM大致相当,在某些特定情况下,GRU甚至优于更复杂的LSTM单元。建议先从LSTM开始测试这两种模型,现代硬件已大幅降低计算成本,在很多情况下GRU的优势并不明显。
### 1.4 堆叠层
单个单元或层难以达到理想精度,可堆叠由不同数量单元组成的多层。每层可输出最后一个值或整个序列,前者用于连接全连接层,后者用于连接下一个循环层。Keras实现了GRU类及其NVIDIA CUDA优化版本CuDNNGRU。
## 2. Keras实现LSTM网络示例
### 2.1 数据集
使用Zuerich Monthly Sunspots数据集,包含1749年至1983年每月的太阳黑子数量。可从https://datamarket.com/data/set/22ti/zuerich-monthly-sunspot-numbers-1749-1983#!ds=22ti&display=line免费下载CSV格式数据。
### 2.2 数据处理
- **数据读取**:可使用Python的内置方法或pandas库读取数据。
```python
# 使用内置方法读取数据
import numpy as np
dataset_filename = '<YOUR_PATH>\dataset.csv'
n_samples = 2820
data = np.zeros(shape=(n_samples, ), dtype=np.float32)
with open(dataset_filename, 'r') as f:
lines = f.readlines()
for i, line in enumerate(lines):
if i == 0:
continue
if i == n_samples + 1:
break
_, value = line.split(',')
data[i-1] = float(value)
# 使用pandas读取数据
import pandas as pd
dataset_filename = '<YOUR_PATH>\dataset.csv'
df = pd.read_csv(dataset_filename, index_col=0, header=0).dropna()
data = df.values.astype(np.float32).squeeze()
```
- **数据归一化**:LSTM使用双曲正切函数,将数据归一化到 -1 到 1 区间有助于训练。使用Scikit-Learn的MinMaxScaler类进行归一化。
```python
from sklearn.preprocessing import MinMaxScaler
mmscaler = MinMaxScaler((-1.0, 1.0))
data = mmscaler.fit_transform(data.reshape(-1, 1))
```
### 2.3 数据集准备
使用2300个样本进行训练,500个样本进行验证。模型输入是15个样本的序列批次(沿时间轴移动),输出是下一个月的值。
```python
sequence_length = 15
X_ts = np.zeros(shape=(n_samples - sequence_length, sequence_length, 1), dtype=np.float32)
Y_ts = np.zeros(shape=(n_samples - sequence_length, 1), dtype=np.float32)
for i in range(0, data.shape[0] - sequence_length):
X_ts[i] = data[i:i + sequence_length]
Y_ts[i] = data[i + sequence_length]
X_ts_train = X_ts[0:2300, :]
Y_ts_train = Y_ts[0:2300]
X_ts_test = X_ts[2300:2800, :]
Y_ts_test = Y_ts[2300:2800]
```
### 2.4 模型创建与编译
创建一个简单的有状态LSTM层模型,包含4个单元,后跟一个双曲正切输出神经元。
```python
from keras.models import Sequential
from keras.layers import LSTM, Dense, Activation
from keras.optimizers import Adam
model = Sequential()
model.add(LSTM(4, stateful=True, batch_input_shape=(20, sequence_length, 1)))
model.add(Dense(1))
model.add(Activation('tanh'))
model.compile(optimizer=Adam(lr=0.001, decay=0.0001),
loss='mse',
metrics=['mse'])
```
### 2.5 模型训练
设置LSTM类的 stateful=True 参数,使Keras在每批训练后不重置状态。选择批次大小为20,训练100个周期。
```pyth
```
0
0
复制全文
相关推荐










