勾八头歌之RNN

2024-04-24 08:28
文章标签 rnn 八头

本文主要是介绍勾八头歌之RNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、RNN快速入门

1.学习单步的RNN:RNNCell

# -*- coding: utf-8 -*-
import tensorflow as tf# 参数 a 是 BasicRNNCell所含的神经元数, 参数 b 是 batch_size, 参数 c 是单个 input 的维数,shape = [ b , c ]
def creatRNNCell(a,b,c):# 请在此添加代码 完成本关任务# ********** Begin *********#x1=tf.placeholder(tf.float32,[b,c])cell=tf.nn.rnn_cell.BasicRNNCell(num_units=a)h0=cell.zero_state(batch_size=b,dtype=tf.float32)output,h1=cell.__call__(x1,h0)print(cell.state_size)print(h1)# ********** End **********#

2.探幽入微LSTM

# -*- coding: utf-8 -*-
import tensorflow as tf# 参数 a 是 BasicLSTMCell所含的神经元数, 参数 b 是 batch_size, 参数 c 是单个 input 的维数,shape = [ b , c ]
def creatLSTMCell(a,b,c):# 请在此添加代码 完成本关任务# ********** Begin *********#x1=tf.placeholder(tf.float32,[b,c])cell=tf.nn.rnn_cell.BasicLSTMCell(num_units=a)h0=cell.zero_state(batch_size=b,dtype=tf.float32)output,h1=cell.__call__(x1,h0)print(h1.h)print(h1.c)# ********** End **********#

3.进阶RNN:学习一次执行多步以及堆叠RNN

# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np# 参数 a 是RNN的层数, 参数 b 是每个BasicRNNCell包含的神经元数即state_size
# 参数 c 是输入序列的批量大小即batch_size,参数 d 是时间序列的步长即time_steps,参数 e 是单个输入input的维数即input_size
def MultiRNNCell_dynamic_call(a,b,c,d,e):# 用tf.nn.rnn_cell MultiRNNCell创建a层RNN,并调用tf.nn.dynamic_rnn# 请在此添加代码 完成本关任务# ********** Begin *********#cell = tf.nn.rnn_cell.MultiRNNCell([tf.nn.rnn_cell.BasicRNNCell(num_units=b) for _ in range(a)]) # a层RNNinputs = tf.placeholder(np.float32, shape=(c, d, e)) # a 是 batch_size,d 是time_steps, e 是input_sizeh0=cell.zero_state(batch_size=c,dtype=tf.float32)output, h1 = tf.nn.dynamic_rnn(cell, inputs, initial_state=h0)print(output)# ********** End **********#

二、RNN循环神经网络

1.Attention注意力机制(A  ABC  B  C  A)

2.Seq2Seq

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variabledtype = torch.FloatTensor
char_list = [c for c in 'SEPabcdefghijklmnopqrstuvwxyz']
char_dic = {n: i for i, n in enumerate(char_list)}
seq_data = [['man', 'women'], ['black', 'white'], ['king', 'queen'], ['girl', 'boy'], ['up', 'down'], ['high', 'low']]
seq_len = 8
n_hidden = 128
n_class = len(char_list)
batch_size = len(seq_data)##########Begin##########
#对数据进行编码部分
##########End##########
def make_batch(seq_data):batch_size = len(seq_data)input_batch, output_batch, target_batch = [], [], []for seq in seq_data:for i in range(2):seq[i] += 'P' * (seq_len - len(seq[i]))input = [char_dic[n] for n in seq[0]]output = [char_dic[n] for n in ('S' + seq[1])]target = [char_dic[n] for n in (seq[1] + 'E')]input_batch.append(np.eye(n_class)[input])output_batch.append(np.eye(n_class)[output])target_batch.append(target)return Variable(torch.Tensor(input_batch)), Variable(torch.Tensor(output_batch)), Variable(torch.LongTensor(target_batch))##########Begin##########
#模型类定义
input_batch, output_batch, target_batch = make_batch(seq_data)
class Seq2Seq(nn.Module):def __init__(self):super(Seq2Seq, self).__init__()self.encoder = nn.RNN(input_size=n_class, hidden_size=n_hidden)self.decoder = nn.RNN(input_size=n_class, hidden_size=n_hidden)self.fc = nn.Linear(n_hidden, n_class)def forward(self, enc_input, enc_hidden, dec_input):enc_input = enc_input.transpose(0, 1)dec_input = dec_input.transpose(0, 1)_, h_states = self.encoder(enc_input, enc_hidden)outputs, _ = self.decoder(dec_input, h_states)outputs = self.fc(outputs)return outputs
##########End##########model = Seq2Seq()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)##########Begin##########
#模型训练过程
for epoch in range(5001):hidden = Variable(torch.zeros(1, batch_size, n_hidden))optimizer.zero_grad()outputs = model(input_batch, hidden, output_batch)outputs = outputs.transpose(0, 1)loss = 0for i in range(batch_size):loss += criterion(outputs[i], target_batch[i])loss.backward()optimizer.step()
##########End####################Begin##########
#模型验证过程函数
def translated(word):input_batch, output_batch, _ = make_batch([[word, 'P' * len(word)]])hidden = Variable(torch.zeros(1, 1, n_hidden))outputs = model(input_batch, hidden, output_batch)predict = outputs.data.max(2, keepdim=True)[1]decode = [char_list[i] for i in predict]end = decode.index('P')translated = ''.join(decode[:end])print(translated)
##########End##########translated('highh')
translated('kingh')

三、RNN和LSTM

1.循环神经网络简介

import torchdef rnn(input,state,params):"""循环神经网络的前向传播:param input: 输入,形状为 [ batch_size,num_inputs ]:param state: 上一时刻循环神经网络的状态,形状为 [ batch_size,num_hiddens ]:param params: 循环神经网络的所使用的权重以及偏置:return: 输出结果和此时刻网络的状态"""W_xh,W_hh,b_h,W_hq,b_q = params"""W_xh : 输入层到隐藏层的权重W_hh : 上一时刻状态隐藏层到当前时刻的权重b_h : 隐藏层偏置W_hq : 隐藏层到输出层的权重b_q : 输出层偏置"""H = state# 输入层到隐藏层H = torch.matmul(input, W_xh) + torch.matmul(H, W_hh) + b_hH = torch.tanh(H)# 隐藏层到输出层Y = torch.matmul(H, W_hq) + b_qreturn Y,Hdef init_rnn_state(num_inputs,num_hiddens):"""循环神经网络的初始状态的初始化:param num_inputs: 输入层中神经元的个数:param num_hiddens: 隐藏层中神经元的个数:return: 循环神经网络初始状态"""init_state = torch.zeros((num_inputs,num_hiddens),dtype=torch.float32)return init_state

2.长短时记忆网络

import torchdef lstm(X,state,params):"""LSTM:param X: 输入:param state: 上一时刻的单元状态和输出:param params: LSTM 中所有的权值矩阵以及偏置:return: 当前时刻的单元状态和输出"""W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q = params"""W_xi,W_hi,b_i : 输入门中计算i的权值矩阵和偏置W_xf,W_hf,b_f : 遗忘门的权值矩阵和偏置W_xo,W_ho,b_o : 输出门的权值矩阵和偏置W_xc,W_hc,b_c : 输入门中计算c_tilde的权值矩阵和偏置W_hq,b_q : 输出层的权值矩阵和偏置"""#上一时刻的输出 H 和 单元状态 C。(H,C) = state# 遗忘门F = torch.matmul(X, W_xf) + torch.matmul(H, W_hf) + b_fF = torch.sigmoid(F)# 输入门I = torch.sigmoid(torch.matmul(X,W_xi)+torch.matmul(H,W_hi) + b_i)C_tilde = torch.tanh(torch.matmul(X, W_xc) + torch.matmul(H, W_hc) + b_c)C = F * C + I * C_tilde# 输出门O = torch.sigmoid(torch.matmul(X,W_xo)+torch.matmul(H,W_ho) + b_o)H = O * C.tanh()# 输出层Y = torch.matmul(H,W_hq) + b_qreturn Y,(H,C)

这篇关于勾八头歌之RNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931233

相关文章

RNN发展(RNN/LSTM/GRU/GNMT/transformer/RWKV)

RNN到GRU参考: https://blog.csdn.net/weixin_36378508/article/details/115101779 tRANSFORMERS参考: seq2seq到attention到transformer理解 GNMT 2016年9月 谷歌,基于神经网络的翻译系统(GNMT),并宣称GNMT在多个主要语言对的翻译中将翻译误差降低了55%-85%以上, G

白话RNN系列(七)

本文,探讨下LSTM的一些高级应用,比如双向LSTM。 前面的探讨过程中, 我们使用到的RNN或者LSTM都是单向的,即按照时间顺序排列的一维序列;而在实际应用中,双向的RNN由于考虑到更充足的上下文,往往能起到更好的效果: Bi-RNN又叫双向RNN,是采用了两个方向的RNN网络。 RNN网络擅长的是对于连续数据的处理,既然是连续的数据规律,我们不仅可以学习它的正向规律,还可以学习它的反向规

白话RNN系列(六)

上文给出了一个LSTM使用的具体例子,但其中依旧存在一些东西说的不是很清楚明白,接下来,我们会针对LSTM使用中更加细致的一些东西,做一些介绍。 本人目前使用的基本都是TensorFlow进行开发。 lstm_cell = tf.nn.rnn_cell.LSTMCell(n_hidden, forget_bias=1.0, name='basic_lstm_cell')outputs, st

白话RNN系列(五)

前文,对于LSTM的结构进行了系统的介绍,本文,通过一个MNIST_data的例子,争取能够把LSTM的基本使用来吃透。 import tensorflow as tfimport input_data# 导入 MINST 数据集# from tensorflow.examples.tutorials.mnist import input_data# one_hot=True,代表输入的

白话RNN系列(四)

本文,谈谈RNN的一个变种,也是目前使用比较广泛的神经网络LSTM,我们首先描述下LSTM的基本结构,然后给出一个具体的使用LSTM的例子,帮助大家尽快掌握LSTM的原理和基本使用方法; 这可能是一张大家熟悉地不能再熟悉的图片了。 我们可以将其与RNN的基本结构进行对比:  我们可以看到区别:RNN中,每个循环体会产生一份输出,即隐藏状态;最终输出由此隐藏状态产出,同时,隐藏状态会保

白话RNN系列(三)

紧接上文,白话RNN系列(二)。 通过generateData得到我们的样本数据之后,我们开始搭建自己的RNN: # 每个批次输入的数据,这里定义为5,即每个批次输入5个数据batch_size = 5# RNN中循环的次数,即时间序列的长度# 这里取长度为15的时间序列truncated_backprop_length = 15# 与时间序列相对应,占位符的维度为 5 * 15#

白话RNN系列(二)

紧接白话谈RNN系列(一) 上文讨论了基础的全连接神经网络,本文,我们来说说RNN。 首先,RNN相比于普通的神经网络,有什么改进? 两点比较突出:权值共享和隐层神经元节点的有序连接。 直接上图,浅显易懂: 上图,摘自深度学习(花书),左侧图和右侧图表达了相同的含义,我们以右侧图为例,并配合实例,对RNN进行透彻的分析,我尽可能以很通俗移动的方式把RNN讲明白。 从本图中,我们很清

白话RNN系列(一)

RNN,循环神经网络,全称Recurrent Neural Network。 本文,从RNN的基本原理讲起,会探讨RNN的前向传播和反向传播,并通过一些浅显易懂的小例子,展示RNN这个东东的神奇之处,尽最大可能以通俗易懂的方式,让看到本文的童鞋都能够掌握RNN。 1:RNN的基本原理 即便是RNN,也依旧脱离不了神经网络的基本架构,换句话说,我们看RNN的时候,一定要记住一句,它不过是高级一

机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研究(代码/论文)

完整的论文代码见文章末尾 以下为核心内容和部分结果 摘要 机器学习方法在电池寿命预测中的应用主要包括监督学习、无监督学习和强化学习等。监督学习方法通过构建回归模型或分类模型,直接预测电池的剩余寿命或健康状态。无监督学习方法则通过聚类分析和降维技术,识别电池数据中的潜在模式和特征。强化学习方法通过构建动态决策模型,在电池运行过程中不断优化预测策略和调整参数。上述方法不仅可以提高预测精度,还可以在

3. 循环神经网络(RNN)与长短期记忆网络(LSTM)

引言 循环神经网络(RNN)和长短期记忆网络(LSTM)是处理序列数据的关键模型,广泛应用于自然语言处理、时间序列预测、语音识别等领域。RNN通过循环结构捕捉序列中的时间依赖关系,而LSTM则通过特殊的记忆单元解决了RNN中的梯度消失问题。本篇博文将深入探讨RNN和LSTM的结构、工作原理,以及其在序列数据处理中的应用。 1. RNN的工作原理及局限性 循环神经网络(RNN)是一类用于处理序