专栏首页技术向tensorflow 常用API

tensorflow 常用API

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

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

不太懂的地方

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

使用计算图

#生成计算图
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")))
#如果有两个计算图,可以通过图的名称给隔离开

张量的属性

对于代码

result = tf.add(a, b, name = "add")
print result

此代码的输出是这样的:

Tensor("add:0", shape=(2,),dtype = float32)
  • 名字 node:src_output

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

  • 维度

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

  • 类型type

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

使用with的区别

第一种会话方式

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

第二种会话方式

with tf.Session as sess:
    sess.run()

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

神经网络前向传播算法

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

w系数:

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

神经网络的反向传播算法

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

激活函数

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

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

损失函数

  • 交叉熵

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

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

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

在tensorflow中相关的代码如下:

#交叉熵计算
#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)
  • 平方损失函数

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

具体函数如下:

mse = tf.reduce_mean(tf.square(y_ - y))
  • 自定义损失函数

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

loss = tf.reduce_sum( tf.where( tf.greater(v1, v2), (v1 - v2 )*a, (v2 - v1)*b))

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

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

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

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

学习率

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

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正则化

在代码中使用正则化

loss = tf.reduce_mean( tf.square( y_ - y)) + tf.contrib.layers.l2_regular( lambda)(w)

使用collection增加代码可读性

滑动平均模型

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

变量管理

Save模型与代码优化

p112

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

迁移学习与slim

TFRecord

图像预处理

数据集

循环神经网络

LSTM

指定GPU

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

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

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

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"

设置定量的GPU使用量

config = tf.ConfigProto() 
config.gpu_options.per_process_gpu_memory_fraction = 0.9 # 占用GPU90%的显存 
session = tf.Session(config=config)

#设置最小的GPU使用量

config = tf.ConfigProto() 
config.gpu_options.allow_growth = True 
session = tf.Session(config=config)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 安装nvidia-docker

    本文主要介绍安装docker-ce与nvidia-docker的过程。注意不是docker.io, 因为nvidia-docker是基于docker-ce的,c...

    羽翰尘
  • 在docker中解决软件动态库问题 & 安装opencv_python

    本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/docker/dynamic_lib_in_docker_openc...

    羽翰尘
  • nextcloud性能调优

    默认的nextcloud是Apache web, 我们将其换为nginx,通过搭配nextcloud-fpm和nginx两个docker完成。

    羽翰尘
  • TensorFlow API 树 (Python)

    Petrichor_
  • 机器学习基础

    监督学习:训练时有输入及对应的输出结果的学习方式。目前推荐的学习方式,适合有比较好数据源的场景 非监督学习:训练时只有输入,不知道结果的学习方式。各种数据不完善...

    企鹅号小编
  • tensorflow零起点快速入门(5) --强化学习摘录截图

    嘘、小点声
  • TensorFlow强化学习入门(3)——构建仿真环境来进行强化学习

    在上一篇文章中,我演示了如何设计一个基于策略的强化学习agent来解决CartPole任务。在本文中,我们将从另一个角度重新审视这个问题——如何构建仿真环境来提...

    ArrayZoneYour
  • 多任务验证码识别

    使用Alexnet网络进行训练,多任务学习:验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、...

    anytao
  • TensorFlow从0到1 | 第十二章:TensorFlow构建3层NN玩转MNIST

    上一篇 11 74行Python实现手写体数字识别展示了74行Python代码完成MNIST手写体数字识别,识别率轻松达到95%。这算不上一个好成绩,不过我并不...

    用户1332428
  • tf21: 身份证识别——识别身份证号

    上一篇: 身份证识别——生成身份证号和汉字 代码直接参考,验证码识别 #!/usr/bin/env python2 # -*- coding: utf-8 -*...

    MachineLP

扫码关注云+社区

领取腾讯云代金券