热门标签 | 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]]

查看更多

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

  • 我的博客
  • 知乎专栏

推荐阅读
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • OCR:用字符识别方法将形状翻译成计算机文字的过程Matlab:商业数学软件;CUDA:CUDA™是一种由NVIDIA推 ... [详细]
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社区 版权所有