Tensorflow实战学习(四十八)【系统架构,设计理念,编程模型,API,作用域,批标准化,神经元函数优化】

第4章 TensorFlow基础知识 第4章 TensorFlow基础知识 本章主要参考TensorFlow官方网站上的新手入门[1]和扩展教程[2],讲解TensorFlow的基本概念。本章从系统架构、设计理念、编程模型、常用API、存储与加载模型、线程及队列、加载数据、自定义操作等多个方面进行讲解,相信通过本章的学习,读者会对TensorFlow的全貌有一个基本的认识。本章的学习对理解TensorFlow的原理和实战非常重要,读... 阅读详情

系统架构。
自底向上,设备层、网络层、数据操作层、图计算层、API层、应用层。核心层,设备层、网络层、数据操作层、图计算层。最下层是网络通信层和设备管理层。
网络通信层包括gRPC(google Remote Procedure Call Protocol)和远程直接数据存取(Remote Direct Memory Access,RDMA),分布式计算需要。设备管理层包手包括TensorFlow分别在CPU、GPU、FPGA等设备上的实现。对上层提供统一接口,上层只需处理卷积等逻辑,不需要关心硬件上卷积实现过程。
数据操作层包括卷积函数、激活函数等操作。
图计算层包括本地计算图和分布式计算图实现(图创建、编译、优化、执行)。

应用层:训练相关类库、预测相关类库
API层:Python客户端、C++客户端、Java客户端、Go客户端,TensorFlow核心API
图计算层:分布式计算图、本地计算图
数据操作层:Const、Var、Matmul、Conv2D、Relu、Queue
网络层:gPRC、RDMA
设备层:CPU、GPU

设计理念。
图定义、图运行完全分开。符号主义。命令式编程(imperative style programming),按照编写逻辑顺序执行,易于理解调试。符号式编程(symbolic style programming),嵌入、优化,不易理解调试,运行速度快。Torch命令式,Caffe、MXNet混合,TensorFlow完全符号式。符号式计算,先定义各种变量,建立数据流图,规定变量计算关系,编译数据流图,这时还只是空壳,只有把数据输入,模型才能形成数据流,才有输出值。
TensorFlow运算在数据流图中,图运行只发生在会话(session)中。开启会话,数据填充节点,运算。关闭会话,无法计算。会话提供操作运行和Tensor求值环境。

    import tensorflow as tf
    #创建图
    a = tf.constant([1.0,2.0])
    b = tf.constant([3.0,4.0])
    c = a * b
    #计算c
    print sess.run(c)#进行矩阵乘法,输出[3.,8.]
    sess.close()

编程模型。
TensorFlow用数据流图做计算。创建数据流图(网络结构图)。TensorFlow运行原理,图中包含输入(input)、塑形(reshape)、Relu层(Relu layer)、Logit层(Logit layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD训练(SGD Trainer),简单回归模型。
计算过程,从输入开始,经过塑形,一层一层前向传播运算。Relu层(隐藏层)有两个参数,Wh1、bh1,输出前用ReLu(Rectified Linear Units)激活函数做非线性处理。进入Logit层(输出层),学习两个参数Wsm、bsm。用Softmax计算输出结果各个类别概率分布。用交叉熵度量源样本概率分布和输出结果概率分布之间相似性。计算梯度,需要参数Wh1、bh1、Wsm、bsm、交叉熵结果。SGD训练,反向传播,从上往下计算每层参数,依次更新。计算更新顺序,bsm、Wsm、bh1、Wh1。
TensorFlow,张量流动。TensorFlow数据流图由节点(node)、边(edge)组成有向无环图(directed acycline graph,DAG)。TensorFlwo由Tensor和Flow两部分组成。Tensor(张量),数据流图的边。Flow(流动),数据流图节点操作。
SGD训练:
Wh1 bh1 Wsm bsm
更新Wh1 更新bh1 更新Wsm 更新bsm
learning)rat=[0.01]
Gradients
交叉熵
classes=[10] 类标记 Softmax
Logit层:
bsm BiasAdd
Wsm MatMul
Relu层:
ReLU
bh1 Bias Add
Wh1 MatMul
塑形shape=[784,1]
输入

边。数据依赖、控制依赖。实线边表示数据依赖,代表数据,张量(任意维度的数据)。机器学习算法,张量在数据流图从前往后流动,前向传播(forword propagation)。残差(实际观察值与训练估计值的差),从后向前流动,反向传播(backword propagation)。虚线边表示控制依赖(control dependency),控制操作运行,确保happens-before关系,边上没有数据流过,源节点必须在目的节点开始执行前完成执行。
TensorFlow张量数据属性:
数据类型 Python类型 描述
DT_FLOAT tf.float32 32位浮点型
DT_DOUBLE tf.float64 64位浮点型
DT_INT64 tf.int64 64位有符号整型
DT_INT32 tf.int32 32位有符号整型
DT_INT16 tf.int16 16位有符号整型
DT_INT8 tf.int8 8位有符号整型
DT_UINT8 tf.uint8 8位无符号整型
DT_STRING tf.tring 要变长度字节数组,每一张量元素是一字节数组
DT_BOOL tf.bool 布尔型
DT_COMPLEX64 tf.complex64 两个32位浮点数组成复数,实部、虚部
DT_QINT32 tf.qint32 量化操作32位有符号整型,信号连续取值或大量可能离散取值,近似为有限多个或较少离散值
DT_QINT8 tf.qint8 量化操作8位有符号整型
DT_QUINT8 tf.quint8 量化操作8位无符号整型
图和张量实现源代码:tensorflow-1.1.0/tensorflow/python/framework/ops.py

节点。算子。代表一个操作(operation,OP)。表示数学运算,也可以表示数据输入(feed in)起点和输出(push out)终点,或者读取、写入持久变量(persistent variable)终点。
操作相关代码位于: tensorflow-1.1.0/tensorflow/python/ops/
TensoFlow实现算子(操作):
类别 示例
数学运算操作 Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal……
tensorflow-1.1.0/tensorflow/python/ops/math_ops.py,每个函数调用gen_math_ops.py,位于Python库stite-packages/tensorflow/python/ops/gen_math_ops.py ,又调用tensorflow-1.1.0/tensorflow/core/kernels/下核函数实现
数组运算操作 Concat、Slice、Split、Constant、Rank、Shape、Shuffle……
tensorflow-1.1.0/tensorflow/python/ops/array_ops.py,每个函数调用gen_array_ops.py,位于Python库stite-packages/tensorflow/python/ops/gen_array_ops.py ,又调用tensorflow-1.1.0/tensorflow/core/kernels/下核函数实现
矩阵运算操作 MatMul、MatrixInverse、MatrixDeterminant……
有状态操作 Variable、Assign、AssignAdd……
神经网络构建操作 SoftMax、Sigmoid、ReLU、Convolution2D、MaxPool……
检查点操作 Save、Restore
队列和同步操作 Enqueue、Dequeue、MutexAcquire、MutexRelease……
控制张量流动操作 Merge、Switch、Enter、Leave、NextIteration

图。操作任务描述成有向无环图。创建各个节点。

    import tensorflow as tf
    #创建一个常量运算操作,产生一个1x2矩阵
    matrix1 = tf.constant([[3.,3.]])
    #创建另外一个常量运算操作,产生一个2x1矩阵
    matrix2 = tf.constant([[2.],[2.]])
    #创建一个矩阵乘法运算,把matrix1和matrix2作为输入
    #返回值product代表矩阵乘法结果
    product = tf.matmul(matrix2,matrix2)

会话。启动图第一步创建一个Session对象。会话(session)提供图执行操作方法。建立会话,生成一张空图,会话添加节点和边,形成图,执行。tf.Session类创建并运行操作。

    with tf.Session as sess:
        result = sess.run([product])
        print result

调用Session对象run()方法执行图,传入Tensor,填充(feed)。返回结果类型根据输入类型而定,取回(fetch)。
会话是图交互桥梁,一个会话可以有多个图,会话可以修改图结构,可以往图流入数据计算。会话两个API:Extend(图添加节点、边)、Run(输入计算节点和和填充必要数据,运算,输出运算结果)。
会话源代码: tensorflow-1.1.0/tensorflow/python/client/session.py

设备(device)。一块用作运算、拥有自己地址空间的硬件。CPU、GPU。TensorFlow可以提定操作在哪个设备执行。with tf.device(“/gpu:1”): 。

变量(variable)。特殊数据。图中有固定位置,不流动。tf.Variable()构造函数。初始值形状、类型。

    #创建一个变量,初始化为标量0
    state = tf.Variable(0,name="counter")

创建常量张量:

    state = tf.constant(3.0)

填充机制。构建图用tf.placeholder()临时替代任意操作张量,调用Session对象run()方法执行图,用填充数据作参数。调用结束,填充数据消失。

    input1 = tf.placeholder(tf.float32)
    input2 = tf.placeholder(tf.float32)
    output = tf.mul(input1,input2)
    with tf.Session() as sess:
        #输出[array([24.],dtype=float32)]
        print sess.run([output],feed_dict={input1:[7.],input2:[2.]})

变量源代码: tensorflow-1.1.0/tensorflow/python/ops/variables.py

内核。操作(operation),抽象操作统称。内核(kernel),运行在特定设备(CPU、GPU)上操作的实现。同一操作可能对应多个内核。自定义操作,新操作和内核注册添加到系统。

常用API。
图。TensorFlow计算表现为数据流图。tf.Graph类包含一系列计算操作对象(tf.Operation)和操作间流动数据张量对象(tf.Tensor)。
操作 描述
tf.Graph.init() 创建一个空图
tf.Graph.as_default() 将某图设置为默认图,返回一个上下文管理器。不显示添加默认图,系统自动设置全局默认图。模块范围内定义节点都加入默认图
tf.Graph.device(device_name_or_function) 定义运行图所使用设备,返回上下文管理器
tf.Graph.name_scope(name) 为节点创建层次化名称,返回上下方管理器

tf.Operaiotn类代表图中节点,用于计算张量数据。由节点构造器(如tf.matmul()、Graph.create_op())产生。
操作 描述
tf.Operation.name 操作名称
tf.Operation.type 操作类型
tf.Operation.inputs 操作输入
tf.Operation.outputs 操作输出
tf.Operation.control_inputs 操作依赖
tf.Operation.run(feed_dict=None,session=None) 在会话中运行操作
tf.Operation.get_attr(name) 获取操作属性值

tf.Tensor类,操作输出符号句柄,不包含操作输出值,提供在tf.Session中计算值方法。操作间构建数据流连接,TensorFlow能免执行大量步多计算图形。
操作 描述
tf.Tensor.dtype 张量数据类型
tf.Tensor.name 张量名称
tf.Tensor.value_index 张量操作输出索引
tf.Tensor.graph 张量所在图
tf.Tensor.op 产生张量操作
tf.Tensor.consumers() 返回使用张量操作列表
tf.Tensor.eval(feed_dict=None,session=None) 会话中求张量值,使用sess.as_default()、eval(session=sess)
tf.Tensor.get_shape() 返回表示张量形状(维度)类TensorShape
tf.Tensor.set_shape(shape) 更新张量形状
tf.Tensor.device 设置计算张量设备

可视化。
在程序中给节点添加摘要(summary),摘要收集节点数据,标记步数、时间戳标识,写入事件文件(event file)。tf.summary.FileWriter类在目录创建事件文件,向文件添加摘要、事件,在TensorBoard展示。
操作 描述
tf.summary.FileWriter.init(logdir,graph=None,max_queue=10, flush_secs=120,graph_def=None) 创建FileWriter和事件文件,logdir中创建新事件文件
tf.summary.FileWriter.add_summary(summary,global_step=None) 摘要添加到事件文件
tf.summary.FileWriter.add_event(event) 事件文件添加事件
tf.summary.FileWriter.add_graph(graph,global_step=None,graph_def=None) 事件文件添加图
tf.summary.FileWriter.get_logdir() 事件文件路径
tf.summary.FileWriter.flush() 所有事件上写入磁盘
tf.summary.FileWriter.close() 事件写入磁盘,关闭文件操作符
tf.summary.scalar(name,tensor,collections=None) 输出单个标量值摘要
tf.summary.histogram(name,values,collections=None) 输出直方图摘要
tf.summary.audio(name,tensor,sample_rate,max_outputs=3,collections=None) 输出音频摘要
tf.summary.image(name,tensor,max_outputs=3,collections=None) 输出图片摘要
tf.summary.merge(inputs,collections=None,name=None) 合并摘要,所有输入摘要值

变量作用域。
TensorFlow两个作用域(scope),name_scope(给op_name加前缀),variable_scope(给variable_name、op_name加前缀)。
variable_scope变量作用域机制:
v = tf.get_variable(name,shape,dtype,initializer)#通过名字创建或返回变量
tf.variable_scope()#给变量指定命名空间
tf.get_variable_scope().reuse==False(默认为False,不能得用),variable_scope作用域只能创建新变量。tf.get_variable_scope().reuse==True,作用域共享变量,with tf.variable_scope(name,reuse=True),或scope.reuse_variables()。
tf.variable_scope()获取变量作用域。开户变量作用域使用之前预先定义作用域,跳过当前变量作用域,保持预先存在作用域不变。
变量作用域可以默认携带一个初始化器。子作用域或变量可以继承或重写父作用域初始化器值。
op_name在variable_scope作用域操作,会加上前缀。
variable_scope主要用在循环神经网络(RNN)操作,大量共享变量。
name_scope。划分变量范围,可视化中表示在计算图一个层级。name_scope影响op_name,不影响用get_variable()创建变量。影响用Variable()创建变量。给操作加名字前缀。

批标准化。batch normalization,BN。优化梯度弥散问题(vanishing gradient problem)。
统计机器学习,ICS(Internal Covariate Shift)理论,源域(source domain)和目标域(target domain)数据分布一致。训练数据和测试数据满足相同分布。是通过训练数据获得模型在测试集获得好效果的基本保障。Covariate Shift,训练集样本数据和目标集分布不一致,训练模型无法很好泛化(generalization)。源域和目标域条件概率一致,边缘概率不同。神经网络各层输出,经层内操作,各层输出分布与输入信号分布不同,差异随网络加深变大,但每层指向样本标记(label)不变。解决,根据训练样本和目标样本比例矫正训练样本。引入批标准化规范化层输入(数据按比例缩放,落入小特定区间,数据去平均值,除以标准差),固定每层输入信号均值、方差。
方法。批标准化通过规范化激活函数分布在线性区间,加大梯度,模型梯度下降。加大探索步长,加快收敛速度。更容易跳出局部最小值。破坏原数据分布,缓解过拟合。解决神经网络收敛速度慢或梯度爆炸(gradient explode,梯度非常大,链式求导乘积变得很大,权重过大,产生指数级爆炸)。

    #计算Wx_plus_b均值方差,axes=[0]标准化维度
    fc_mean,fc_var = tf.nn.moments(Wx_plus_b, axes=[0])
    scale = tf.Variable(tf.ones([out_size]))
    shift = tf.Variable(tf.zeros([out_size]))
    epsilon = 0.001
    Wx_plus_b = tf.nn.batch.normalization(Wx_plus_b,fc_mean,fc_var,shift,scale,epsilon) 
    #Wx_plus_b = (Wx_plus_b - fc_mean) / tf.sqrt(fc_var + 0.001)
    #Wx_plus_b = Wx_plus_b * scale + shift

《Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift》,Serger Ioffe、Christian Szegedy。

神经元函数优化方法。

激活函数。activation function,运行时激活神经网络某部分神经元,激活信息向后传入下层神经网络。加入非线性因素,弥补线性模型表达力,把“激活神经元特征”通过函数保留映射到下层。神经网络数学基础处处可微,选取激活函数保证输入输出可微。激活函数不改变输入数据维度,输入输出维度相同。TensorFlow激活函数定义在tensorflow-1.1.0/tensorflow/python/ops/nn.py。tf.nn.relu()、tf.nn.sigmoid()、tf.nn.tanh()、tf.nn.elu()、tf.nn.bias_add()、tf.nn.crelu()、tf.nn.relu6()、tf.nn.softplus()、tf.nn.softsign()、tf.nn.dropout()。输入张量,输出与输入张量数据类型相同张量。
sigmoid函数。输出映射在(0,1)内,单调连续,适合作输出层,求导容易。软饱和性,输入落入饱和区,f’(x)变得接近0,容易产生梯度消失。软饱和,激活函数h(x)取值趋于无穷大时,一阶导数趋于0。硬饱和,当|x|>c,c为常数,f’(x)=0。relu左侧硬饱和激活函数。梯度消失,更新模型参数,采用链式求导法则反向求导,越往前梯度越小。最终结果到达一定深度后梯度对模型更新没有任何贡献。
tanh函数。软饱和性,输出0为中心,收敛速度比sigmoid快。也无法解决梯度消失。
relu函数。最受欢迎。softplus是ReLU平滑版本。relu,f(x)=max(x,0)。softplus, f(x)=log(1+exp(x))。relu在x<0时硬饱和。x>0,导数为1,relu在x>0时保持梯度不衰减,缓解梯度消失,更快收敛,提供神经网络稀疏表达能力。部分输入落到硬饱和区,权重无法更新,神经元死亡。TensorFlow relu6,min(max(features,0)) ,tf.nn.relu6(features,name=None)。crelu,tf.nn.crelu(features,name=None) 。
dropout函数。神经元以概率keep_prob决定是否被抑制。如果被抑制,神经元就输出0,否则输出被放到原来的1/keep_prob倍。神经元是否被抑制,默认相互独立。noise_shape调节,noise_shape[i]==shape(x)[i],x中元素相互独立。shape(x)=[k,l,m,n],x维度顺序批、行、列、通道。noise_shape=[k,1,1,n],批、通道互相独立,行、列数据关联,都为0,或原值。论文中最早做法,训练中概率p丢弃。预测中,参数按比例缩小,乘p。框架实现,反向ropout代替dropout,训练中一边dropout,再按比例放大,即乘以1/p,预测中不做任何处理。
激活函数选择。输入数据特征相差明显,用tanh,循环过程不断扩大特征效果显示。特征相差不明显,用sigmoid。sigmoid、tanh,需要输入规范化,否则激活后值全部进入平坦区,隐层输出全部趋同,丧失原有特征表达。relu会好很多,有时可以不做输入规范化。85%-90%神经网络都用ReLU。10-15%用tanh。

卷积函数。图像扫描二维过滤器。卷积函数定义,tensorflow-1.1.0/tensorflow/python/ops/nn_impl.py、nn_ops.py 。
tf.nn.convolution(input,filter,padding,strides=None,dilation_rate=None, name=None,data_format=None) 计算N维卷积和。
tf.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None),四维输入数据ipnut和四维卷积核filter操作,输入数据二维卷积操作,得到卷积结果。input,Tensor,数据类型floate32、floate64。filter,Tensor,数据类型floate32、floate64。strides:长度4一维整数类型数组,每一维度对应input每一维移动步数。padding,字符串,SAME 全尺寸操作 输入、输出数据维度相同,VALID 部分窗口 输入、输出数据维度不同。use_cudnn_on_gpu ,可选布尔值,默认True。name,可选,操作名字。输出,Tensor,数据类型floate32、floate64。
tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None, data_format=None),输入张量数据维度[batch,in_height,in_width,in_width,in_channels] ,卷积核维度[filter_height,filter_width,in_channel_multiplier],通道in_channels卷积深度1,depthwise_conv2d函数将不同卷积核独立应用在in_channels每个通道上,再把所有结果汇总。输出通道总数in_channels*channel_multiplier 。
tf.nn.separable_conv2d(input,depthwise_filter,pointwise_filter,strides,padding,rate=None,name=None,data_format=None) 用几个分离卷积核做卷积。用二维卷积核在每个通道上,以深度channel_multiplier卷积。depthwise_filter, 张量,数据四维[filter_height,filter_width,in_channels,channel_multiplier],in_channels卷积深度1。pointwise_filter,张量,数据四维[1,1,channel_multiplier*in_channels,out_channels],pointwise_filter,在depthwise_filter卷积后混合卷积。
tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)计算Atrous卷积,孔卷积,扩张卷积。
tf.nn.conv2d_transpose(value,filter,output_shape,strides,padding=’SAME’, data_format=’NHWC’,name=None),解卷积网络(deconvolutional network)中称’反卷积’,实际上是conv2d的转置。output_shape,一维张量,反卷积运算输出形状。
tf.nn.conv1d(value,filters,stride,padding,use_cudnn_on_gpu=None,data_format=None,name=None),计算给定三维输入和过滤器的一维卷积。输入三维[batch,in_width,in_channels],卷积核三维,少filter_height,[filter_width,in_channels,out_channels] ,stride正整数,卷积核向右移动每一步长度。
tf.nn.conv3d(input,filter,strides,padding,name=None)计算给定五维输入和过滤器的三维卷积。input shape多一维in_depth,形状Shape[batch,in_depth,in_height,in_width,in_channels] 。filter shape多一维filter_depth,卷积核大小filter_depth,filter_height,filter_width。strides多一维,[strides_batch, strides_depth,strides_height,strides_sidth,strides_channel],必须保证strides[0]=strides[4]=1。
tf.nn.conv3d_transpose(value,filter,output_shape,strides,padding=’SAME’, name=None)。

池化函数。神经网络,池化函数一般跟在卷积函数下一层,定义在tensorflow-1.1.0/tensorflow/python/ops/nn.py、gen_nn_ops.py。
池化操作,用一个矩阵窗口在张量上扫描,每个矩阵窗口中的值通过取最大值或平均值来减少元素个数。每个池化操作矩阵窗口大小ksize指定,根据步长strides移动。
tf.nn.avg_pool(value,ksize,strides,padding,data_format=’NHWC’,name=None)计算池化区域元素平均值。value,四维张量,数据维度[batch,height,width, channels]。ksize,长度不小于4整型数组,每位值对应输入数据张量每维窗口对应值。strides,长度不小于4整型数组,批定滑动窗口在输入数据张量每一维上的步长。padding,字符串,SAME或VALID。data_format,’NHWC’,输入张量维度顺序,N个数,H高度,W宽度,C通道数(RGB三通道或灰度单通道)。name,可选,操作名字。
tf.nn.max_pool(value,ksize,strides,padding,data_format=’NHWC’, name=None)计算池化区域元素最大值。
tf.nn.max_pool_with_argmax(input,ksize,strides,padding,Targmax=None, name=None),计算池化区域元素最大值和所在位置。计算位置agrmax,input铺平。如input=[b,y,x,c],索引位置((b*height+y)*width+x)*channels+c。只能在GPU运行。返回张量元组(output,argmax),output池化区域最大值,argmax数据类型Targmax,四维。
tf.nn.avg_pool3d()、tf.nn.max_pool3d() 三维平均池化和最大池化。
tf.nn.fractional_avg_pool()、tf.nn.tractional_max_pool()
tf.nn.pool(input,window_shape,pooling_type,padding,dilation_rate=None, strides=None,name=None,data_format=None)执行N维池化操作。

分类函数。定义在tensorflow-1.1.0/tensorflow/python/ops/nn.py、nn_ops.py。
tf.nn.sigmoid_cross_entropy_with_logits(logits,targets,name=None)。输入,logtis:[batch_size,num_classes],targets:[batch_size,size],logits用最后一层输入。输出,loss [batch_size,num_classes]。如作损失函数,神经网络最后一层不需要sigmoid运算。
tf.nn.softmax(logits,dim=-1,name=None)计算Softmax激活,softmax=exp(logits) /reduce_sum(exp(logits),dim)。
tf.nn.log_softmax(logits,dim=-1,name=None)计算log softmax激活,logsoftmax=logits-log(reduce_sum(exp(logits),dim))。
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,dim=-a,name=None)。输入,logits、lables [batch_size,num_classes] ,输出,loss [batch_size],保存batch 每个样本交叉熵。
tf.nn.sparse_softmax_cross_entropy_with_logits(logits,labels,name=None)。logits神经网络最后一层结果。输入,logits [batch_size,num_classes],labels [batch_size],必须在[0,num_classes]。输出,loss [batch_size],保存batch 每个样本交叉熵。

优化方法。加速训练优化方法,多数基于梯度下降。梯度下降求函数极值。学习最后求损失函数极值。TensorFlow提供很多优化器(optimizer)。
BGD法。bat gradient descent,批梯度下降。利用现有参数对训练集每个输入生成一个估计输出yi。跟实际输出yi比较,统计所有误差,求平均以后得到平均误差,以此更新参数。迭代过程,提取训练集中所有内容{x1,…,xn},相关输出yi 。计算梯度和误差,更新参数。使用所有训练数据计算,保证收敛,不需要逐渐减少学习率。每一步都需要使用所有训练数据,速度越来越慢。
SDG法。stochastic gradient descent,随机梯度下降。数据集拆分成一个个批次(batch),随机抽取一个批次计算,更新参数,MBGD(minibatch gradient descent)。每次迭代计算mini-batch梯度,更新参数。训练数据集很大,仍能较快速度收敛。抽取不可避免梯度误差,需要手动调整学习率(learning rate)。选择适合学习率比较困难。想对常出现特征更新速度快,不常出现特征更新速度慢。SGD更新所有参数用一样学习率。SGD容易收敛到局部最优,可能被困在鞍点。
Momentum法。模拟物理学动量概念。更新时在一定程度保留之前更新方向,当前批次再微调本次更新参数,引入新变量v(速度),作为前几次梯度累加。Momentum更新学习率,在下降初期,前后梯度方向一致时,加速学习,在下降中后期,在局部最小值附近来回震荡时,抑制震荡,加快收敛。
Nesterov Momentum法。Ilya Sutskever,Nesterov。标准Momentum法,先计算一个梯度,在加速更新梯度方向大跳跃。Nesterov法,先在原来加速梯度方向大跳跃,再在该位置计算梯度值,用这个梯度值修正最终更新方向。
Adagrad法。自适应为各个参数分配不同学习率,控制每个维度梯度方向。实现学习率自动更改。本次更新梯度大,学习率衰减快,否则慢。
Adadelta法。Adagrad法,学习单调递减,训练后期学习率非常小,需要手动设置一个全局初始学习率。Adadelta法用一阶方法,近似模拟二阶牛顿法,解决问题。
RMSprop法。引入一个衰减系数,每一回合都衰减一定比例。对循环神经网络(RNN)效果很好。
Adam法。自适应矩估计(adaptive moment estimation)。Adam法根据损失函数针对每个参数梯度一阶矩估计和二阶矩估计动态调整每个参数学习率。矩估计,利用样本矩估计总体相应参数。一个随机变量X服从某种分布,X一阶矩是E(X),样本平均值,X二阶矩E(X2),样本平方平均值。
方法比较。Karpathy在MNIST数据集发现规律:不调整参数,Adagrad法比SGD法、Momentum法更稳定、性能更优。精调参数,精调SGD法、Momentum法收敛速度和准确性优于Adagrad法。http://sebastianruder.com/optimizing-gradient-descent/。《An overview of gradient descent optimization algorithms》。

参考资料:
《TensorFlow技术解析与实战》

设计安全API:理解作用域与访问控制 本文深入探讨了在设计API时如何定义和管理安全作用域,以及如何考虑访问控制的影响。通过具体的银行API示例,本文展示了如何识别主要概念和行动来定义细粒度作用域,并讨论了不同策略在实际应用中的利弊。同时,本文也强调了API设计者在确保API安全性和功能性方面所承担的重要角色。 阅读详情

相关推荐

PHM算法与智能分析技术

PHM概述

柳杰的博客 1万+

Tensorflow: tf.data性能设计指南

tensorflow tfrecord数据性能调优

SeaSky_Steven的博客 884

FISCO BCOS平台的用户权限控制与分类管理

在区块链技术日益广泛应用的今天,如何管理与控制不同用户的权限,确保系统的安全性与高效性,成为了区块链平台不可忽视的一部分。FISCO BCOS作为一款高效的联盟链平台,通过细粒度的权限控制机制,提供了对不同用户权限的有效管理。本文将深入探讨FISCO BCOS如何实现用户的权限控制,并对不同用户进行分类与权限管理。FISCO BCOS平台通过精密的权限控制机制,不仅提供了对用户表和系统表的细粒度权限管理,还通过工具与接口为开发者和管理员提供了便捷的权限配置与查询功能。

2201_75798391的博客 1060

学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化

系统架构。 自底向上,设备层、网络层、数据操作层、图计算层、API层、应用层。核心层,设备层、网络层、数据操作层、图计算层。最下层是网络通信层和设备管理层。 网络通信层包括gRPC(google Remote Procedure Call Protocol)和远程直接数据存取(Remote Direct Memory Access,RDMA),分布式计算需要。设备管理层包手包括TensorFlo

利炳根 779

MobaXterm详细使用教程

当然MobaXterm的功能远不止这些,但这些是最基本,最常用的,因此先拿出来讲。点击确定后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。(2) 我们可以直接apt-get安装vim等常用功能(或者官网下载插件),实现在windows下模拟linux环境,这样就可以使用vi命令准备INCAR文件,也可以使用Gnuplot进行绘图。支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,…

博客 4万+

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 338

TensorFlow学习实践(二):使用TFRecord格式数据和tf.data API进行模型训练和预测

本文以mnist为例,介绍如何使用TFRecord格式数据和tf.data API进行模型训练和预测。 参考: 1、cifar10 2、https://tensorflow.google.cn/guide/datasets 目录 一、数据解析 二、定义模型、损失和训练操作 三、模型训练 一、数据解析 def parse_data(example_proto): feat...

qiumokucao的博客 2773

【大模型】MHA,MQA,GQA及KV Cache详解

在自回归模型中(Autoregressive Models),模型会逐个生成文本的每个token,这个过程可能比较慢,因为模型一次只能生成一个token,而且每次新的预测都依赖于之前的上下文。这意味着,要预测第1000个token,你需要用到前999个token的信息,这通常涉及到对这些token的表示进行一系列矩阵乘法运算。而要预测第1001个token,你不仅需要前999个token的信息,还要加上第1000个token的信息。

酒酿小圆子呀~ 2611

【Tensorflow】tf.data API使用方法

  2018年10月10日 01:19:55 咖啡味儿的咖啡 阅读数:652  版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangdongwei0/article/details/82991048 本文主要参考:Input Pipeline Performance Guide 本文结构: 一、TF输入方法现状 二、对Pipline...

张伟的专栏 837

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

网络安全 | 企业网络安全的十大挑战及解决方案

网络安全 | 企业网络安全的十大挑战及解决方案,随着信息技术的飞速发展,企业数字化转型进程不断加速,网络安全问题日益成为企业运营与发展面临的关键挑战。本文深入剖析企业网络安全的十大挑战,包括网络攻击日益复杂、数据泄露风险、内部威胁、物联网安全、云安全、合规性要求、移动办公安全、供应链安全、人才短缺以及安全预算有限等,并针对每个挑战详细阐述相应的解决方案,旨在为企业构建全面、有效的网络安全体系提供指导与参考,助力企业在复杂多变的网络环境中保障自身信息资产安全,实现可持续发展。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

Tensorflow(十)Tf.data API使用

import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras #...

weixin_38087754的博客 292

【OpenClaw从入门到精通】第01篇:保姆级教程——从零开始搭建你的第一个本地AI助理(2026实测版)

本文聚焦2026年开源AI代理工具OpenClaw的本地部署与实操,从核心概念拆解入手,先厘清OpenClaw、Gateway、Skills、ClawHub的关联,再明确硬件系统要求与大模型API-Key准备要点,通过官方一键安装脚本完成本地部署,并配置阿里云百炼API实现大模型对接。以“让AI助理抓取开源中国热门项目”的虚拟实战案例,详细演示Skills调用流程,同时梳理部署中“命令找不到”“API-Key配置失败”等高频问题的解决方法。内容兼顾新手友好性与实操参考性,所有步骤均基于公开技术文档验证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 4万+

tensorflow技术解析与实战笔记

tensorflow技术解析与实战笔记第4章 TensorFlow 基础知识4.1 系统架构4.2 设计理念4.3 编程模型4.3.1 边4.3.2 节点4.3.3 其他概念1.图2.会话3.设备4.变量5.内核4.4 常用 API4.4.1 图、操作和张量4.4.2 可视化4.5 变量作用域variable_scope 实例4.5.2 name_scope4.6 批标准化4.6.1 方法4.6....

VictorChoo的博客 530

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化...

系统架构。自底向上,设备层、网络层、数据操作层、图计算层、API层、应用层。核心层,设备层、网络层、数据操作层、图计算层。最下层是网络通信层和设备管理层。网络通信层包括gRPC(google Remote Procedure Call Protocol)和远程直接数据存取(Remote Direct Memory Access,RDMA),分布式计算需要。设备管理层包手包括TensorF...

ahua2886的博客 176

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TensorFlow技术解析与实战 4 基础知识

4.1 系统架构      自底向上分为设备层和网络层、数据操作层、图计算层、API层、应用层。 4.2 设计理念 (1)将图的定义和图的运行完全分开。          编程模式通常分为命令式编程和符号式编程。命令式编程是编写我们理解的通常意义上的程序,很容易理解和调试,按照原有逻辑执行。符号式编程涉及很多的嵌入和优化,不容易理解和调试,但运行速度相对有所提升。现有的深度学习框架

Just for fun的专栏 575

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

李嘉璇 TensorFlow技术解析与实战 第四章笔记 TensorFlow基础知识

系统架构 最下层是网络通信层和设备管理层。网络通信层包括 gRPC(google Remote Procedure Call Protocol)和远程直接数据存取(Remote DirectMemory Access, RDMA),这都是在分布式计算时需要用到的。设备管理层包括 TensorFlow 分别在 CPU、 GPU、 FPGA 等设备上的实现,也就是对上层提供了一个统一的接口,使上层只需...

qq_15623891的博客 1041

Tensorflow之一基础篇

《Tensorflow技术解析与实战》基础篇Tensorflow技术基础篇,本文章内容来源于《Tensorflow技术解析与实战》一书前四章内容整理一、Tensorflow环境准备Anaconda里安装Tensorflow; 依赖的其他模块有:numpy,matplotlib,jupyter scikit-image:有一组图像处理的算法,可以使过滤一张图片变得很简单,非常适用于对图像的预处理。

你是谁笔下的少年,在风中辗转成歌 764

TensorFlow学习笔记——《TensorFlow技术解析与实战》

星尘逸风的博客 1026

Tensorflow学习笔记 (用 tf.data 加载图片)

原代码来自tensorflow Tensorflow学习笔记 (用 tf.data 加载图片) 本教程提供一个如何使用 tf.data 加载图片的简单例子。 导入模块,配置 import tensorflow as tf tf.data用于数据集的构建与预处理 AUTOTUNE = tf.data.experimental.AUTOTUNE 下载并检查数据集 从origin网址中下载文件,命名为’flower_photos’,untar=True表示对文件进行解压。 通过pathlib.Path(.

DNDAW的博客 1440

TF乘法之multiply、matmul、*

import tensorflow as tf w = tf.Variable([[0.4], [1.2]], dtype=tf.float32) # w.shape: [2, 1] x = tf.Variable([range(1,6), range(5,10)], dtype=tf.float32) # x.shape: [2, 5] y = w * x # 等同于 y = tf.multiply(w, x) y.shape: [2, 5] sess = tf.Session() ini

github_39605284的博客 1637

tensorflow中gen_math_ops.inv()函数的使用

1.功能 计算输入的x的倒数 2.参数 x:是Tensor,数据类型必须是`float16`, `half`, `float32`, `float64`, `int32`, `int64`, `complex64`, `complex128`. 3.样例代码 import tensorflow as tf from tensorflow.python.ops import gen_math_ops intpu_x = tf.constant(3, dtyp...

weixin_43869605的博客 667

深度学习logits是什么?

在深度学习的上下文中,logits层是指馈入softmax(或其他此类归一化)的层。 softmax的输出是分类任务的概率,其输入是logits层。 logits层通常产生-infinity到+ infinity的值,而softmax层将其转换为0到1的值。 例如U-GAT-IT生成器/鉴别器中就是指的箭头所指的地方 : ...

Drug discovery 3万+

PaddlePaddle与TensorFlow的对比分析

51CTO技术栈“本文主要从框架概览、系统架构、编程模型、分布式架构、框架对比这五大方面比较 TensorFlow 和 PaddlePaddle 框架。作为国际两大搜索引擎研发的深度学习框架,使用侧重点不同,却同样提供了优雅简洁的设计架构,并且还在不断发展。对于 PaddlePaddle 来说,它的易用性和本土性、快速业务集成性,对国内以速度致胜的互联网公司是一个非常有利的武器;而 TensorF...

宇翔XGT的博客 6917

pytorch学习总结(一)(SGD随机梯度下降、学习率调整策略、train模式)

SGD随机梯度下降、学习率调整策略、train模式

shun421的博客 1636
上一篇: Tensorflow实战学习(四十七)【PlayGround,TensorBoard】
下一篇: Tensorflow实战学习(四十九)【模型存储加载,队列线程,加载数据,自定义操作】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值