TensorFlow 高级之一(实现单层神经网络)
单层神经网络(一个神经元)
实现环境:TensorFlow1.3,Python3.6,Jupyter notebook
- 单层神经网络(一个神经元)
- 1 第一个 tensorflow
- 2 定义一个神经元
- 3 TensorBoard可视化你的图
- 4 训练神经元
- 5 可视化及训练全过程
- 实践
1 第一个 tensorflow
import tensorflow as tf # 导入tensorflowgraph = tf.get_default_graph() # 定义一个图
input_value = tf.constant(1.0) # 定义一个常数 sess = tf.Session() #定义session
weight = tf.Variable(0.8) #初始权重
output_value = weight * input_value #让权重与输入相乘,得到输出 init=tf.global_variables_initializer()#全局初始化
sess.run(init)
sess.run(output_value) #输出:0.8
不像Python变量一样,定义后立即可以看到其值,对于TensorFlow定义
的这个常数,为了执行input_value这句话,并给出这个数字的值,我们需要创造一个“会话”(session)。
让图里的计算在其中执行并明确地要执行input_value并给出结果(会话会默认地去找那个默认图)“执行”一个常量可能会让人觉得有点怪。但是这与在Python里执行一个表达式类似。
这就是TensorFlow管理它,自己的对象空间(计算图)和它自己的执行方式。
2 定义一个神经元
接下来我们定义一个神经元,假设我们有一个训练集,输入为1,输出为0.8(正确输出是0)。
假设我们要预测的函数为:y=w*x,其中w为权重,x为输入,y为输出或预测值。
他们间的关系如下图所示:
现在已经有了一个会话,其中有一个简单的图。
下面让我们构建仅有一个参数的神经元,或者叫权重。
通常即使是简单的神经元也都会有偏置项和非一致的启动函数或激活函数。
神经元的权重不应该是常量,我们会期望这个值能改变,从而学习训练数据里的输入和输出。
这里我们定义权重是一个TensorFlow的变量,
让权重与输入相乘,得到输出
output_value = weight * input_valuetf.global_variables_initializer()函数生成了一个运算,来初始化所有的变量(我们的情况是只有一个变量)。 init=tf.global_variables_initializer()
sess.run(init) tf.global_variables_initializer()的结果会包括现在图里所有变量的初始化器。
所以如果你后续加入了新的变量,你就需要再次使用tf.global_variables_initializer()。
一个旧的init是不会包括新的变量的。
现在我们已经准备好运行output_value运算了。0.8 * 1.0是一个32位的浮点数,而32位浮点数一般不会是0.8。0.80000001是系统可以获得的一个近似值。
3 TensorBoard可视化你的图
4 训练神经元
我们已经有了一个神经元,但如何才能让它学习?假定我们让输入为1,而正确的输出应该是0。也就是说我们有了一个仅有一条记录且记录只有一个特征(值为1)和一个结果(值为0)的训练数据集。我们现在希望这个神经元能学习这个1->0的函数。
目前的这个系统是输入1而输出0.8。但不是我们想要的。我们需要一个方法来测量系统误差是多少。我们把对误差的测量称为“损失”,并把损失最小化设定为系统的目标。损失是可以为负值的,而对负值进行最小化是毫无意思的。所以我们用实际输出和期望输出之差的平方来作为损失的测量值。
y_ = tf.constant(0.0)
loss = (y - y_)**2
对此,现有的图还不能做什么事情。所以我们需要一个优化器。这里我们使用梯度下降优化器来基于损失值的导数去更新权重。这个优化器采用一个学习率来调整每一步更新的大小。这里我们设为0.025。
optim = tf.train.GradientDescentOptimizer(learning_rate=0.025)
这个优化器很聪明。它自动地运行,并在整个网络里恰当地设定梯度,完成后向的学习过程。让我们看看我们的简单例子里的梯度是什么样子的。
grads_and_vars = optim.compute_gradients(loss)
那么compute_gradients可能会返回(None,v),即部分变量没有对应的梯度,在下一步的时候NoneType会导致错误。因此,需要将有梯度的变量提取出来,记为grads_vars。
grads_vars = [v for (g,v) in grads_and_vars if g is not None]
之后,对grads_vars再一次计算梯度,得到了gradient。
gradient = optim.compute_gradients(loss, grads_vars)
sess.run(tf.global_variables_initializer())
sess.run(gradient)
输出:[(1.6, 0.80000001)]
为什么梯度值是1.6?我们的损失函数是错误的平方,因此它的导数就是这个错误乘2。现在系统的输出是0.8而不是0,所以这个错误就是0.8,乘2就是1.6。优化器是对的!
对于更复杂的系统,TensorFlow可以自动地计算并应用这些梯度值。
让我们运用这个梯度来完成反向传播。
sess.run(tf.global_variables_initializer())
sess.run(optim.apply_gradients(grads_and_vars))
sess.run(w)
输出:0.75999999,约为0.76
现在权重减少了0.04,这是因为优化器减去了梯度乘以学习比例(1.6*0.025),即:
w_2=w_1-r Δy/Δx=0.8-0.025*1.6
权重向着正确的方向在变化。
其实我们不必像这样调用优化器。我们可以形成一个运算,自动地计算和使用梯度:train_step。
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)
for i in range(100):sess.run(train_step)
sess.run(y)
输出:0.0047364226
通过100次运行训练步骤后,权重和输出值已经非常接近0了。这个神经元已经学会了!
5 可视化及训练全过程
# 目标: 输入1 --> 输出0
import tensorflow as tfx = tf.constant(1.0, name='input')
w = tf.Variable(0.8, name='weight')
y = tf.multiply(w, x, name='output')
y_ = tf.constant(0.0, name='correct_value')
loss = tf.pow(y - y_, 2, name='loss')
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)for value in [x, w, y, y_, loss]:tf.summary.scalar(value.op.name, value)summaries = tf.summary.merge_all()sess = tf.Session()
summary_writer = tf.summary.FileWriter('./log/simple_stats', sess.graph)
sess.run(tf.global_variables_initializer())for i in range(100):summary_str = sess.run(summaries)summary_writer.add_summary(summary_str, i)sess.run(train_step)if i%20 ==0 or i==99:print("训练{}次结果y为:{},损失函数:{}".format(i+1,sess.run(y),sess.run(loss)))输出:
训练1次结果y为:0.7599999904632568,损失函数:0.5776000022888184
训练21次结果y为:0.272449254989624,损失函数:0.07422859966754913
训练41次结果y为:0.09766922146081924,损失函数:0.009539276361465454
训练61次结果y为:0.03501303866505623,损失函数:0.0012259128270670772
训练81次结果y为:0.012551683932542801,损失函数:0.00015754476771689951
训练100次结果y为:0.004736422561109066,损失函数:2.2433698177337646e-05
实践
动手实践:用单个神经元训练一个函数:y=2x+1 预测值y=wx+b 根据以下训练集,训练参数w,b 输入数据集: x: [0.1,0.2,0.5,1,1.5,1.6] y_:[1.1,1.5,2.0,3,4,4.3]
import tensorflow as tfx = tf.placeholder(tf.float32,shape=[None]) w = tf.Variable([1.0]) b = tf.Variable([0.2]) y = tf.multiply(w, x) y=tf.add(y,b) y_ = tf.placeholder(tf.float32,shape=[None]) loss = tf.reduce_mean(tf.square((y - y_)))train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)sess = tf.Session() sess.run(tf.global_variables_initializer())for i in range(2000):w_,b_,loss_=sess.run([w,b,loss],feed_dict={x:[0.1,0.2,0.5,1,1.5,1.6],y_:[1.1,1.5,2.0,3,4,4.3]}) sess.run([y,train_step],feed_dict={x:[0.1,0.2,0.5,1,1.5,1.6],y_:[1.1,1.5,2.0,3,4,4.3]})if i%200==0:print('w=', w_, 'b=', b_) 输出: w= [ 1.] b= [ 0.2] w= [ 1.48553479] b= [ 0.66175097] w= [ 1.72320616] b= [ 0.879767] w= [ 1.84133148] b= [ 0.98082918] w= [ 1.90166068] b= [ 1.02590919] w= [ 1.93392718] b= [ 1.04431856] w= [ 1.95245183] b= [ 1.05014014] w= [ 1.96414256] b= [ 1.05013025] w= [ 1.97233987] b= [ 1.04752338] w= [ 1.97866631] b= [ 1.0438596]
TensorFlow 高级之一(实现单层神经网络)相关推荐
- TensorFlow基础8-实现单层神经网络
记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,神经网络的设计 二,实现单层神经网络 一,神经网络的设计 二,实现单层神经网络 导入库 加载数据 数据预处理 设置超参 ...
- TensorFlow随笔-多分类单层神经网络softmax
#!/usr/bin/env python2 # -*- coding: utf-8 -*-import tensorflow as tf from tensorflow.examples.tutor ...
- 译文 | 与TensorFlow的第一次接触 第四章:单层神经网络
北京 | 深度学习与人工智能研修 12月23-24日 再设经典课程 重温深度学习阅读全文> 正文共7865个字,27张图,预计阅读时间:20分钟. 在前言中,已经提到经常使用深度学习的领域就是模 ...
- TensorFlow学习笔记之三(神经网络的优化)
文章目录 1. 使用激活函数去线性化(为什么要用激活函数) 实验证明线性模型的局限性 常用激活函数 2. 神经网络复杂度:用网络层数和网络参数的个数表示 3. 损失函数(loss):预测值(y)与已知 ...
- Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
正文共5958个字,预计阅读时间15分钟. 笔记整理者:王小草 笔记整理时间:2017年2月27日 笔记对应的官方文档:https://www.tensorflow.org/get_started/i ...
- 一文初探Tensorflow高级API使用(初学者篇)
正文共5917个字,3张图,预计阅读时间34分钟. 笔记整理者:王小草 笔记整理时间:2017年2月26日 对应的官方文档地址:https://www.tensorflow.org/get_start ...
- TensorFlow学习(三)——神经网络进阶
TensorFlow学习(三)--神经网络进阶DNN 一.神经网络的进阶概念 激活函数 偏置项 损失函数 经典损失函数 交叉熵(cross entropy)损失函数--分类问题 示例展示 代码表示 代 ...
- 深度学习 神经网络 神经元 单层神经网络的实现
使用 tensorflow1.14, 数据集 cifar10 代码 初始化 数据集一览 数据预处理 构建模型图 神经元 单层神经网络 注意点 other 代码 初始化 import tensorflo ...
- Code For Better 谷歌开发者之声----谷歌云基于TensorFlow高级机器学习
目录 前言 一.End-to-End Machine Learning with TensorFlow on GCP(基于TensorFlow的机器学习) 1.什么是TensorFlow 2.Tens ...
- 华南理工深度学习与神经网络期末考试_深度学习基础:单层神经网络之线性回归...
3.1 线性回归 线性回归输出是一个连续值,因此适用于回归问题.回归问题在实际中很常见,如预测房屋价格.气温.销售额等连续值的问题.与回归问题不同,分类问题中模型的最终输出是一个离散值.我们所说的图像 ...
最新文章
- 泊松分布的分布函数_第114讲 SAS泊松分布与泊松回归
- ctf xor题_从一道CTF题目谈PHP中的命令执行
- 开发DBA(APPLICATION DBA)的重要性
- 为什么需要两个Survivor区?
- 使用oracle sql profile固定执行计划
- 【转】UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 1: invalid continuation 汉字编码
- awk 系列Part7:awk 怎么从标准输入(STDIN)读取输入
- overlayfs高密 读性能_RFID读写器天线圆极化与线极化的性能区别
- 2017 Multi-University Training Contest - Team 7:1008. Hard challenge(模拟)
- delphi 不允许在线程里操作ui怎么办_11款鲜为人知的在线工具,全面而又强大
- Lucene2.4.0一般查询结果过滤与排行
- 四、随机变量及其分布函数的基本定义和性质 random variables and distribution
- 迅雷下载出错应版权方要求文件无法下载
- k8s之ovs-cni
- 期货卖出平仓价和买入平仓价(期货平仓价和结算价)
- 【音频分析】短时傅立叶变换结果为啥是对称?每个结果对应的频率是多少?
- .Net iTextSharp 给Pdf添加图片水印
- basler相机参数简要中文说明_basler设置相机参数
- 第二章:IEEE2030.5官网相关资料介绍
- 自然辩证法之李约瑟难题
热门文章
- alsa mixer编程
- 计算机编程画图步骤,计算机CAD绘图基础教程
- Centos7安装Docker后无法启动:Failed to program NAT chain: INVALID_ZONE: docker
- 微信公众号迁移办理流程及公证书办理方法
- 主动降噪技术matlab,主动降噪技术(ANC)的前生今世--原理仿真
- 关于IllegalArgumentException occurred while calling setter for property
- 在谷歌搜索框内不显示搜索记录
- html5 文本框只能输入正整数,控制input文本框只能输入正整数
- 江南春新年围炉夜谈:如何破解增长焦虑?
- Pyrene-PEG-Acid,芘丁酸聚乙二醇羧基,Pyrene-PEG-COOH