前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tensorflow 常用API

tensorflow 常用API

作者头像
羽翰尘
修改2019-11-26 15:39:43
4870
修改2019-11-26 15:39:43
举报
文章被收录于专栏:技术向技术向

本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/tensorflow-basic/

主要是通读《TensorFlow实战Google深度学习框架》的记录

不太懂的地方

  • p78 交叉熵算完之后的值是n*m的矩阵?
  • p89 使用collection增加代码可读性
  • p91 使用滑动平均模型
  • p107 变量管理

使用计算图

代码语言:txt
复制
#生成计算图
g1 = tf.Graph()
with g1.as_default():
    v = tf.get_variable(
        "v", initializer = tf.zeros_initializer(shape = [1])
    )
#在计算图中读取变量的值
with tf.Session(graph = g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse = True):
        #这行会输出[0.]
        print(sess.run(tf.get_variable("v")))
#如果有两个计算图,可以通过图的名称给隔离开

张量的属性

对于代码

代码语言:txt
复制
result = tf.add(a, b, name = "add")
print result

此代码的输出是这样的:

代码语言:txt
复制
Tensor("add:0", shape=(2,),dtype = float32)
  • 名字 node:src_output

node是节点名称,src_output是当前张量来自节点的第几个输出

  • 维度

shape=(2,)说明是一个一维数组,长度为2

  • 类型type

注意tensorflow会检查类型,不指定类型时按照默认类型,如1认为是int32, 1.0认为是float32

使用with的区别

第一种会话方式

代码语言:txt
复制
sess = tf.Session()
sess.run()
sess.close()

第二种会话方式

代码语言:txt
复制
with tf.Session as sess:
    sess.run()

推荐第二种方式,不需要显式关闭会话

神经网络前向传播算法

下图是包含一个隐含层的全连接神经网络

w系数:

表示第1层次数,从后一层的第j个节点连接到前一层的第i个节点

神经网络的反向传播算法

综述:在每次迭代的开始,都要选取一小部分数据,称为batch,通过前向传播算法得到神经网络的预测结果。因为训练数据都是有正确答案标注的,所以可以计算预测值与真实值的差距,然后通过反向传播算法更新神经网络参数的取值。

激活函数

使用激活函数的目的:如果神经网络是线性的,由于矩阵相乘可以化简,形式上任意层的全连接神经网络和单层的神经网络模型的表达能力相同。

网络结构图中1的由来:用来表示偏置项,1应该是表示这是一个常量

损失函数

  • 交叉熵

这是一个信息论里面的概念,原本用来估算平均编码长度,这里用来判断预测答案和真实答案之间的距离

q(x)是预测答案,p(x)是正确答案

然而,分类问题中,神经网络的输出并不能严格依据概率分布(即所有的概率相加为1),引出softmax函数

在tensorflow中相关的代码如下:

代码语言:txt
复制
#交叉熵计算
#y_是正确答案, y是预测答案
# 乘法使用的是元素相乘,得到的结果是
cross_entropy = - tf.reduce_mean( y_ * tf.log( tf.clip_by_value(y, 1e-10, 1.0)))

#限制张量的数值大小
#将y的范围限制在 1e-10 和 1之间,避免log0 之类的无意义计算
tf.clip_by_value(y, 1e-10, 1.0)

#自带的交叉熵公式
cross_entropy = tf.nn.softmax_cross_entropy_with_logits( labels= y_, logits = y)
  • 平方损失函数

与分类问题相对, 回归问题主要是对具体数值的预测,一般网络的输出只有一个节点。常用的均方误差

具体函数如下:

代码语言:txt
复制
mse = tf.reduce_mean(tf.square(y_ - y))
  • 自定义损失函数

在具体问题,网络的优化目的不同,应该使用不同的损失函数。一个自定义损失函数的例子

代码语言:txt
复制
loss = tf.reduce_sum( tf.where( tf.greater(v1, v2), (v1 - v2 )*a, (v2 - v1)*b))

反向传播算法与梯度下降、随机梯度下降

梯度下降可以达到局部最优,但是每次都要计算所有的损失函数。

随机梯度下降(stochastic gradient descent)会计算一条数据的损失函数,甚至达不到局部最优。

实际使用中使用一个batch的损失函数

学习率

使用衰减的学习率可以让模型更加稳定。

代码语言:txt
复制
global_step = tf.Variable(0)

#通过exponential_decay生成学习率
learning_rate = tf.train.exponential_decay( 0.1, global_step, 100, 0.96, staircase = True)

#使用指数衰减的学习率,在minimize中传入了global_step,将自动更新global_step参数,从而学习率也得到更新
learning_step = tf.train.GradientDescentOptimizer( learning_rate).minimize(loss_function, global_step = global_step)

过拟合

过拟合的表现是模型训练精度高,实测精度差,即泛化能力弱。可以说是模型太复杂,也可以相对的认为训练样本过少。

  • 正则化

为了防止过拟合, 在训练的时候不是直接优化损失函数,而是优化 $J(\theta ) + \lambda R(w)$, $R(w)$表示模型的复杂程度, $\lambda$表示模型复杂损失在总损失中的比例

  • 模型复杂度函数

L1正则化

L2正则化

在代码中使用正则化

代码语言:txt
复制
loss = tf.reduce_mean( tf.square( y_ - y)) + tf.contrib.layers.l2_regular( lambda)(w)

使用collection增加代码可读性

滑动平均模型

在采用随机梯度下降算法训练神经网络时,使用滑动平均模型在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现

变量管理

Save模型与代码优化

p112

  • 保存模型
代码语言:txt
复制
saver = tf.train.Saver()
with tf.Session() as sess:
    ...
    saver.save(sess, 'your_path')
  • 恢复模型
代码语言:txt
复制
variables definitions...
saver = tf.train.Saver()
with tf.Session as sess:
    saver.restore(sess, 'your_path')

迁移学习与slim

TFRecord

图像预处理

数据集

循环神经网络

LSTM

指定GPU

在多用户的GPU服务器上跑代码,默认可能会使用GPU0,这时,

如果其他人也使用了GPU0, 很可能会资源分配不足报错。

使用下面的代码可以指定运行的GPU。

代码语言:txt
复制
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"

设置定量的GPU使用量

代码语言:txt
复制
config = tf.ConfigProto() 
config.gpu_options.per_process_gpu_memory_fraction = 0.9 # 占用GPU90%的显存 
session = tf.Session(config=config)

#设置最小的GPU使用量

代码语言:txt
复制
config = tf.ConfigProto() 
config.gpu_options.allow_growth = True 
session = tf.Session(config=config)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不太懂的地方
  • 使用计算图
  • 张量的属性
  • 使用with的区别
  • 神经网络前向传播算法
  • 神经网络的反向传播算法
  • 激活函数
  • 损失函数
  • 反向传播算法与梯度下降、随机梯度下降
  • 学习率
  • 过拟合
  • 使用collection增加代码可读性
  • 滑动平均模型
  • 变量管理
  • Save模型与代码优化
  • 迁移学习与slim
  • TFRecord
  • 图像预处理
  • 数据集
  • 循环神经网络
  • LSTM
  • 指定GPU
  • 设置定量的GPU使用量
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档