① tf.Variables( )
tf.Variables( ,dtype = ) #创建一个张量,dtype为张量的变量类型,如dtype=tf.float32
tf.Variables(0,trainable=True) #trainale表示该值能否被训练,False或True
tf.Variable(tf.random_normal([20, 10], stddev=0.35)) #以标准差0.35的正太分布初始化一个形状为[20,40]的张量
tf.Variable(tf.zeros([20])) #创建一个形状为[20]的张量, 里面的元素值全部为0.
举一个例子:
import tensorflow as tf
w = tf.Variable([0,1]) #创建一个二维张量w
print(v) # w的shape,而非w的值,结果是:
with tf.Session() as sess:
sess.run(v.initializer) #运行变量的initializer。调用op之前,所有变量都应被显式地初始化过。
sess.run(v) #打印出 [0,1]
② tf.get_variable( )
my_variable = tf.get_variable("my_variable", [1, 2, 3]) #初始化一个名为“my_variable”的变量,该变量是形状为 [1, 2, 3] 的三维张量。
③ tf.trainable_variables( )
tf.trainable_variables( ) #把所有待训练参数汇总成列表
张量在其他操作进行之前,都必须对其进行初始化。
w.initializer() #对单个变量-- w 初始化
tf.global_variables_initializer() # 给所有变量初始化
注意:tf.global_variables_initializer ( ) 函数不能指定变量的初始化顺序。因此,如果变量的初始值由另一变量的值决定,那么会有很大的可能出现错误。
激活函数转载于https://blog.csdn.net/qq_35203425/article/details/79964286
tf.nn.relu(features, name=None) | 整流函数:max(features, 0) |
tf.nn.relu6(features, name=None) | 以6为阈值的整流函数:min(max(features, 0), 6) |
tf.nn.elu(features, name=None) | elu函数,exp(features) - 1 if < 0,否则features Exponential Linear Units (ELUs) |
tf.nn.softplus(features, name=None) | 计算softplus:log(exp(features) + 1) |
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None) |
计算dropout,keep_prob为keep概率 noise_shape为噪声的shape |
tf.nn.bias_add(value, bias, data_format=None, name=None) | 对value加一偏置量 此函数为tf.add的特殊情况,bias仅为一维, 函数通过广播机制进行与value求和, 数据格式可以与value不同,返回为与value相同格式 |
tf.sigmoid(x, name=None) | y = 1 / (1 + exp(-x)) |
tf.tanh(x, name=None) | 双曲线切线激活函数 |
损失函数:用于表示预测值(y)与已知答案(y_)的差距。
① 均方误差mse:
loss_mse = tf.reduce_mean(tf.square(y_ - y))
② 自定义损失函数:自己定义损失函数
比如:
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),COST(y-y_),PROFIT(y_-y)))
#tf.reduce_sum表示损失求和
#tf.where()表示如果成立则为COST,否则为PROFIT
#tf.greater(),表示前>后
③交叉熵:
表示两个概率分布之间的距离。交叉熵越大,则两个概率分布距离越远。
计算公式:
ce = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,val_a,val_b)))
#y小于val_a时为val_a,y大于val_a时为val_b
softmax( )函数:使输出满足概率分布。
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))
cem = tf.reduce_mean(ce)
学习率:每次参数更新的幅度大小。
在训练过程中,参数更新随着损失函数梯度下降的方向。
① 更新公式:
② 指数衰减学习率:
指数衰减学习率:学习率动态变化
learning_rate = tf.train.exponential_dacay(0.1 , global_step , 100 , 0.96 , staircase = True)
#0.1是学习率初始值
#global_step 是运行轮数
#100是多少论更新一次学习率,计算公式: = 总样本数/BATCH_SIZE
#0.96是学习衰减率 (0,1)
#staircase True表示学习率阶梯型衰减,Flase表示学习率成光滑曲线下降
滑动平均:滑动平均记录了模型内参数的平均值。利用滑动平均可以增强模型的泛化能力(泛化能力在下一个小节过拟合中解释)。
滑动平均随参数的变化而变化。
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
#滑动平均值计算公式,其中MOVING_AVERAGE_DECAY是滑动平均率,一般取接近1的数,global_step指当前训练了多少轮。
ema_op = ema.apply(tf.trainable_variables()) #求某待训练参数列表的滑动平均值
with tf.control_dependencies([train_step,ema_op]):
train_op = tf.no_op(name = 'train')
#该函数实现将滑动平均和训练过程同步运行
ema.average(参数名) #返回某参数的平均值
过拟合:神经网络模型在训练集上准确率较高,而在新的数据进行预测或分类时准确率较低,说明模型泛化能力差。
正则化:在损失函数中给每个参数w加上权重,引入模型复杂度指标,从而抑制模型噪声,减小过拟合。一般只对参数w使用,不对偏置b使用。
add_to_collection()函数:
tf.add_to_collection(‘list_name’, element) #将元素element添加到列表list_name中
tf.get_collection(‘list_name’) #返回名称为list_name的列表
tf.add_n(list) #将列表元素相加并返回
正则化一般有两种计算方法:
①L1正则化:
loss(w)=tf.contrib.layers.l1_regularizer(REGULARIZER)(w)
②L2正则化:
loss(w)=tf.contrib.layers.l1_regularizer(REGULARIZER)(w)
Tensorflow函数实现正则化:
tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
loss = cem + tf.add_n(tf.get_collection('losees'))
参考:https://blog.csdn.net/ScarlettYellow/article/details/80458797
很详细。