文章目录
训练神经网络的过程
1.定义神经网络的结构和前向传播的输出结果
2.定义损失函数以及选择反向传播优化的算法
3.生成会话(tf.Session),并且在训练数据上反复运行反向传播优化算法。
无论神经网络的结构如何变化,这三个步骤是不变的。
Tensorflow里最基本的三个概念
1.计算图(计算模型)
2.张量(数据模型)
3.会话(运行模型)
Tensorflow程序的两个阶段:
1.定义计算图中的所有计算
2.执行计算(声明一个会话并通过会话计算结果)
计算模型—计算图
- 定义计算
(自动将定义的计算转化为计算图上的节点)
Import tensorflow as tf
a = tf.constant([1.0,2.0],name = “a”,dtype = tf.float32)
b = tf.constant([2.0,3.0],name = “b”)//默认为int32
result = a+b
- 在计算图g1中定义变量“v”,并设置初始值为0
(变量的作用就是保存和更新神经网络中的参数)
g1=tf.Graph()
with g1.as_default():
v = tf.get_variable(“v”,initializer = tf.zeros_initializer(shape=[1]))
- Tensorflow会自动生成一个默认的计算图,如果没有特殊指定,运算会自动加入这个计算图中。
获取默认计算图:tf.get_default_graph()
生成新的计算图g1:g1 = tf.Graph()
通过tf.Graph.device函数来指定运行计算的设备
with g1.device(‘/gpu:0’);
result = a+b
1.不同计算图上的张量和运算都不会共享
2.在一个计算图中可以通过集合来管理不同类别的资源
通过tf.get_collection
获取一个集合里面所有的资源(变量、张量或者运行Tensorflow程序所需的队列资源)
数据模型—张量
-
所有数据都通过张量的形式来表示,可以理解为多维数组
(0阶张量表示标量,一阶张量表示为向量,n阶张量表示为n维数组)
张量主要保存三个属性:名字、纬度、类型
Tensor(“add:0”,shape = (2,),dtype = float32)
-
张量的使用
1.对中间计算结果的引用
2.当计算图构造完成后,张量可以用来获得计算结果
张量本身没有存储具体的数字,但通过会话可以得到具体数字tf.Session().run(result)
运行模型—会话
-
会话拥有并管理Tensorflow程序运行时的所有资源,所有计算完成之后需要关闭会话来帮助系统回收资源。
-
会话模式有两种
1.明确调用会话生成函数和关闭会话函数
sess = tf.Session()//创建会话
sess.run(result)//获取张量result的值
sess.close()//关闭会话释放资源
2.为了解决异常退出后关闭会话函数没有被指执行导致的资源泄漏,可以通过Python上下文管理器来使用会话
with tf.Session() as sess:
sess.run(result)
- 设定默认会话计算张量的取值
sess = tf.Session()
with sess.as_default():
print(result.eval())
或者
sess = tf.Session()
print(sess.run(result))或者print(result.eval(session=sess))
- 使用
tf.InteractiveSession
函数自动将生成的会话注册为默认会话
sess = tf.InteractiveSession()
print(result.eval())
sess.close()
- 通过
ConfigProto Protocol Buffer
来配置需要生成的会话
(并行的线程数、GPU分配策略、运算超时时间等)
config = tf.ConfigProto(allow_soft_placement = True,log_device_placement = True)
第一个参数:GPU运算可以放在CPU上运行
第二个参数:记录每个节点被安排在哪个设备上以方便调试
sess1 = tf.IntertactiveSession(config = config)
sess2 = tf.Session(config=config)
Tensorflow实现神经网络
使用神经网络解决分类问题:
1.提取问题中实体的特征向量作为神经网络的输入
2.定义神经网络的结构,并定义如何从神经网络的输入得到输出(神经网络的前向传播算法)
3.通过训练数据来调整神经网络中参数的取值
4.使用训练好的神经网络来预测未知的数据
前向传播算法简介(全连接网络)
不同输入的权重就是神经元的参数,神经网络的优化过程就是优化神经元中参数取值的过程
前向传播算法就是矩阵乘法:
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
- 神经网络参数与TensorFlow变量
在Tensorflow中,变量的作用就是保存和更新神经网络中的参数,给参数赋予随机初始值最为常见
weights = tf.Variable(tf.random_normal([2,3],stddev = 2))
(声明了一个2*3的矩阵变量,矩阵元素均值为0,标准差为2的随机数)
-
在神经网络中,偏置项通常会使用常数来设置初始值
biases = tf.Variable(tf.zeros([3]))
-
使用其他变量的初始值来初始化新的变量
w2 = tf.Variable(weights.initialized_value())
-
一个“变量”的值在被使用之前,这个变量的“初始化过程”需要被明确的调用
sess = tf.Session()
sess.run(w1.initializer)//初始化w1
sess.run(w2.initializer)//初始化w2
print(sess.run(y))
sess.close()
- 通过
tf.global_variables_initializer
函数实现初始化所有变量(所有的变量都会被自动加入到GraphKeys.VARIABLES)
init_op = tf.global_variables_initializer()
sess.run(init_op)
-
使用监督学习的方式设置神经网络的参数
(需要标注好的训练数据) -
在神经网路优化算法中,最常用的方法是反向传播算法。
步骤(迭代的过程):
1.选取一小部分训练数据(batch,有正确答案标注)
2.计算当前神经网络模型的预测答案与正确答案之间的差距
3.基于差距更新神经网络参数的取值,使得在这个batch上神经网络的预测结果和真实答案更加接近 -
placehoder用于提供输入数据(替代常量)
x = tf.placeholder(tf.float32,shape=(1,2),name=“input”)
-
在计算前向传播结果时,需要提供一个feed_dict来指定x的取值
print(sess.run(y,feed_dict = {x:[[0.7,0.9]]}))
-
一次性计算多个样例的前向传播结果
x = tf.placeholder(tf.float32,shape=(3,2),name=“input”)
print(sess.run(y,feed_dict = {x:[[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))
- 在得到一个batch的前向传播结果之后,需要定义一个损失函数来刻画当前的预测值和真实答案之间的差距,然后通过反向传播算法来调整参数使差距缩小
cross_entropy(损失函数)
train_step(优化算法)