深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expand_dim(增加输入数据的维度) 4.tf.tile(在某个维度上按照倍数进行平铺迭代) 5.tf.squeeze(去除维度上为1的维度)
1. rnn.BasicLSTMCell(num_hidden) # 构造单层的lstm网络结构
参数说明:num_hidden表示隐藏层的个数
2.tf.nn.dynamic_rnn(cell, self.x, tf.float32) # 执行lstm网络,获得state和outputs
参数说明:cell表示实例化的rnn网络,self.x表示输入层,tf.float32表示类型
3. tf.expand_dim(self.w, axis=0) 对数据增加一个维度
参数说明:self.w表示需要增加的数据维度,axis表示哪个维度进行增加
4. tf.tile(tf_expand, [num_example, 1, 1]) # 延某个方向进行平铺操作
参数说明:tf_expand表示输入的数据, [num_example, 1, 1] 表示延第一个维度进行num_example倍的平铺迭代
sess = tf.Session()
x = tf.constant([[1,2,1],[1,2,1]])
y = tf.tile(x, [2,1])
print(sess.run(y))
# 代码结果
[[1 2 1]
[1 2 1]
[1 2 1]
[1 2 1]]
5.tf.squeeze(out) # 将维度上为1的维度都进行去除, 代码中将[?, 4, 1] 变成了[?, 4]
参数说明:out为输入数据
代码说明:代码使用了类的构造方式,在初始化阶段,进行参数和输入数据的初始化,同时使用self.model() 构造输出结果y_pred即?, 4, 返回的结果,在初始化过程中,使用tf.reduce_mean(tf.square(y - self.model))计算损失值,使用梯度下降进行优化,使用self.train和self.test输入实际值, 进行模型的训练和预测
数据说明:自己构造[?, 4, 1] 的数据集,数据集的规律是前两个相加等于预测结果,预测样本的维度为[?, 4] 压缩了最后一个维度
模型说明:使用的是单层的cell = rnn.LTSMCell(hidden_num),使用tf.nn.dynamic_rnn(cell, self.x, shape=tf.float32) , 获得输出值维度为[?, 4, 10]
代码主要分为三个部分:
第一部分:主要是构造初始参数,以及self.model() 进行模型的结果输出即y_pred, 对返回值使用均分误差,并使用自适应梯度下降降低损失值,同时构造self.Saver()
第二部分:构造输入函数self.train(self, train_x, train_y) 进行模型的训练,使用self.Saver.save(sess, './model') 进行模型的参数的保存
第三部分:构造输入函数self.test(self.test_x) 进行模型的预测, 使用self.Saver.restore(sess, './model') 进行模型参数的加载
第一部分:
第一步:构造类SeriesPredictor, 使用self.input_size = input_size 将输入转换为内部使用的数
第二步:使用tf.placeholder构造x的维度为[None, seq_size, input_size], 构造y的维度为[None, seq_size], 使用tf.Variable()构造W的维度为[hidden_num, 1], 构造b的维度为[1]
第三步:构造self.model() 用于获得预测值y_pred
第一步:使用rnn.BasicLSTMCell(self.hidden_num) 构造单层的LSTM网络
第二步: 使用tf.nn.dynamic_rnn(cell, self.x, shape=tf.float32)获得outputs和states的输出值,outputs的维度为[?, 4, 10]
第三步:使用tf.shape(self.x)[0] 获得self.x的样品数目
第四步:使用tf.expand_dim增加self.w_out的维度, 再使用tf.tile(tf_expand, [num_examples, 1, 1]) 将第一个维度的大小变得和样本数目self.x的大小相等
第五步:使用tf.matmul(self.x, tf_tile) + self.b_out 获得输出值
第六步:使用tf.squeeze(out) 将out的维度从[?, 4, 1]压缩为[?, 4]
第四步:将self.model() 返回的输出值与self.y 做均分误差用于计算损失值
第五步:tf.train.Adaoptimzer().minimize(cost) # 用于进行损失值的梯度下降
第六步:使用tf.Saver() 构建每个类的存储函数
import tensorflow as tf
import numpy as np
from tensorflow.contrib import rnn class SeriesPredictor: def __init__(self, input_size, seq_size, hidden_num): self.input_size = input_size
self.seq_size = seq_size
self.hidden_num = hidden_num # 使用tf.placeholder设置x和y, 并且设置W, b
self.W_out = tf.Variable(tf.random_normal([hidden_num, 1]), name='W_out')
self.b_out = tf.Variable(tf.constant(0.1, shape=[1]), name='b_out')
self.x = tf.placeholder(tf.float32, [None, seq_size, input_size])
self.y = tf.placeholder(tf.float32, [None, seq_size]) self.cost = tf.reduce_mean(tf.square(self.model() - self.y))
self.train_op = tf.train.AdamOptimizer().minimize(self.cost) self.saver = tf.train.Saver() def model(self): cell = rnn.BasicLSTMCell(self.hidden_num)
outputs, states = tf.nn.dynamic_rnn(cell, self.x, dtype=tf.float32)
num_example = tf.shape(self.x)[0] tf_expand = tf.expand_dims(self.W_out, axis=0)
tf_tile = tf.tile(tf_expand, [num_example, 1, 1])
out = tf.matmul(outputs, tf_tile) + self.b_out
out = tf.squeeze(out) return out
第二部分:在类中构建train函数,输入train_x, train_y 进行模型的训练
第一步:构建sess, tf.get_variable_scope().reuse_variable() 进行模型的参数的复用, 模型的初始化
第二步:sess.run([train_op, cost], feed_dict=) 执行降低损失值和计算cost的操作
第三步:每循环200次,打印损失值和迭代次数i
第四步:self.saver.save(sess, './model') # 将模型参数的sess进行保存
def train(self, train_x, train_y):
# 第一步:构建sess,
with tf.Session() as sess:
# 模型参数的复用
tf.get_variable_scope().reuse_variables()
# 模型初始化
sess.run(tf.global_variables_initializer())
for i in range(1000):
# 第二步:执行降低损失值和计算cost
_, mse = sess.run([self.train_op, self.cost], feed_dict={self.x:train_x, self.y:train_y})
# 第三步:每循环200次,打印结果
if i % 200 == 0:
print(i, mse)
# 第四步:保存sess的参数
save_path = self.saver.save(sess, './model')
print('Model saved to {}'.format(save_path))
第三部分:构建test函数,输入为test_x, 加载sess参数,进行模型的预测
第一步:构建sess函数,使用tf.get_variable_scope().reuse_variable() 进行参数的复用
第二步:使用self.saver.restore(sess, './model') # 进行参数的加载
第三步:使用sess.run(self.model(), feed_dict={self.x:test_x}) 获得实际的预测值y_pred,返回预测的结果
def test(self, test_x):
# 第一步:构建sess,并进行模型参数的复用
with tf.Session() as sess:
tf.get_variable_scope().reuse_variables()
# 第二步:加载sess模型的参数
self.saver.restore(sess, './model')
# 第三步:输出模型的预测结果self.model, 返回结果
out = sess.run(self.model(), feed_dict={self.x:test_x})
return out
代码的主要调用函数
if __name__ == '__main__':
# 实例化模型,input_size表示每一次输入,seq_size表示一共有几个单元,hidden_num表示隐藏层的个数
predictor = SeriesPredictor(input_size=1, seq_size=4, hidden_num=10)
# 训练集的X
train_x = [[[1], [2], [5], [6]],
[[5], [7], [7], [8]],
[[3], [4], [5], [7]]]
# 训练集的y
train_y = [[1, 3, 7, 11],
[5, 12, 14, 15],
[3, 7, 9, 12]]
# 调用实例化函数的train进行模型训练
predictor.train(train_x, train_y)
# 测试集的x
test_x = [[[1], [2], [3], [4]], # 1, 3, 5, 7
[[4], [5], [6], [7]]]
# 测试集的y
actual_y = [[[1], [3], [5], [7]],
[[4], [9], [11], [13]]]
# 调用实例化的y进行模型的预测
pred_y = predictor.test(test_x)
# 打印输出的结果
for i, x in enumerate(test_x):
print('the input is {}'.format(x))
print('the actual y is {}'.format(actual_y[i]))
print('the pred y is {}'.format(pred_y[i]))
深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expand_dim(增加输入数据的维度) 4.tf.tile(在某个维度上按照倍数进行平铺迭代) 5.tf.squeeze(去除维度上为1的维度)的更多相关文章
- 深度学习原理与框架-递归神经网络-时间序列预测(代码) 1.csv.reader(进行csv文件的读取) 2.X.tolist(将数据转换为列表类型)
1. csv.reader(csvfile) # 进行csv文件的读取操作 参数说明:csvfile表示已经有with oepn 打开的文件 2. X.tolist() 将数据转换为列表类型 参数说明 ...
- 深度学习原理与框架-递归神经网络-RNN网络基本框架(代码?) 1.rnn.LSTMCell(生成单层LSTM) 2.rnn.DropoutWrapper(对rnn进行dropout操作) 3.tf.contrib.rnn.MultiRNNCell(堆叠多层LSTM) 4.mlstm_cell.zero_state(state初始化) 5.mlstm_cell(进行LSTM求解)
问题:LSTM的输出值output和state是否是一样的 1. rnn.LSTMCell(num_hidden, reuse=tf.get_variable_scope().reuse) # 构建 ...
- 深度学习原理与框架-Tensorboard可视化展示(代码) 1.tf.reuse_default_graph(进行结构图的重置) 2.tf.summary.FileWriter(writer实例化) 3. write.add_graph(graph的写入) 4. tf.summary.merge_all(将summary进行合并) 5.write.add_summary(将所有summary)
1. tf.reuse_default_graph() # 对graph结构图进行清除和重置操作 2.tf.summary.FileWriter(path)构造writer实例化,以便进行后续的gra ...
- 深度学习原理与框架-卷积神经网络-cifar10分类(图片分类代码) 1.数据读入 2.模型构建 3.模型参数训练
卷积神经网络:下面要说的这个网络,由下面三层所组成 卷积网络:卷积层 + 激活层relu+ 池化层max_pool组成 神经网络:线性变化 + 激活层relu 神经网络: 线性变化(获得得分值) 代码 ...
- 深度学习原理与框架-卷积神经网络基本原理 1.卷积层的前向传播 2.卷积参数共享 3. 卷积后的维度计算 4. max池化操作 5.卷积流程图 6.卷积层的反向传播 7.池化层的反向传播
卷积神经网络的应用:卷积神经网络使用卷积提取图像的特征来进行图像的分类和识别 分类 相似图像搜索 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)
1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME') # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...
- 深度学习原理与框架-Tensorflow卷积神经网络-神经网络mnist分类
使用tensorflow构造神经网络用来进行mnist数据集的分类 相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 神经网络使用的损失值为 ...
- 深度学习原理与框架-神经网络-cifar10分类(代码) 1.np.concatenate(进行数据串接) 2.np.hstack(将数据横着排列) 3.hasattr(判断.py文件的函数是否存在) 4.reshape(维度重构) 5.tanspose(维度位置变化) 6.pickle.load(f文件读入) 7.np.argmax(获得最大值索引) 8.np.maximum(阈值比较)
横1. np.concatenate(list, axis=0) 将数据进行串接,这里主要是可以将列表进行x轴获得y轴的串接 参数说明:list表示需要串接的列表,axis=0,表示从上到下进行串接 ...
- 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)
1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...
随机推荐
- 宝塔面板Windows 面板5.0 memcache安装
a 软件管理>相应的PHP版本里(php5.6)>>配置>配置修改>编辑框拉到底 ;extension=php_memcache.dll 前的“;”号去掉>保存&g ...
- ES6 用Promise对象实现的 Ajax 操作
下面是一个用Promise对象实现的 Ajax 操作的例子. const getJSON = function(url) { const promise = new Promise(function( ...
- Python pip源更改
将pip源设置为阿里源 windows 打开文件资源管理器(文件夹地址中) 地址栏上面输入 %appdata% 在这里面新建一个文件夹pip 在pip文件夹里面新建一个文件叫做 pip.ini,内容如 ...
- android用户信息保存
一.SharedPreferences key-value方式保存简单类型的数据.文件位置data/data/相应的包名/xml文件 保存 SharedPreferences preference = ...
- c语言笔记4数据的输入和输出
数据的输入和输出 知识点一 计算机的用途:数据的输入和输出. 分类: 字符:字符输入函数getchar().字符输出函数putchar(). 格式:格式输入函数scanf().格式输出函数printf ...
- Gym - 101201E:Enclosure (点到凸包的切线)
题意:给点N棵树,前K棵是已经拥有的,现在可以再拥有一棵树,问形成的最大凸包面积. 思路:先求K棵树的凸包C,然后对于后面的N-K棵树,我们先判断是否在凸包内,如果不在,我们要求两个切线. 这里分类讨 ...
- CCF-再卖菜-20180904
可以说这道题出的不错,我是用动态规划做的 ( 严谨点说应该是记忆化搜索,我是递归版本,非递归我不会啊... 题意分析: x1 x2 x3 已知 x1+x2=t1或t1+1 x1+x2+x3=t2 ...
- vue调用支付接口
html: <div class="paymentHtml" v-html="paymentHtml"></div> script: d ...
- Javascript 2.3
声明多个变量用逗号隔开 var teacher=30,stu=40; Javascript变量允许包含 美元符号 $
- uniq的坑坑
很久没有做过文本统计之类的操作了,今天有点任务弄一下,幸亏机智的我列出了全部看了一遍,发现uniq的时候还是有重复的,然后总结了一下 假如我有1.txt这个文本: 10.0.0.1 10.0.0.1 ...