(一)循环神经网络前向传播以及简单应用

一、简介
循环神经网络主要是解决序列的问题,我们以前学习的网络都只能单独处理一个个输入,前一个输入与后一个输入毫无关系。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
二、RNN概述
相比较前面学习的卷积神经网络,循环神经网络的结构相对简单,从图中可以看出他有两个输入,前一时刻的输入用a(0)表示,当前时刻的输入用x(1)表示,通过RNN模型预测出a(1)。a(1)一方面作为下一层网络的前一时刻的输入,同时也可以输出当前时刻的预测值,下一层网络的当前时刻的输入为x(2),RNN计算公式如下:
在这里插入图片描述

三、循环神经网络结构:
在这里插入图片描述
循环神经网络可以应用在不同场景:
1、一对一:火车进站刷身份证人脸识别
2、一对多:音乐生成
3、多对一:情感分类
4、多对多:文本预测
在这里插入图片描述
四、文本预测

import tensorflow as tf
from tensorflow.python.ops.rnn import dynamic_rnn
import tensorflow.contrib as con
import numpy as np
sample = " if you want you like"
# 1、转为字典
tf.set_random_seed(999)
word2dict = list(set(sample))
# ['e', 'o', 'l', 'u', 't', 'y', 'k', ' ', 'n', 'i', 'a', 'f', 'w']

print(word2dict)
# 2、词转向量
x_data = [word2dict.index(i) for i in sample[:-1]]
x_data = np.eye(len(word2dict))[x_data].reshape(1,-1,13)
y_data = [[word2dict.index(i) for i in sample[1:]]]

# 3、定义变量
batch_size = 1
step = x_data.shape[1]
classes = len(word2dict)
hidden = 10

# 占位符
X = tf.placeholder('float',[None,step,classes])
y = tf.placeholder(tf.int64,[None,step])

# 定义基础rnncell对象
cell= tf.nn.rnn_cell.BasicRNNCell(hidden)
# 传入动态rnn模型
outputs,states = dynamic_rnn(cell,X,dtype=tf.float32)
# outputs: shape(batch_size, max_time, cell_state_size)

outputs = tf.reshape(outputs,[-1,hidden])
# outputs:[batch_size, depth]
# 全连接预测
outputs = con.layers.fully_connected(outputs,classes,activation_fn=None)
# outputs:[batch_size, classes]

outputs = tf.reshape(outputs,[batch_size,step,classes])
# logits:[batch_size, sequence_length, num_decoder_symbols]

weit = tf.ones([batch_size,step])
# 序列损失函数
cost = con.seq2seq.sequence_loss(logits=outputs,targets=y,weights=weit)

# 自适应优化器
train = tf.train.AdamOptimizer(0.1).minimize(cost)

# 预测
pre = tf.argmax(outputs,2)
# 计算准确率
auc = tf.reduce_mean(tf.cast(tf.equal(pre,y),dtype=tf.float32))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(40):
        _,cost_v,auc_v,pre_v = sess.run([train,cost,auc,pre],feed_dict={X:x_data,y:y_data})
        print(i,cost_v,auc_v)

        print(''.join([word2dict[i] for i in pre_v[0]]))
        if auc_v==1:
            break

output:
0 2.5455909 0.15
yy el n en
1 2.3846614 0.2

2 2.2341352 0.2

3 2.022535 0.4
yoyyou yoo
4 1.7700512 0.35
yoooou yoo
5 1.5073365 0.45
yoooou n you
6 1.261578 0.6
io you n you
7 1.027455 0.85
if you want you k
8 0.8086938 0.95
if you wnnt you like
9 0.6280615 1.0
if you want you like

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值