tensorflow实现循环神经网络
包括卷积神经网络(CNN)在内的各种前馈神经网络模型, 其一次前馈过程的输出只与当前输入有关与历史输入无关.
递归神经网络(Recurrent Neural Network, RNN)充分挖掘了序列数据中的信息, 在时间序列和自然语言处理方面有着重要的应用.
递归神经网络可以展开为普通的前馈神经网络:
长短期记忆模型(Long-Short Term Memory)是RNN的常用实现. 与一般神经网络的神经元相比, LSTM神经元多了一个遗忘门.
LSTM神经元的输出除了与当前输入有关外, 还与自身记忆有关. RNN的训练算法也是基于传统BP算法增加了时间考量, 称为BPTT(Back-propagation Through Time)算法.
使用tensorflow内置rnn#
tensorflow内置了递归神经网络的实现:
from tensorflow.python.ops import rnn, rnn_cell
tensorflow目前正在快速迭代中, 上述路径可能会发生变化.在0.6.0版本中上述路径是有效的.
官方教程中已经加入了循环神经网络的部分, API可能不会发生太大变化.
Tensorflow有多种rnn神经元可供选择:
-
rnn_cell.BasicLSTMCell
-
rnn_cell.LSTMCell
-
rnn_cell.GRUCell
这里我们选用最简单的BasicLSTMCell, 需要设置神经元个数和forget_bias
参数:
self.lstm_cell = rnn_cell.BasicLSTMCell(hidden_n, forget_bias=1.0)
可以直接调用cell对象获得输出和状态:
output, state = cell(inputs, state)
使用dropout避免过拟合问题:
from tensorflow.python.ops.rnn_cell import Dropoutwrapper
cells = DropoutWrapper(lstm_cell, input_keep_prob=0.5, output_keep_prob=0.5)
使用MultiRNNCell来创建多层神经网络:
from tensorflow.python.ops.rnn_cell import MultiRNNCell
cells = MultiRNNCell([lstm_cell_1, lstm_cell_2])
不过rnn.rnn
可以替我们完成神经网络的构建工作:
outputs, states = rnn.rnn(self.lstm_cell, self.input_layer, dtype=tf.float32)
再加一个输出层进行输出:
self.prediction = tf.matmul(outputs[-1], self.weights) + self.biases
定义损失函数:
self.loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(self.prediction, self.label_layer))
使用Adam优化器进行训练:
self.trainer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(self.loss)
因为神经网络需要处理序列数据, 所以输入层略复杂:
self.input_layer = [tf.placeholder("float", [step_n, input_n]) for i in range(batch_size)]
tensorflow要求RNNCell的输入为一个列表, 列表中的每一项作为一个批次进行训练.
列表中的每一个元素代表一个序列, 每一行为序列中的一项. 这样每一项为一个形状为(序列长, 输入维数)的矩阵.
标签还是和原来一样为形如(序列长, 输出维度)的矩阵:
self.label_layer = tf.placeholder("float", [step_n, output_n])
执行训练:
self.session.run(initer)
for i in range(limit):
self.session.run(self.trainer, feed_dict={self.input_layer[0]: train_x[0], self.label_layer: train_y})
因为input_layer
为列表, 而列表不能作为字典的键.所以我们只能采用{self.input_layer[0]: train_x[0]}
这样的方式输入数据.
可以看到lable_layer
也是二维的, 并没有输入多个批次的数据. 考虑到这两点, 目前这个实现并不具备多批次处理的能力.
序列的长度通常是不同的, 而目前的实现采用的是定长输入. 这是需要解决的另一个难题.
完整源代码可以在demo.py中查看.
作者:finley
出处:https://www.cnblogs.com/Finley/p/6007850.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!