Yukyukuon / blog

博客的文章
1 stars 0 forks source link

Deep Learning with Python 7 #34

Open Yukyukuon opened 3 months ago

Yukyukuon commented 3 months ago

第六章第二节 循环神经网络(Recurrent neural networks)

循环神经网络(RNN,recurrent neural network):它处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息。实际上,RNN 是一类具有内部环的神经网络。在处理两个不同的独立序列(比如两条不同的IMDB 评论)之间,RNN 状态会被重置,因此,你仍可以将一个序列看作单个数据点,即网络的单个输入。真正改变的是,数据点不再是在单个步骤中进行处理,相反,网络内部会对序列元素进行遍历。

SimpleRNN

RNN结构

参数计算

需要计算的:

import numpy as np
timesteps = 100  # 输入序列的时间步数
input_features = 32  # 输入特征空间的维度
output_features = 64  # 输出特征空间的维度
inputs = np.random.random((timesteps, input_features))

#初始状态:全零向量
state_t = np.zeros((output_features,))

#如上要估计的三个参数,创建随机的权重矩阵
W = np.random.random((output_features, input_features))
U = np.random.random((output_features, output_features))
b = np.random.random((output_features,))

successive_outputs = []
#input_t 是形状为(input_features,) 的向量
for input_t in inputs:
# 由输入和当前状态(前一个输出)计算得到当前输出
output_t = np.tanh(np.dot(W, input_t) + np.dot(U, state_t) + b) 
successive_outputs.append(output_t)
state_t = output_t  # 更新网络的状态,用于下一个时间步
# 最终输出是一个形状为(timesteps,output_features) 的二维张量
final_output_sequence = np.stack(successive_outputs, axis=0)

LSTM (long short-term memory)

SimpleRNN 通常过于简化,会有梯度消失问题(vanishing gradient problem),这一效应类似于在层数较多的非循环网络(即前馈网络)中观察到的效应:随着层数的增加,网络最终变得无法训练。 LSTM结构

参数计算

输出

备注

Keras 中的LSTM 层

from keras.layers import LSTM

model = Sequential()
model.add(Embedding(max_features, 32))
model.add(LSTM(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['acc'])
history = model.fit(input_train, y_train,
                    epochs=10, 
                    batch_size=128, 
                    validation_split=0.2)

GRU(Gated recurrent unit)

GRU结构

参数计算

输出

heyisvivian commented 3 months ago

🎉