循环层 #

循环神经网络原理 #

循环神经网络(RNN)通过隐藏状态在时间步之间传递信息,适合处理序列数据。

text
┌─────────────────────────────────────────────────────────────┐
│                    RNN 结构                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  展开视图:                                                  │
│                                                             │
│       t=1      t=2      t=3                                │
│       ┌───┐    ┌───┐    ┌───┐                             │
│  x1 ──│   │───►│   │───►│   │──► h3 (输出)                │
│       │RNN│    │RNN│    │RNN│                             │
│       └───┘    └───┘    └───┘                             │
│         │        │        │                                │
│        h1       h2       h3                                │
│       (隐藏状态在每个时间步传递)                            │
│                                                             │
│  公式:                                                      │
│  h_t = tanh(W_h × h_{t-1} + W_x × x_t + b)                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

SimpleRNN 层 #

基本用法 #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 32, input_length=100),
    keras.layers.SimpleRNN(64),
    keras.layers.Dense(1, activation='sigmoid')
])

参数详解 #

python
keras.layers.SimpleRNN(
    units=64,
    activation='tanh',
    use_bias=True,
    return_sequences=False,
    return_state=False,
    go_backwards=False,
    dropout=0.0,
    recurrent_dropout=0.0
)
text
┌─────────────────────────────────────────────────────────────┐
│                    RNN 参数说明                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  units: 隐藏状态维度                                        │
│                                                             │
│  return_sequences:                                          │
│  ├── False: 只返回最后时间步的输出                         │
│  └── True: 返回所有时间步的输出                            │
│                                                             │
│  return_state: 是否返回最终状态                             │
│                                                             │
│  go_backwards: 是否反向处理序列                             │
│                                                             │
│  dropout: 输入的 dropout 比例                               │
│                                                             │
│  recurrent_dropout: 循环连接的 dropout 比例                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

返回序列 #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 32, input_length=100),
    keras.layers.SimpleRNN(64, return_sequences=True),
    keras.layers.SimpleRNN(32),
    keras.layers.Dense(1, activation='sigmoid')
])

LSTM 层 #

LSTM 通过门控机制解决长期依赖问题。

text
┌─────────────────────────────────────────────────────────────┐
│                    LSTM 结构                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│                    ┌─────────────────┐                      │
│                    │    遗忘门 f     │                      │
│                    │  决定丢弃什么   │                      │
│                    └────────┬────────┘                      │
│                             │                               │
│  ┌──────────┐    ┌──────────┴──────────┐                   │
│  │  输入门 i │    │      单元状态       │                   │
│  │ 决定存储  │───►│   C_t (长期记忆)   │                   │
│  │ 什么信息  │    └──────────┬──────────┘                   │
│  └──────────┘               │                               │
│                             │                               │
│                    ┌────────┴────────┐                      │
│                    │    输出门 o     │                      │
│                    │  决定输出什么   │                      │
│                    └─────────────────┘                      │
│                             │                               │
│                    ┌────────┴────────┐                      │
│                    │  隐藏状态 h_t   │                      │
│                    │   (短期记忆)    │                      │
│                    └─────────────────┘                      │
│                                                             │
│  门控公式:                                                  │
│  f_t = σ(W_f × [h_{t-1}, x_t] + b_f)                       │
│  i_t = σ(W_i × [h_{t-1}, x_t] + b_i)                       │
│  o_t = σ(W_o × [h_{t-1}, x_t] + b_o)                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

基本用法 #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 128, input_length=100),
    keras.layers.LSTM(64, dropout=0.2, recurrent_dropout=0.2),
    keras.layers.Dense(1, activation='sigmoid')
])

双向 LSTM #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 128, input_length=100),
    keras.layers.Bidirectional(keras.layers.LSTM(64)),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])
text
┌─────────────────────────────────────────────────────────────┐
│                    双向 LSTM                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  前向: x1 ──► x2 ──► x3 ──► h_forward                      │
│                                                             │
│  后向: x1 ◄── x2 ◄── x3 ◄── h_backward                     │
│                                                             │
│  输出: [h_forward, h_backward]                              │
│                                                             │
│  优点:                                                      │
│  ├── 同时考虑过去和未来的上下文                             │
│  └── 在 NLP 任务中效果更好                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

堆叠 LSTM #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 128, input_length=100),
    keras.layers.LSTM(64, return_sequences=True),
    keras.layers.LSTM(32),
    keras.layers.Dense(1, activation='sigmoid')
])

返回状态 #

python
import keras

inputs = keras.Input(shape=(100, 32))
lstm, state_h, state_c = keras.layers.LSTM(64, return_state=True)(inputs)

model = keras.Model(inputs, [lstm, state_h, state_c])

GRU 层 #

GRU 是 LSTM 的简化版本,参数更少。

text
┌─────────────────────────────────────────────────────────────┐
│                    GRU 结构                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  GRU 只有两个门:                                            │
│                                                             │
│  ┌──────────────┐                                          │
│  │   重置门 r   │ ──► 控制如何使用过去信息                 │
│  └──────────────┘                                          │
│                                                             │
│  ┌──────────────┐                                          │
│  │   更新门 z   │ ──► 控制新旧信息混合比例                 │
│  └──────────────┘                                          │
│                                                             │
│  公式:                                                      │
│  r_t = σ(W_r × [h_{t-1}, x_t])                             │
│  z_t = σ(W_z × [h_{t-1}, x_t])                             │
│  h̃_t = tanh(W × [r_t * h_{t-1}, x_t])                      │
│  h_t = (1 - z_t) * h_{t-1} + z_t * h̃_t                    │
│                                                             │
│  优点:                                                      │
│  ├── 参数少,训练快                                        │
│  └── 在很多任务上效果接近 LSTM                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

基本用法 #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 128, input_length=100),
    keras.layers.GRU(64, dropout=0.2, recurrent_dropout=0.2),
    keras.layers.Dense(1, activation='sigmoid')
])

双向 GRU #

python
import keras

model = keras.Sequential([
    keras.layers.Embedding(10000, 128, input_length=100),
    keras.layers.Bidirectional(keras.layers.GRU(64)),
    keras.layers.Dense(1, activation='sigmoid')
])

ConvLSTM2D 层 #

ConvLSTM 结合了卷积和 LSTM,用于处理视频数据。

python
import keras

model = keras.Sequential([
    keras.layers.ConvLSTM2D(
        filters=32,
        kernel_size=3,
        padding='same',
        return_sequences=False,
        input_shape=(10, 64, 64, 1)
    ),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(1, 3, padding='same', activation='sigmoid')
])

时间序列预测示例 #

python
import keras
import numpy as np

def create_dataset(data, look_back=10):
    X, y = [], []
    for i in range(len(data) - look_back):
        X.append(data[i:i+look_back])
        y.append(data[i+look_back])
    return np.array(X), np.array(y)

data = np.sin(np.arange(0, 100, 0.1))
X, y = create_dataset(data, look_back=20)

X = X.reshape(X.shape[0], X.shape[1], 1)

model = keras.Sequential([
    keras.layers.LSTM(50, activation='relu', input_shape=(20, 1)),
    keras.layers.Dense(1)
])

model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=50, batch_size=32, validation_split=0.2)

文本分类示例 #

python
import keras

max_features = 10000
maxlen = 200

(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=max_features)
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)

model = keras.Sequential([
    keras.layers.Embedding(max_features, 128, input_length=maxlen),
    keras.layers.Bidirectional(keras.layers.LSTM(64, return_sequences=True)),
    keras.layers.Bidirectional(keras.layers.LSTM(32)),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

history = model.fit(
    x_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.2
)

下一步 #

现在你已经掌握了循环层,接下来学习 正则化层,防止模型过拟合!

最后更新:2026-04-04