Tensorflow 笔记

1、神经网络实现过程

  一、准备数据集,提取特征,做为输入喂给神经网络。算法

  二、搭建NN结构,从输入到输出。(先搭建计算图,再用会话执行)网络

   (NN前向传播算法——>计算输出)app

  三、大量特征喂给NN,迭代优化NN参数。dom

   (NN反向传播算法——>优化参数训练模型)函数

  四、使用训练好的模型预测和分类。学习

 

2、Tensorflow主要函数

 一、变量的声名函数 tf.Variable( initialize , name=  )

  i)参数initializer是初始化参数,name是可自定义的变量名称优化

  ii)函数做用:保存和更新神经网络中的参数spa

  iii)张量与变量的关系:tf.Variable是一个运算,其输出结果是一个张量。变量是一种特殊的张量。 .net

      iiii)参数shape 的一列表示一个变量的权重。code

    二、生成张量的常见函数

  tf.zeros(shape, dtype=, name=)

  tf.zeros_like(tensor, dtype=, name=)

  tf.constant(value, dtype=, shape=, name=)

  tf.fill(dims, value, name=)

  tf.ones_like(tensor, dtype=, name=)

  tf.ones(shape, dtype=, name=)

  三、生成随机数函数

  tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

  tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

  tf.random_uniform(shape, minval=0.0, maxval=1.0, dtype=tf.float32, seed=None, name=None)

  tf.random_shuffle(value, seed=None, name=None)

 四、占位函数 tf.placeholder(dtype,shape=,name=)

x=tf.placeholder(tf.float32,shape=(None,3), name='input')
...
sess.run( y ,feed_dict={ x:[[1,2,3]]  } )

 

  i)参数dtype为数据类型,shape为维度,name为名称

  ii)经过会话执行计算时,经过feed_dict字典指定相应值

 五、矩阵乘法 tf.matmul( matrix1 , matrix2 )

  i)matrix1*matrix2 表示矩阵内每一个元素对应相乘

 六、全部变量(参数)初始化 tf.global_variables_initializer() 

###第一种
init_op=tf.global_variable_initializer() sess.run(init_op)

###第二种
init_op=tf.initialize_all_variables()
sess.rund(init_op)

  i)因为变量之间可能存在依赖关系,单个调用方案比较麻烦?

 七、激活函数

  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()#防止过拟合,用来舍弃某些神经元

 八、损失函数    

  i)均方根偏差(MSE) —— 回归问题中最经常使用的损失函数 。优势是便于梯度降低,偏差大时降低快,偏差小时降低慢,有利于函数收敛。缺点是受明显偏离正常范围的离群样本的影响较大

    loss=tf.losses.mean_squared_error(y_true,y_pred)
    loss=tf.reduce_mean(  tf.square( y_true,y_pred ) )     上一函数的另外一实现                                                        

  ii)平均绝对偏差(MAE) —— 想格外加强对离群样本的健壮性时使用

    mae = tf.losses.absolute_difference(y_true,y_pred ) 
    mae.loss = tf.reduce_sum( mae)

 九、自定义损失函数

  tf.greater(x, y):判断 x 是否大于 y,当维度不一致时广播后比较
  tf.where(condition, x, y):当 condition 为 true 时返回 x,不然返回 y
  tf.reduce_mean():沿维度求平均
  tf.reduce_sum():沿维度相加
  tf.reduce_prod():沿维度相乘
  tf.reduce_min():沿维度找最小
  tf.reduce_max():沿维度找最大

 十、优化函数

  tf.train.GradientDescentOptimizer
  tf.train.AdadeltaOptimizer
  tf.train.AdagradOptimizer
  tf.train.AdagradDAOptimizer
  tf.train.MomentumOptimizer
  tf.train.AdamOptimizer
  tf.train.FtrlOptimizer
  tf.train.RMSPropOptimizer

 十一、正则化函数 (在损失函数中引入模型复杂度指标,利用W加权值,弱化训练数据的噪声,通常不正则化 b 偏置 )

  tensorflow 中的两种正则化函数  

  i)L1正则化 : tf.contrib.layers.l1_regularizer(REGULARIZER)(w)    =》 lossl1( w )= Σ | wi |

  ii)L2正则化 : tf.contrib.layers.l2_regularizer(REGULARIZER)(w)   =》 lossl2( w )= ∑ | wi2 |

    使用例子:

w=tf.Variable(...)
y=tf.matmul( x,w )

loss=tf.reduce_mean(tf.square(y_ - y ))



#第一种
loss_total=loss+ tf.contrib.layers.l2_regularizer(regularizer_rate)(w)    #或者regularizer=tf.tf.contrib.layers.l2_regularizer(regularizer_rate) ; regular_loss=regularizer(w)

#第二种  将正则项加入名为losses 集合。
tf.add_to_collection ( 'losses' ,  tf.contrib.layers.l2_regularizer(regularizer_rate)(w) )
loss_total =loss+tf.add_n( tf.get_collection('losses') ) 

#!!经常使用的方法是第二种
#缘由:一、第一种方式致使损失函数loss的定义很长
#          二、定义网络结构的部分和计算损失函数的部分可能不在同一函数中,此时使用第一种方式不方便1

 

  十二、学习率设置函数: learning_rate = tf.train.exponential_decay( learning_rate_base,global_step,decay_step, decay_rate , staircase=True/False)

   i)该函数实现的是如下功能:learning_rate = learning_rate_base * decay_rate ^ (global_step / decay_step)

   ii)参数learning_rate_base表示初始学习率,global_step表示当前迭代次数,是不可训练参数,decay_step表示衰减速度,decay_rate表示衰减率,staircase=True表示每训练decay_step轮更新一次学习率,不然每轮更新一次。

     使用例子:

global_step=tf.Variable(0,trainable=False)
learning_rate = tf.train.exponential_decay( learning_rate_base,global_step,decay_step,decay_rate,staricase=True)  
train_=tf.train.GradientDescentOptimizer(learning_rate).minimize(...loss...,global_step=global_step)

  1三、滑动平均模型   tf.train.ExponentialMovingAverage( decay,step )

   i)基本思想: 在使用梯度降低算法训练中,每次更新权重时,为每一个权重维护一个影子变量,该影子变量随着训练的进行,最终会稳定在一个接近真实权重的值附近,那么在进行预测时,使用影子变量的值能够获得更好的结果

                         其中:shadowVariable=decay∗shadowVariable+(1−decay)∗variable ,具体可看 https://blog.csdn.net/u012436149/article/details/56484572        shadowVariable=decayshadowVariable+(1decay)variable

   ii)参数decay表示衰减率,step用于decay= min(decay,(1+step)/(10+step))来进行手动设置decay

   iii)decay一般设置为很是接近1的数(好比0.999或0.9999).

    使用例子:

 

step= tf.Variable( 0,trainable=False )  #用于模拟神经网络中迭代的轮数
v1=tf.Variable(0,dtype=tf.float32)       # 滑动平均模型变量

第一种
#定义一个滑动平均类。初始化给定衰减率和控制衰减率的变量
ema  =  tf.train.ExponentialMovingAverage( 0.99, step )

#定义一个更新变量滑动平均的操做。须要给定一个列表,每次执行此操做,列表的变量会更新
maintain_average_op = ema.apply( [v1] ) #实际应用中使用 maintain_average_op = ema.apply( tf.trainable_variables())  全部变量求滑动平均 ; tf.trainable_variables()将全部可训练变量造成列表
...
sess.run(maintain_average_op)  #每迭代优化一次v1 都要加上此语句。

第二种
ema= tf.train.ExponentialMovingAverage( 0.99, step )
maintain_average_op = ema.apply( tf.trainable_variables()) 
#将训练过程和滑动平均绑定在一块儿运行,合成一个节点
with tf.control_dependencies( [train_step,maintain_average_op] ): train_op=tf.no_op(name='train') #使用ema.average( 参数名 ) 查看某参数的滑动平均
相关文章
相关标签/搜索