神经网络模型的训练过程其实质上就是神经网络参数的设置过程

在神经网络优化算法中最常用的方法是反向传播算法,下图是反向传播算法流程图:

从上图可知,反向传播算法实现了一个迭代的过程,在每次迭代的开始,先需要选取一小部分训练数据,这一小部分数据叫做一个batch。然后这一个batch会通过前向传播算法得到神经网络的预测结果。计算出当前神经网络的预测答案与正确答案之间的差距(有监督学习,在训练时有一个标注好的数据集),最后根据预测值和真实值之间的差距,反向传播算法会相应的更新神经网络参数的取值,使在这个batch上神经网络模型的预测结果更接近真实答案。

通过TensorFlow实现反向传播算法的第一步是使用TensorFlow表达一个batch数据,但如果每轮迭代中选取的数据都通过常量来表示,会导致TensorFlow的计算图非常大。因为每生成一个常量,TensorFlow都会在计算图中增加一个节点。一般来书一个神经网络的训练过程会经过几百万轮甚至上亿轮的迭代,这样就导致计算图非常大,而且利用率低。为了避免这个问题,TensorFlow提供placeholder机制用于提供输入数据。placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定,这样在程序中就不需要生成大量常量来提供输入数据,而只需要将数据通过placeholder传入TensorFlow计算图。在placeholder定义时,需要指定数据类型。下面程序是通过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=(1, 2), name="input") # 通过前项传播算法得到神经网络的输出
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
# 定义会话
sess = tf.Session()
# 定义初始化变量
init_op = tf.global_variables_initializer()
sess.run(init_op)
sess.run(w2.initializer)
# feed_dict是一个字典,在这个字典中需要给出每个使用placeholder定义变量的取值
print(sess.run(y, feed_dict={x: [[0.7, 0.9]]}))
sess.close()

在上面的程序中输入的是1x2矩阵(shape=(1, 2)),若改为n x 2的矩阵,就可以得到n个前向传播结果

在得到一个batch的前向传播结果后需要定义一个损失函数来刻画当前的预测值和真实答案之间的差距。然后通过反向传播算法来缩小预测值和真实值之间的差距。下面代码定义了一个损失函数,及反向传播算法

# 使用sigmoid函数将y转化为0-1之间的数值,转化后y代表预测正样本的概率,
# 1-y代表预测负样本的概率
y = tf.sigmoid(y)
# 定义损失函数,刻画预测值与真实值之间的差距
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, le-10, 1.0)) +
(1 - y_) * tf.log(tf.clip_by_value(1-y, le-10, 1.0)))
# 定义学习率
LR = 0.001
# 定义反向传播算法优化神经网络参数
train_step = tf.train.AdamOptimizer(LR).minimize(cross_entropy)

通过TensorFlow训练神经网络模型的更多相关文章

  1. 利用Tensorflow实现神经网络模型

    首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 78 ...

  2. 手写数字识别 ----卷积神经网络模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----卷积神经网络模型 import os import tensorflow as tf #部分注释来源于 # http://www.cnblogs.com/rgvb178/p/ ...

  3. 利用Tensorflow实现卷积神经网络模型

    首先看一下卷积神经网络模型,如下图: 卷积神经网络(CNN)由输入层.卷积层.激活函数.池化层.全连接层组成,即INPUT-CONV-RELU-POOL-FC池化层:为了减少运算量和数据维度而设置的一 ...

  4. 【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

    初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构 ...

  5. Tensorflow 对上一节神经网络模型的优化

    本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax ...

  6. Keras结合Keras后端搭建个性化神经网络模型(不用原生Tensorflow)

    Keras是基于Tensorflow等底层张量处理库的高级API库.它帮我们实现了一系列经典的神经网络层(全连接层.卷积层.循环层等),以及简洁的迭代模型的接口,让我们能在模型层面写代码,从而不用仔细 ...

  7. tensorflow 神经网络模型概览;熟悉Eager 模式;

    典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com ...

  8. 深度学习之TensorFlow构建神经网络层

    深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...

  9. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

随机推荐

  1. linux 之网络命令

    write 给用户发消息,用户必须在线,以ctrl+d保存结束 语法: write 用户 wall发广播信息(write all)  语法:wall 信息 mail 查看发送电子邮件 发送语法 : m ...

  2. vue---canvas实现二维码和图片合成的海报

    应项目需求,要一张宣传页面上加一个太阳码合成一张宣传海报,用户用微信可以识别进入微信小程序. 1. npm安装 npm install html2canvas --save   //html转canv ...

  3. foreach和List.Foreach 退出循环相关问题

    foreach: continue;:退出本次循环 break;:退出循环 return;:退出循环 List.Foreach: return;:退出本次循环 小结:list.Foreach中不能退出 ...

  4. Linux安装jdk.18和tomcat8

    JDK1.8的安装 第一步:下载JDK1.8 1.百度搜索jdk1.8,打开属于oracle官网的搜索结果项 2.先点击接受协议选项,然后选择要下载的64位linux版本jdk,直接单击通过浏览器下载 ...

  5. 网站图片的轮播JS代码

    这是几个网站的轮播JS效果,实现图片按照时间来切换,目前有几个站实现该功能,特别是浴室柜网站改版前,以下就是JS具体内容可以自己改下路径就可以用的linkarr = new Array();picar ...

  6. PowerScript数据类型及变量

    PowerBuilder的标准数据类型共有14种 数据类型 意    义 示    例 Blob 二进制数据 可存放可变长度的大量数据,如图片,其它类型的文档数据. 如保存位图 Boolean 布尔型 ...

  7. 用python计算圆周率Π

    一.要求: 1.计算到圆周率后面越多位越好. 2.用进度条显示计算的进度. 3.要求给出圆周率Π的具体计算方法和解释. 二.算法: 1.拉马努金公式: 2.高斯-勒让德公式: 设置初始值: 反复执行以 ...

  8. 【CSS】面试知识整理

    手写clearfix .clearfix:after { content: ''; display: table; clear: both; } .clearfix { *zoom:; } flex布 ...

  9. selenium之 chromedriver与chrome版本映射表(更新至v2.46)

    chromedriver版本 支持的Chrome版本 v2.46 v71-73 v2.45 v70-72 v2.44 v69-71 v2.43 v69-71 v2.42 v68-70 v2.41 v6 ...

  10. JavaSE基础知识(5)—面向对象(对象数组和对象关联)

    一.对象数组 1.说明 数组的定义类型为对象类型 2.动态初始化 1.声明并开辟空间 Person[] pers = new Person[长度];2.赋值 for(int i=0;i<pers ...