爱吧机器人网 » 技术 > 神经网络 > 正文

TensorFlow的使用之实现神经网络

利用TensorFlow的playground网站可以直观的查看一个神经网络的工作模式,样本数据集通过学习速率训练后,对结果逐步收敛,而后通过测试集以直观的方式展现学习成果,本文讲解神经网络的实现原理与演示;
算法概述TensorFlow提供了一个网站:https://playground.tensorflow.org展现简单神经网络算法的实现原理,我对各个参数和需要理解的地方做了详细标注:


实现一个神经网络算法的步骤如下:

提取问题中的特性集,比如判断零件是否合格可以根据零件的质量和长度来决定,判断一个地区电力的负荷情况可以根据温度,电价,季节等来决定,特征集越多可能对结果越准确;
定义神经网络的“深度”和结构,如何通过输入(特性向量,其实就是一个矩阵,关于矩阵的定义点击查看前一篇文章)得到输出;
根据经验,对相关参数进行调整,比如迭代轮数,学习率等;
通过训练好的神经网络预测未知数据;
注:文章的代码在Win10+VS Code+tesorflow 1.8中运行通过;


前向传播算法与代码演示神经网络通过输入的特性向量经过层层推导到最后输出,并通过输出解决分类和回归问题,那么神经网络的输出怎么得到的呢?就是通过前向传播算法;
比如根据本文的截图定义的神经网络,零件是否合格通过长度和质量决定,比如以[0.7,0.9]作为输入,即长度定义为0.7,质量为0.9(来自样本数据),那么神经网络的第一层的第一个神经元我们定义为a1的值就为0.7w1+0.9w2,其中w1,w2为特征向量连接到该神经元边上的权限值,一般通过tensorflow的随机数得到,第2,3个神经元的值可以按此获取,得到a1,a2,a3三个神经元的值后,再根据这三个神经元连接到输出边上的权重就可以得到输出值,整个过程就是矩阵的乘法运算,如下:

OUTPUT = [0.7,0.9]*[[w1,w2,w3],[w11,w22,w33]]*[w1(2)+w2(2)+w3(2)]

以上过程就是矩阵的1*2矩阵乘上2*3矩阵乘上3*1矩阵,结果就是1*1的结果值,表示零件是否合格;

这个算法编写成tensorflow的代码如下(代码1):

1'''
2神经网络 - 前向传播算法
3'''
4import tensorflow as tf
5w1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1))
6w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1))
7
8# 假设零件的长度和质量
9x = tf.constant([[0.7,0.9]])
10
11# 前向传播算法,计算第一层a1,a2,a3的值
12a = tf.matmul(x,w1)
13# 第一层输出后与边上权重运算得出零件的结果值
14y = tf.matmul(a,w2)
15
16with tf.Session() as sess:
17    # 利用initializer给变量赋值
18    sess.run(w1.initializer)
19    sess.run(w2.initializer)
20    print(sess.run(y))
21    #另一种写法:也可以使用tf.global_variables_initializer一次性对多个变量赋值
22    #init_op = tf.global_variables_initializer()
23    #sess.run(init_op)
24    #print(sess.run(y))

模型训练

在对模型训练时,一般有一批已经定义好的样本数据,即一批零件长度和质量告知零件是否合格的训练样本,而后可以根据监督学习的方式设置神经网络参数训练数据集,使得已知的样本集尽可能满足答案,而后模型就可以提供预测未知数据的能力;

在神经网络优化算法中,最常用的是反向传播算法,我们可将样本数据通过如下步骤迭代学习:


反向传播算法是一个迭代过程,根据已知的如零件的[0.7.0.9]特征向量可以得出他的输出结果是:3.957578,但[0.7,0.9]如果是已知样本数据,结果是已知的,反向传播算法通过优化更新变量,让预测结果与真实答案尽可能接近。

将代码1稍微改造下,让其接收一组数据(N*2矩阵)得出输出值(N*1矩阵),而后定义一个损失函数刻画预测值与实际答案的差距,而后通过反向传播算法调整神经网络参数使得这个差距可以被缩小,以上步骤通过tensorflow编写的python代码如下:

1import tensorflow as tf
2from numpy.random import RandomState
3
4#定义训练数据batch大小,即一次拿出多少个参与训练
5batch_size = 8
6
7w1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1))
8w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1))
9
10# 在默认图的一个维度上使用None可以方便使用不同batch_size大小,在训练时需要把数据分成比较小的batch,但在测试时
11# 可一次性载入全部数据,因为数据集大时,将大量数据放入一个batch可能会导致内存溢出
12x = tf.placeholder(tf.float32,shape=(None,2),name="x-input")
13y_ = tf.placeholder(tf.float32,shape=(None,1),name="y-input")
14
15# 前向传播算法,计算第一层a1,a2,a3的值
16a = tf.matmul(x,w1)
17# 第一层输出后与边上权重运算得出零件的结果值
18y = tf.matmul(a,w2)
19
20# 使用sigmoid函数将y转换为0-1的数值,转换后y代表正样本的概率,1-y代表预测是负样本的概率
21y = tf.sigmoid(y)
22cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))
23+ (1-y)*tf.log(tf.clip_by_value(1-y,1e-10,1.0)))
24#定义学习率
25leaning_rate = 0.001
26#定义反向传播算法来优化神经网络参数
27train_step = tf.train.AdamOptimizer(leaning_rate).minimize(cross_entropy)
28#通过随机数生成一个模拟数据集
29rdm = RandomState(1)
30dataset_size=128
31X = rdm.rand(dataset_size,2)
32#定义规则给出样本标签,x1+x2<1被认为零件合格
33Y = [[int(x1+x2<1)] for (x1,x2) in X]
34
35with tf.Session() as sess:
36    init_op = tf.global_variables_initializer()
37    sess.run(init_op)
38
39    print(sess.run(w1))
40    print(sess.run(w2))
41
42    # 定义迭代数
43    STEP = 5000
44    for i in range(STEP):
45      start = (i*batch_size)%dataset_size
46      end = min(start+batch_size,dataset_size)
47
48      sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
49      if(i%1000==0):
50        total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
51        print("After %d training steps,交叉嫡为:%g"%(i,total_cross_entropy))
52    print(sess.run(w1))
53    print(sess.run(w2))

从以上代码运行结果可以看到,初始给出的神经网络的权限w1和w2为:


通过反向传播算法优化迭代5000次后,交叉嫡越来越小,最终w1,w2的输出矩阵为:


交叉嫡变小的过程为:


以上程序实现了训练神经网络全过程,步骤如下:

定义神经网络结构和前向传播输出结果;
定义损失函数以及选择反向传播优化算法;
生成灰化并在样本数据上反复运行反向传播算法优化权重;


上一篇:详解|从脑波到机器人运动 使用深度神经网络对大脑活动进行解码
下一篇:从检查过拟合到数据增强 一文简述提升神经网络性能方法
精选推荐
揭秘达芬奇手术机器人
揭秘达芬奇手术机器人

[2018-04-19]  达芬奇手术系统是由美国Intuitive Surgical公司制造的机器人手术系统。美国食品和药物管理局(FDA)于2000年通过该标准,旨在利用微创手段 ...

机器人工程师具体都做什么?
机器人工程师具体都做什么?

[2017-12-08]  机器人工程师是幕后设计师,负责创建机器人和机器人系统,能够执行人类无法完成或不愿意完成的任务。 通过他们的创造,机器人工程师帮助工作更安全,更轻松,更高效,特别是......

麻省理工学院最新研究:优化软体机器人的控制和设计
麻省理工学院最新研究:优化软体机器人的控制和设计

[2019-11-24]  软体机器人属于一个新的领域,它可能在诸如外科手术等领域发挥重要作用(手术时的纳米机器人需要在人体内部移动而不损伤软组织)。软体机器 ...

科学家从蟑螂获得启发 教机器人更好地走路
科学家从蟑螂获得启发 教机器人更好地走路

[2017-12-11]  Weihmann指出:“我特别感到惊讶的是,动物运动稳定机制的变化与腿部协调的变化是一致的。昆虫的慢运行非常稳定,因为它的重心很低,三条腿总是以协调的方式运动。...

集群机器人领域最新研究:一种用于探测未知环境的微型无人机群
集群机器人领域最新研究:一种用于探测未知环境的微型无人机群

[2019-10-26]  (图:无人机扩散至不同方向来探索环境。当一个无人机注意到另一个无人机在它的首选方向,它将试图飞到另一个方向。若首选方向冲突,低优先 ...

什么是机器人学?机器人学简介
什么是机器人学?机器人学简介

[2017-12-14]  机器人学是工程学与科学的交叉学科,包括机械工程,电气工程,计算机科学等。机器人技术涉及机器人的设计、制造、操作和应用,以及用于控制、感官反馈和信息处理的计算机系统。...

MIT研制出可以像植物一样生长的机器人
MIT研制出可以像植物一样生长的机器人

[2019-11-09]  麻省理工学院开发了一种新型机器人,这种机器人可以本质上自我延伸,其生长方式与植物幼苗向上生长的方式惊人相似。值得注意的是,研究人员 ...

比利时研发出可以自我愈合伤口的软体机器人
比利时研发出可以自我愈合伤口的软体机器人

[2017-09-03]  软体机器人是机器人技术的新兴领域; 他们“可以与人类相互作用,而不会杀死他们,并拿起像西红柿这样柔软的物体。” 从长远来看,布鲁塞尔大学队伍正在努力创建一个类似的材......

本周栏目热点

[2016-11-20]      神经网络 是一种运算模型,由大量的节点(或称神经元)和之间相互连接构成。每个节点代表一种特定的输出函数,称为激励函数(Activ ...

[2016-11-20]   优化问题是工业设计中经常遇到的问题,许多问题最后都可以归结为优化问题 为了解决各种各样的优化问题,人们提出了许多优 ...

深度神经网络会产生人这样的智能吗?

[2016-11-20]   深度学习在近年的进展又一次点燃了各界对人工 神经网络 的热情。这一技术在图像识别、 语音识别 、棋类游戏等领域的成效出人意料,而且 ...

[2016-11-20]   遗传 算法 优化BP 神经网络 权值和阈值的通用MATLAB 源码 遗传 算法 优化 神经网络 有两种情况,一种是把训练好的 神经网络 作为黑 ...

OpenAI开辟全新AI音乐领域,发布Jukebox神经网络生产歌曲

[2020-05-19]  日前,外媒报道,人工智能(AI)技术生成的音乐会给人们带来非常奇妙体验。其中有两大原因,第一,这是一个非常吸引人的全新领域;第二,这 ...