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

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-01-25]  计算机科学教授兼东北地区助手机器人实验室负责人罗伯特·普拉特(Robert Platt)说:“机器人手操作是下一步要解决的问题。想象一下,一个机器人可以在现实世界中用手去做事......

研究人员融合人类与AI的创造力 显著提高了深度学习的表现
研究人员融合人类与AI的创造力 显著提高了深度学习的表现

[2019-10-12]  由加拿大人工智能领域研究主席、滑铁卢大学系统设计工程教授Alexander Wong领导的一个团队开发了一种新型紧凑型神经网络家族,可以在智能 ...

为未来战场创造更有效的机器人 美国陆军研究人工纳米马达
为未来战场创造更有效的机器人 美国陆军研究人工纳米马达

[2019-10-11]  为了使机器人在战斗中更有效、更多才多艺地成为士兵的战友,美国陆军研究人员正在执行一项任务,即研究肌肉分子生命功能的价值,以及复制过 ...

2023年服务机器人市场将超过250亿美元
2023年服务机器人市场将超过250亿美元

[2017-09-04]  全球服务机器人市场预计到2023年将达到250亿美元, 并在预测期内登记15% 的复合年增长率。短期中期回收期和投资回报率高 (ROI), 以及在教育和研究、临场感、防御、救援和安......

从AI中窥探人性
从AI中窥探人性

[2018-01-03]  人们对人造智能的恐惧早已成为科幻书籍和电影的极好题材。但现在,一些同样的担忧开始影响关于现实世界AI技术的政策讨论。如果这样的担忧演变成为一种技术恐慌...

亚马逊计划建一个4000万美元的机器人中心
亚马逊计划建一个4000万美元的机器人中心

[2019-11-07]  爱吧机器人网消息,亚马逊11月6日宣布了一项计划,计划在美国马萨诸塞州韦斯特伯勒建立一个4000万美元、35万平方英尺的机器人创新中心。新 ...

麻省理工又秀神技:推出如魔法般跳跃的方块机器人集群
麻省理工又秀神技:推出如魔法般跳跃的方块机器人集群

[2019-10-31]  几天前,小编向大家介绍过麻省理工(MIT)研发的一种自组装机器人集群(点此阅览),它们可以用统一标准的小单元自动组装出各种大型结构。 ...

通过对抗性图像黑入大脑
通过对抗性图像黑入大脑

[2018-03-02]  在上面的图片中,左边是一张猫的照片。在右边,你能分辨出它是同一只猫的图片,还是一张看起来相似的狗的图片?这两张图片之间的区别在于, ...

本周栏目热点

神经网络:人工智能以及我们的未来

[2016-11-20]   作者:James Crowder翻译:王益军审校:心原文链接:techcrunch把自己想象成在一辆未来的自动驾驶汽车的乘客。这辆汽车与你以一种 ...

[2016-11-20]   include "stdio h" include "stdlib h" include "time h" include "math h" *********************************************i ...

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

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

50行代码玩转生成对抗网络GAN模型!(附源码)

[2018-07-30]  本文为大家介绍了生成对抗网络(Generate Adversarial Network,GAN),以最直白的语言来讲解它,最后实现一个简单的 GAN 程序来帮助大家加深理解。...

深度神经网络揭示了大脑喜欢看什么

[2019-11-06]  爱吧机器人网编者按:近日,《自然-神经科学》发表了一篇论文,研究人员创建了一种深度人工神经网络,能够准确预测生物大脑对视觉刺激所产 ...