tensorflow学习

来源:互联网 发布:vue.js 实现网页下载 编辑:程序博客网 时间:2024/06/05 19:37

第三章 tensorflow入门

import tensorflow as tf

3.1 tensorflow计算模型——计算图

a=tf.constant([1.0,2.0],name="a")b=tf.constant([2.0,3.0],name="b")result=a+btf.get_default_graph()#获取当前默认的计算图g1=tf.Graph()#生成新的计算图with g1.as_default():  #在计算图g1中定义变量"v",并设置初始值为0  v=tf.get_variable(    "v",nitializer=tf.zros_initializer(shape=[1]))

不同计算图上的张量和运算都不会共享.
tensorflow 的计算图不仅仅可以用来隔离张量和计算,它还提供了管理张量和计算的机制。

tf.Graph.device('/gpu:0')#制定运行计算的设备

有效地整理tensorflow程序中的资源也是计算图的重要功能。。在一个计算图中可以使用集合来管理不同个类别的资源。tf.add_collection()将资源加入到一个或多个集合,tf.get_collection()获取一个集合里面的所有资源。这里的资源可以是张量、变量或者运行tensorflow程序所需要的队列资源。
为了方便,tensorflow也自动管理了一些最常用的集合。

3.2 tensorflow数据模型——张量

零阶张量是标量,一阶张量是向量,n阶张量是n维数组。但是张量在Tensorflow 中的实现并不是直接采用数组的形式,只是对tensorflow中运算结果的引用。在张量中并没有真正保存数字,而是保存的如何得到这些数字的过程。一个张量中主要保存了三个属性:name,shape,type

tensorflow支持十四种不同的类型,实数tf.float32,tf.float64,整数tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8,布尔tf.bool,复数tf.complex64,tf.complex128

张量的使用主要可以总结为两大类:

对中间计算结果的引用。
计算图构造完成后,张量可以用来获得计算结果。tf.Session.run(result)

3.3 tensorfow运行模型——会话

使用会话的模式:

明确调用会话生成函数和会话关闭函数。

sess=tf.Session()sess.run(..)sess.close()

缺点:当程序因为异常而退出时,关闭会话的函数可能就不会被执行从而导致资源泄露。为了解决退出时资源释放的问题,可以通过python 上下文管理器来使用会话。

with tf.Session() as sess:    sess.run(..)#当上下文退出时,会话关闭 和资源释放也就自动完成了
sess=tf.Session()(1)with sess.as_default():#手动指定默认的会话,可以通过eval还是哪壶来计算一个张量的值    print (result.eval())(2print result.eval(session=sess)print sess.run(result)

交互式环境下直接构建默认会话的函数。
tf.InteractiveSession()自动将生成的会话注册为默认会话。

无论使用那种方式都可以通过configproto protocol buffer来配置需要生成的会话:

config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True)sess1=tf.InteractiveSession(config=config)sess2=tf.Session(config=config)

tensorflow实现神经网络

第四章 深层神经网络

4.1 深度学习与深层神经网络

4.1.1 线性模型的局限性

只通过线性变换,任意层的全连接神经网络和单层的神经网络没有区别。
y=(xW1)W2=xW

4.1.2 激活函数实现去线性化

tf.nn.relu
tf.nn.sigmoid
tf.nn.tanh

4.1.3 多层神经网络解决异或问题

4.2 损失函数

4.2.1 经典损失函数

分类问题

  • 交叉熵
    多分类问题如何判断一个输出向量和期望的向量有多接近?
    期望的输出[0,0,1,0,0]
    交叉熵:刻画两个概率分布之间的距离。给定两个概率分布p\q。
    H(p,q)=xp(x)logq(x)
    含义:通过q来表达p的困难程度。所以p代表期望,q代表预测。 交叉熵越小,两个概率分布越接近。
    如何得到预测的概率分布:softmax函数,把输出层变成一个概率分布。
    例如:H((1,0,0),(0.5,0.4,0.1))=(1log0.5+0log0.4+0log0.1)=0.3
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)

y_代表真实值,y代表预测值。tf.clip_by_value可以将一个张量中的数值限制在一个范围内,避免一些运算错误,比如log0是无效的。
*代表元素对应相乘。tf.matmul代表矩阵乘法。

cross_entropy=tf.nn.softmax_cross_entropy_with_logits(y,y_)#因为交叉熵一般和softmax一起使用,所以进行了封装

回归问题

  • MSE
mse=tf.reduce_mean(tf.square(y-y_))

4.2.2 自定义损失函数

结合实际需要自定义损失函数。
例如:Loss(y,y__)= \sum_(i=1)f(y_i,y__)

loss=tf.reduce_sum(tf.select(tf.greater(v1,v2),(v1-v2)*a,(v2-v1)*b))#tf.greater()比较两个张量中的每一个元素的大小#tf.select()三个参数,第一个为条件判断,true选择第二个参数,否则选择第三个参数。都是在元素级别上判断的。

4.3 神经网络优化算法

反向传播
梯度下降

4.4 神经网络的进一步优化

4.4.1 学习率的设置

  • 指数衰减法tf.train.exponential_decay
    该函数实现了一下功能:
decayd_learning_rate=learning_rate*decay_rate^(global_step/decay_steps)
learning_rate=tf.train.exponential_decay(初始学习速率,global_step,decays_step,decay_rate,staircase=True)#每decays_step学习率乘以decay_rate#staircase=True 阶梯状下降#staircase=False 连续衰减

4.4.2 过拟合问题

无论哪一张正则化方式,基本的思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的噪音。但这两种正则化的方法也有很大区别。首先L1会让参数变得更稀疏,L2不会。所谓变的稀疏是指会有更多的参数变为0,这样可以达到类似特征选取的功能。之所以L2不会变的稀疏的原因是当参数很小时,比如0.001,这个参数的平方基本可以忽略,于是不会进一步调整为0。L1不可导。

tf.contrib.layers.l2_regularizer(lambda)(w)tf.contrib.layers.l1_regularizer(lambda)(w)

4.2.3 滑动平均模型:使模型在未知数据上更加健壮

tf.train.ExponentialMovingAverage
初始化ExponentialMovingAverage时,需要提供一个衰减速率,这个衰减率用于控制模型的更新速度。ExponentialMovingAverage对每一个变量都会维护一个影子变量,这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,应自变量的值都会更新:
shadow_variable=decay*shadow_variable+(1-decay)*variable
还提供了num_updates参数来动态设置decay的大小。如果提供了这个参数,那么decay=min{decay,1+num_updates/10+num_updates}

第五章 MNIST数字识别问题