tensorflow笔记(二)之构造一个简单的神经网络
tensorflow笔记(二)之构造一个简单的神经网络
版权声明:本文为博主原创文章,转载请指明转载地址
http://www.cnblogs.com/fydeblog/p/7425200.html
前言
这篇博客将一步步构建一个tensorflow的神经网络去拟合曲线,并将误差和结果可视化。博客的末尾会放本篇博客的jupyter notebook,可以下载自己调试调试。
实践——构造神经网络
本次构造的神经网络是要拟合一个二次曲线,神经网络的输入层是一个特征,即只有一个神经元,隐藏层有10个特征,即有10个神经元,输出为一个神经元,总结起来就是1—10—1的结构,如果没有神经网络结构的朋友,还请去补一补
首先我们先导入要用到的模块
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
然后我们先构造出原始数据,并画出它的图形(为了更加符合实际,我们会加一些噪声)
x_data = np.linspace(-1,1,300) [:, np.newaxis] # [:,np.newaxis] make row vector transform column vector
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise
x_data是一个范围-1到1,以300分之2等份的列向量,noise的shape与x_data一样,值属于正态分布,0到0.05之间,y_data则是x_data的平方,减0.5,加噪声
fig=plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.xlabel('x_data')
plt.ylabel('y_data')
plt.show()

现在我们先写一个添加神经网络层的函数,函数名为add_nn_layer
def add_nn_layer(inputs, in_size, out_size, activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
Wx_plus_b = tf.matmul(inputs, Weights) + biases
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
神经网络的基本构造是要有输入,还要有输入映射到下一层的权重和偏差,最后神经元还有一个激活函数(这个有没有看需求),控制输出
我们上面讲到这个神经网络的结构是1—10—1,所以要添加两个层,一层是从输入层到隐藏层,另一层是隐藏层到输出层。
从输入层到隐藏层,1—10,输入是300x1的向量,到第二层则是300x10,权重则是1x10,偏差的shape与输出相同
从隐藏层到输出层,10—1,输入是300x10的向量,输出是300x1,可见权重是10x1,偏差的shape与输出相同
由此可以知道上面函数中各种变量的构造原因,简单说神经网络的构造就是输入乘以权重加上偏差,进入神经元的激活函数,然后输出
接下来我们开始写其他代码
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
tf.placeholder函数是一个非常重要的函数,以后用到它的次数会非常多,它表示占位符,相应的值会在sess.run里面feed进去,这样处理会非常灵活,大部分的学习都是分批的,不是一次传入,占位符满足这种需求
这里的xs和ys都是列向量,列数为1,行数不确定,feed的输入行数是多少就是多少
# add hidden layer
l1 = add_nn_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer
prediction = add_nn_layer(l1, 10, 1, activation_function=None)
这里隐藏层的激活函数用的是tf.nn.relu,relu全名是修正线性单元,详细请参考wiki(https://en.wikipedia.org/wiki/Rectifier_(neural_networks)),它的性质简单的说就是输入神经元的数据大于0则等于自身,小于0则等于0,使用它更符合神经网络的性质,即有抑制区域和激活区域,我试了没加激活函数和sigmoid激活函数,效果要比用relu差许多,你们可以试试。
#compute loss
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1]))
# creat train op,then we can sess.run(train) to minimize loss
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# creat init
init = tf.global_variables_initializer()
# creat a Session
sess = tf.Session()
# system initialize
sess.run(init)
# training
for i in range(1000):
sess.run(train, feed_dict={xs: x_data, ys: y_data})
prediction_value = sess.run(prediction, feed_dict={xs: x_data})
if i % 50 == 0:
# to see the step improvement
print('loss:',sess.run(loss, feed_dict={xs: x_data, ys: y_data}))

最后我们来看一下拟合的效果
fig=plt.figure()
bx = fig.add_subplot(1,1,1)
bx.scatter(x_data,y_data)
bx.plot(x_data,prediction_value,'g-',lw=6)
plt.xlabel('x_data')
plt.ylabel('y_data')
plt.show()

可见拟合的不错
结尾
下一个笔记将讲讲tensorboard的一些用法,敬请期待!
百度云链接: https://pan.baidu.com/s/1skAfUGH 密码: qw1g
tensorflow笔记(二)之构造一个简单的神经网络的更多相关文章
- twisted 学习笔记二:创建一个简单TCP客户端
#coding=utf-8 from twisted.internet import reactor,protocol class QuickClient(protocol.Protocol): de ...
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...
- 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在lin ...
- Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥
一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS
郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...
- 第三周:构造一个简单的LINUX系统MENUOS
吕松鸿 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- Linux内核分析——构造一个简单的Linux系统MenuOS
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...
- 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS
Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
随机推荐
- CSS3-loading动画(一)
前两天从一个网站中看到了一些比较好的loading动画效果,是用纯CSS3来写的,感觉不错,就尝试着照着效果来自己写出来. 在开始之前,先复习一个小知识:CSS3新增的关键帧动画,可以用来实现很多的动 ...
- js验证表单密码、用户名是否输入--JS的简单应用
在登录.注册时,我们经常会遇到下面这种情况,如果我们没有输入用户名.密码时,系统会弹出提示框.提示框信息提示内容是我们密码没有输入密码或者用户名等.那么这样的弹出框效果是如何实现的呢?文章标题既然与j ...
- Java的基本数据类型和运算
编码 ASCII--0~127 65-A 97-a 西欧码表---ISO-8859-1---0-255---1个字节 gb2312----0-65535---gbk---2个字节 Unicode编 ...
- Mybatis-多对多
先说一下需求: 在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别) 测试环境:MySQL.MyEclipse 创建表: 笔者这里使用 中间表 连接 ...
- Webi Report 展示 图片链接 (Image Link)
最近由于项目需求,在生成的Webi Report中需要增加一列展示相关数据系统的图片链接,要求用户可以通过点击图片链接展示图片. 方法如下: 1,首先找到系统中图片,查看随机一张图片的属性,找到图片的 ...
- css display:box 新属性
一.display:box; 在元素上设置该属性,可使其子代排列在同一水平上,类似display:inline-block;. 二.可在其子代设置如下属性 前提:使用如下属性,必须在父代设置displ ...
- 华为OJ之最长公共子串
题目描述: 对于两个给定的字符串,给出他们的最长公共子串. 题目分析: 1,最长公共子串(LCS)实际上是最长公共子序列的一种特殊情况,相当于是求连续的最长子序列.我们今天先解决这个特殊情况,后续博文 ...
- luogu P2756 飞行员配对方案问题
题目链接:P2756 飞行员配对方案问题 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另 ...
- css 过渡和 变形
一.过渡(transition) transition-property: 指定具有过渡效果的CSS样式属性名 1.默认值: all 2.仅具有中间值(CSS样式值是数值的)的CSS样式具有过渡效果 ...
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...