回归算法示例

# python 3.6
# TensorFlow实现反向传播
import tensorflow as tf
import numpy as npsess = tf.Session()# 一、回归算法
# 从均值为1、标准差为0.1的正态分布中抽样随机数,
# 然后乘以变量A,损失函数为L2正则损失函数。
# 理论上,A的最优值是10,因为生成的样例数据均值是1。# 1.生成数据 创建占位符和变量A
x_vals = np.random.normal(1,0.1,100)
y_vals = np.repeat(10.,100)
x_data = tf.placeholder(shape=[1],dtype=tf.float32)
y_target = tf.placeholder(shape=[1],dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1]))# 2.增加乘法操作
my_output = tf.multiply(x_data,A)# 3.增加L2正则损失函数
loss = tf.square(my_output-y_target)# 4.初始化所有变量
init = tf.global_variables_initializer()
sess.run(init)# 5.声明变量优化器
# 迭代步长由学习率控制
# 学习率越小 收敛时间越长 学习率过大 可能无法收敛 导致梯度消失或爆炸
my_opt = tf.train.GradientDescentOptimizer(learning_rate=0.02)
train_step = my_opt.minimize(loss)# 6.训练算法 迭代100次 每25次返回结果 选择一个随机的x和y传入计算图
# tf自动计算损失 调整A偏差来最小化损失
for i in range(100):rand_index = np.random.choice(100)rand_x = [x_vals[rand_index]]rand_y = [y_vals[rand_index]]sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})if (i+1)%25 == 0:print("Step # " + str(i+1) + ' A = ' + str(sess.run(A)))print("Loss=" + str(sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})))

分类算法示例

# python 3.6
import tensorflow as tf
import numpy as np# 二、二值分类算法
# 从两个正态分布N(-1,1)和N(3,1)生成100个数。
# 所有从正态分布N(-1,1)生成的数据标为目标类0;
# 从正态分布N(3,1)生成的数据标为目标类1,
# 模型算法通过sigmoid函数将这些生成的数据转换成目标类数据。
# 换句话讲,模型算法是sigmoid(x+A)
# 其中,A是要拟合的变量,理论上A=-1。
# 假设,两个正态分布的均值分别是m1和m2,则达到A的取值时,
# 它们通过-(m1+m2)/2转换成到0等距的值。
# 后面将会在TensorFlow中见证怎样取到相应的值。# 1.创建计算图
sess = tf.Session()# 2.生成数据和目标标签、占位符和变量A
x_vals = np.concatenate((np.random.normal(-1,1,50),np.random.normal(3,1,50)))
y_vals = np.concatenate((np.repeat(0.,50),np.repeat(1.,50)))
x_data = tf.placeholder(shape=[1],dtype=tf.float32)
y_target = tf.placeholder(shape=[1],dtype=tf.float32)
# 初始化变量A为10附近的值,远离理论值-1。
# 这样可以清楚地显示算法是如何从10收敛为-1的。
A = tf.Variable(tf.random_normal(mean=10,shape=[1]))# 3.增加转换操作
my_output = tf.add(x_data,A)# 4.由于指定的损失函数期望批量数据增加一个批量数的维度,
# 这里使用expand_dims()函数增加维度。
# 之后将讨论如何使用批量变量训练,这次还是一次使用一个随机数据:
my_output_expanded = tf.expand_dims(my_output,0)
y_target_expanded = tf.expand_dims(y_target,0)# 5.初始化变量A
init = tf.global_variables_initializer()
sess.run(init)# 6.声明损失函数:带非归一化logits的交叉熵损失函数 用sigmoid转换
xentropy = tf.nn.sigmoid_cross_entropy_with_logits(logits=my_output_expanded,labels=y_target_expanded)# 7.增加一个优化器函数让TensorFlow知道如何更新和偏差变量
my_opt = tf.train.GradientDescentOptimizer(0.05)
train_step = my_opt.minimize(xentropy)# 8.通过随机选择的数据迭代几百次 更新变量A 每200次输出loss和A的值
for i in range(1400):rand_index=np.random.choice(100)rand_x = [x_vals[rand_index]]rand_y = [y_vals[rand_index]]sess.run(train_step, feed_dict={x_data:rand_x,y_target:rand_y})if (i+1)%200 == 0:print('Step # ' + str(i+1) + ' A = ' + str(sess.run(A)))print('Loss = '+ str(sess.run(xentropy,feed_dict={x_data:rand_x,y_target:rand_y})))

总结

实现反向传播的步骤

  1. 生成数据;
  2. 初始化占位符和变量;
  3. 创建损失函数;
  4. 定义一个优化器算法;
  5. 通过随机数据样本进行迭代,更新变量。

学习率和优化器算法

学习率 优点 缺点 使用场景
结果精确 收敛慢 算法不稳定,降低学习率
收敛快 结果不精确 算法收敛慢,提高学习率

问题
有时,标准梯度下降算法会明显卡顿或者收敛变慢,特别是在梯度为0的附近的点。

解决思路
①TensorFlow的MomentumOptimizer()函数增加了一项势能, 前一次迭代过程的梯度下降值的倒数。

②可以改变的是优化器的步长,理想情况下,对于变化小的变量使用大步长;而变化迅速的变量使用小步长。实现这种优点的常用Adagrad算法。此算法考虑整个历史迭代的变量梯度,TensorFlow中相应功能的实现是AdagradOptimizer()函数。

问题
有时,由于Adagrad算法计算整个历史迭代的梯度,导致梯度迅速变为0。

解决思路
可以用Adadelta算法解决,它限制使用的迭代次数。TensorFlow中相应功能的实现是AdadeltaOptimizer()函数。

【TensorFlow】通过两个简单的例子实现反向传播相关推荐

  1. Java 多线程编程两个简单的例子

    /*** @author gao*/ package gao.org;public class RunnableDemo implements Runnable{@Overridepublic voi ...

  2. TensorFlow精进之路(十一):反向传播BP

    1.概述 全连接神经网络和卷积神经网络用的是反向传播(BackPropagation,BP),而卷积神经网络用的是随时间反向传播(BackPropagation Through Time,BPTT), ...

  3. 一个一步步进行反向传播的例子

    说明 学习深度学习的过程中,遇到了一个用例子讲解反向传播算法的博文,简单粗暴容易理解,很适合我这种小白,所以打算翻译一下分享,英文水平有限,翻译不对的地方请告知.原文地址在这.下面是译文. 背景 反向 ...

  4. TensorFlow精进之路(十二):随时间反向传播BPTT

    1.概述 上一节介绍了TensorFlow精进之路(十一):反向传播BP,这一节就简单介绍一下BPTT. 2.网络结构 RNN正向传播可以用上图表示,这里忽略偏置. 上图中, x(1:T)表示输入序列 ...

  5. RNN循环神经网络的直观理解:基于TensorFlow的简单RNN例子

    RNN 直观理解 一个非常棒的RNN入门Anyone Can learn To Code LSTM-RNN in Python(Part 1: RNN) 基于此文章,本文给出我自己的一些愚见 基于此文 ...

  6. TensorFlow个人学习(下载安装简单代码例子)

    (由于项目最终决定使用TensorFlow,所以博客来总结学习TensorFlow) 下载和安装: 由于TensorFlow也官方支持windows了,省去了很多功夫,安装就更简单了. TensorF ...

  7. 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络

    这篇文章将讲解如何使用python建立多层神经网络.在阅读这篇文章之前,建议先阅读上一篇文章:理解神经网络,从简单的例子开始.讲解的是单层的神经网络.如果你已经阅读了上一篇文章,你会发现这篇文章的代码 ...

  8. 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络

    理解神经网络,从简单的例子开始(1)7行python代码构建神经网络 前言 本文分为两个部分,第一个部分是一个简单的实例:9行Python代码搭建神经网络,这篇文章原文为:原文链接, 其中中文翻译版来 ...

  9. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子

    blockchain 区块链200行代码:在JavaScript实现的一个简单的例子 了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器上,不同的网络设备上 ...

最新文章

  1. BCH或许才是真正的未来
  2. 模板会有多层镜像_创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建,本博文讲解前两种。基于已有镜像的容器创建该方法是使用docke...
  3. linux用m4重定向,liunx重定向控制台消息
  4. 不动产中心考试计算机测试题,2005年全国计算机二级考试VFP笔试模拟题
  5. 中央2套-理财教室-如何购买保险
  6. c++ 捕获所有异常
  7. LuaForUnity7.1:Lua“类与对象”
  8. Java的GUI学习三(frame)
  9. love2d贪吃蛇---蛇
  10. 我的前端故事----疯狂倒计时(requestAnimationFrame)
  11. 数学建模国赛题型和获奖策略
  12. k8s node节点重启后遇到的问题及解决
  13. 朱嘉明 | 认知未来货币需要新的思想资源
  14. 云原生计算基金会宣布Envoy毕业
  15. 学习游戏建模的方式有哪些?次世代游戏建模学习路线以及要掌握的3D软件分别是?
  16. Day68(贪心算法)
  17. java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库
  18. 【附源码】Python计算机毕业设计实验室耗材管理系统
  19. 执行docker命令,报错Segmentation fault
  20. python海龟画图(10)小米logo

热门文章

  1. 感觉stm32太简单是一种自负吗?
  2. 我那个37岁的大神朋友,后续
  3. checkbox居中 editor_radio 或 CheckBox 关联 其他元素 整体选择
  4. 2017年12月计算机一级c,2017年12月计算机二级C语言考试操作题冲刺卷(2)
  5. python pyecharts 折线图_python数据大屏pyecharts库2020.8.31
  6. 数据解析学习笔记(正则解析、bs4解析、xpath解析)
  7. fastapi PUT更新数据 / PATCH部分更新
  8. TensorFlow 2.0 - CNN / 预训练 / RNN
  9. 【Kaggle】Intermediate Machine Learning(缺失值+文字特征处理)
  10. LeetCode 1217. 玩筹码(脑筋急转弯)