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

回归算法示例

# 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()函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NLP中常用文本分类模型汇总

如今深度学习已经成为NLP领域的标配技术,在图像中大为成功的卷积神经网络(CNN)也开始广泛渗透到文本分类、机器翻译、机器阅读等NLP任务中。但是,在ACL2017以前,word-level的文本分类模型(以单词为语义单位…

【TensorFlow】随机训练和批训练的比较与实现

一、随机训练和批训练 随机训练:一次随机抽样训练数据和目标数据对完成训练。批训练:一次大批量训练取平均损失来进行梯度计算,批量训练大小可以一次上扩到整个数据集。批训练和随机训练的差异:优化器方法和收敛的不同批训练的难…

「小公式」平均数与级数

喵喵喵,小夕最近准备复习一下数学和基础算法,所以可能会推送或者附带推送点数学和基础算法的小文章。说不定哪天就用(考)到了呢( ̄∇ ̄)注意哦,与头条位的文章推送不同,「小公式」和「…

最新出炉-阿里 2020届算法工程师-自然语言处理(实习生)以及补充:快递最短路径

问题2感觉跟下面的分苹果类似; 问题 G: 分梨 题目描述 zzq非常喜欢吃梨,有一天他得到了ACMCLUB送给他的一筐梨子。由于他比较仗义,就打算把梨子分给好朋友们吃。现在他要把M个梨子放到N个盘子里面(我们允许有的盘子为空&#xff0…

如何匹配两段文本的语义?

喵喵喵,好久不见啦。首先很抱歉大家期待的调参手册(下)迟迟没有出稿,最近两个月连着赶了4个DDL,整个人都不好了。最近几天终于有时间赶一下未完成的稿子了。在赶DDL的时候夹着写了这篇文章,就先发布这一篇吧…

【TensorFlow】实现简单的鸢尾花分类器

代码实现及说明 # python 3.6 # TensorFlow实现简单的鸢尾花分类器 import matplotlib.pyplot as plt import tensorflow as tf import numpy as np from sklearn import datasetssess tf.Session()#导入数据 iris datasets.load_iris() # 是否是山鸢尾 0/1 binary_target …

偏差-方差全面解释

偏差(Bias)与方差(Variance) 目录: 为什么会有偏差和方差?偏差、方差、噪声是什么?泛化误差、偏差和方差的关系?用图形解释偏差和方差。偏差、方差窘境。偏差、方差与过拟合、欠拟合…

「小算法」回文数与数值合法性检验

喵喵喵,小夕最近准备复习一下数学和基础算法,尽量每篇推送下面会附带点数学和基础算法的小文章。说不定哪天就用(考)到了呢( ̄∇ ̄)注意哦,与头条位的文章推送不同,「小公式」和「小算…

【TensorFlow】实现、训练并评估简单的回归模型和分类模型

1 回归模型 回归算法模型用来预测连续数值型,其目标不是分类值而是数字。为了评估这些回归预测值是否与实际目标相符,我们需要度量两者间的距离,打印训练过程中的损失,最终评估模型损失。 这里使用的例子是从均值为1、标准差为0…

关于”算法工程师/机器学习工程师”的笔试和面试总结

从16年九月份开始,参加了一些公司的算法工程师/机器学习工程师岗位的校园招聘,做一些总结,希望可以给大家准备这个职位提供些信息。 一、需要的基本技能 数据结构知识掌握一门编程语言,c/c/Java/Python 机器学习常用算法或者某一…

史上最通熟易懂的检索式聊天机器人讲解

喵喵喵,一不小心又匿了三个月,突然诈尸害不害怕( ̄∇ ̄) 小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的…

【LeetCode】3月16日打卡-Day1

题1 字符串压缩 描述 字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写…

Python pandas数据分析中常用方法

官方教程 读取写入文件 官方IO 读取 写入 read_csv       to_csv read_excel      to_excel read_hdf       to_hdf read_sql       to_sql read_json      to_json read_msgpack (experimental)   to_msgpack (experimental) read_html    …

【LeetCode】3月17日打卡-Day2

题1 拼写单词 描述 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串)&…

小哥哥,检索式chatbot了解一下?

喵喵喵,一不小心又匿了三个月,突然诈尸害不害怕( ̄∇ ̄) 小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的…

多重共线性、异方差和自相关性

https://www.jianshu.com/p/1e5389ca9829

【LeetCode】3月18日打卡-Day3

题1 无重复字符的最长子串 描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复…

别求面经了!小夕手把手教你如何斩下和选择NLP算法岗offer!(2020.4.14更新)...

推完上一篇文章,订阅号和知乎后台有好多小伙伴跟小夕要面经(还有个要买简历的是什么鬼),然鹅小夕真的没有整理面经呀,真的木有时间(。 ́︿ ̀。)。不过话说回来,面经有多大用呢&#…

机器学习算法优缺点改进总结

https://wenku.baidu.com/view/5df50157f121dd36a22d82bf.html