热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TensorFlow入门下

前置准备在阅读本文之前,请确定你已经了解了神经网络的基本结构以及前向传播、后向传播的基本原理,如果尚未了解,可以查看下文。神经网络初探​chrer.com本文的上篇在TensorF

前置准备

在阅读本文之前,请确定你已经了解了神经网络的基本结构以及前向传播、后向传播的基本原理,如果尚未了解,可以查看下文。

神经网络初探chrer.com《TensorFlow入门-下》

本文的上篇在

TensorFlow入门-上chrer.com《TensorFlow入门-下》

从中可以了解到TensorFlow的基本概念——计算图,张量,会话,变量,变量集合等。

几种重要算法

前向传播

前向传播是神经网络最重要的算法之一,他的目的是通过输入层的输入进行推断,得到输出层的结果,下面假定一个简单的神经网络如下图,包含:一个输入层,一个隐藏层,一个输出层。

《TensorFlow入门-下》
《TensorFlow入门-下》

则该算法的tensorFlow表达为:

import tensorflow as tf
# 初始化权重
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
# 输入特征向量
x = tf.constant([[0.7,0.9]])
# 前向传播,只是定义,还没有运行
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
# 真正开始初始化权重
sess = tf.Session()
# sess.run(w1.initializer)
# sess.run(w2.initializer)
init_op = tf.initialize_all_variables()
sess.run(init_op)
# 运行
print(sess.run(y))
sess.close()

反向传播

反向传播(英语:Backpropagation,缩写为
BP)是“误差反向传播”的简称,是一种与
最优化方法(如
梯度下降法)结合使用的,用来训练
人工神经网络的常见方法。该方法对网络中所有权重计算
损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。

反向传播在TensorFlow中的实现很简单,不需要我们一步一步定义,只需要我们定义好损失函数,然后开始计算时,程序会自动进行反向传播减小误差。

注入数据

进行训练需要用到大量数据,注入数据是通过placeHolder进行的,示意如下:

import tensorflow as tf
# 初始化权重
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
# 定义placeholder
x = tf.placeholder(tf.float32,shape=(3,2),name="input")
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
# 真正开始初始化权重
sess = tf.Session()
init_op = tf.initialize_all_variables()
sess.run(init_op)
# 像x中注入数据
print(sess.run(y,feed_dict={x:[[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))

TensorFlow模型步骤

由于TensorFlow是使用连接主义进行架构的,也就是说,先定义网络结构,在进行运算,所以建立模型有以下几个步骤:

  1. 建立各个变量之间的定义以及他们之间的关系
  2. 建立数据训练过程
  3. 通过sess.run()开始训练
  4. 在训练过程中进行评估,以适时结束训练

第一个神经网络

下面通过建立第一个神经网络,更好的进行理解,该网络结构如上图所示,数据集随机模拟而来:

import tensorflow as tf
# 使用numpy包来模拟数据集
from numpy.random import RandomState
# 训练数据batch的大小
batch_size =8
# 参照之前定义神经网络参数
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
# 定义输入和标签输出
x = tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input')
# 前向传播的结构
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
# 定义损失函数和反向传播算法
cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
# 通过随机数生成一个模拟数据集,x1+x2<1则标签为正样本,否则为负样本
rdm = RandomState(1)
dateset_size = 128
X = rdm.rand(dateset_size,2)
Y = [[int (x1 + x2 <1)] for (x1,x2) in X]
# 创建会话
with tf.Session() as sess:
# 初始化参数
init_op = tf.initialize_all_variables()
sess.run(init_op)
print(sess.run(w1),sess.run(w2))
# 设定训练的各种参数
steps = 7000
for i in range(steps):
# 每轮选择batch_size个样本来训练
start = (i*batch_size) % dateset_size
end = min(start + batch_size,dateset_size)
# 开始训练
sess.run(train_step,feed_dict={x: X[start:end], y_: Y[start:end]})
# 每过100轮进行一次计算交叉熵(损失函数)
if i % 1000 ==0:
total_crosss_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print("After %d training steps, cross entropy is %g" %(i,total_crosss_entropy))
# 输出训练后的权重
print(sess.run(w1),sess.run(w2))

结果如下:

[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
[[-0.8113182 ]
[ 1.4845988 ]
[ 0.06532937]]
After 0 training steps, cross entropy is 0.0674925
After 1000 training steps, cross entropy is 0.0163385
After 2000 training steps, cross entropy is 0.00907547
After 3000 training steps, cross entropy is 0.00714436
After 4000 training steps, cross entropy is 0.00578471
After 5000 training steps, cross entropy is 0.00430222
After 6000 training steps, cross entropy is 0.00280812
[[-2.3681936 2.968816 2.1473026]
[-3.882967 1.4639109 2.5922096]]
[[-2.2131984]
[ 3.1050255]
[ 1.8669094]

自定义损失函数

在现实生活中,损失可能并不想TensorFlow自带的那样简单,我们需要自定义损失函数来达到更好训练的目的。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from numpy.random import RandomState
batch_size = 8
# 定义输入和标签输出
x = tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input')
# 前向传播的结构
w1 = tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
y = tf.matmul(x,w1)
# 自定义损失函数
loss_less = 10
loss_more = 1
# 注意select名称改成了where,这里自定义了损失函数
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),
(y-y_)*loss_more,
(y_-y)*loss_less))
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
# 随机生成模拟集
rdm = RandomState(1)
dateset_size = 128
X = rdm.rand(dateset_size,2)
# 加入了随机噪声
Y = [[x1 + x2 + rdm.rand()/10.0-0.05] for (x1,x2) in X]
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
STEPS = 5000
for i in range(STEPS):
# 每轮选择batch_size个样本来训练
start = (i * batch_size) % dateset_size
end = min(start + batch_size, dateset_size)
# 开始训练
sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
# 每过100轮进行一次计算交叉熵(损失函数)
print(sess.run(w1))

结果如下:

[[1.019347 ]
[1.0428089]]

查看更多

所有的文章都会在我的博客和我的知乎专栏同步进行更新,欢迎阅读

  • 我的博客
  • 知乎专栏

推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
ha遗忘的密
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有