Keras loss函数剖析
我就废话不多说了,大家还是直接看代码吧~
''' Createdon2018-4-16 ''' defcompile( self, optimizer,#优化器 loss,#损失函数,可以为已经定义好的loss函数名称,也可以为自己写的loss函数 metrics=None,# sample_weight_mode=None,#如果你需要按时间步为样本赋权(2D权矩阵),将该值设为“temporal”。默认为“None”,代表按样本赋权(1D权),和fit中sample_weight在赋值样本权重中配合使用 weighted_metrics=None, target_tensors=None, **kwargs#这里的设定的参数可以和后端交互。 ) 实质调用的是Keras\engine\training.py中的classModel中的defcompile 一般使用model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy']) #keras所有定义好的损失函数loss: #keras\losses.py #有些loss函数可以使用简称: #mse=MSE=mean_squared_error #mae=MAE=mean_absolute_error #mape=MAPE=mean_absolute_percentage_error #msle=MSLE=mean_squared_logarithmic_error #kld=KLD=kullback_leibler_divergence #cosine=cosine_proximity #使用到的数学方法: #mean:求均值 #sum:求和 #square:平方 #abs:绝对值 #clip:[裁剪替换](https://blog.csdn.net/qq1483661204/article/details) #epsilon:1e-7 #log:以e为底 #maximum(x,y):x与y逐位比较取其大者 #reduce_sum(x,axis):沿着某个维度求和 #l2_normalize:l2正则化 #softplus:softplus函数 # #importcntkasC #1.mean_squared_error: #returnK.mean(K.square(y_pred-y_true),axis=-1) #2.mean_absolute_error: #returnK.mean(K.abs(y_pred-y_true),axis=-1) #3.mean_absolute_percentage_error: #diff=K.abs((y_true-y_pred)/K.clip(K.abs(y_true),K.epsilon(),None)) #return100.*K.mean(diff,axis=-1) #4.mean_squared_logarithmic_error: #first_log=K.log(K.clip(y_pred,K.epsilon(),None)+1.) #second_log=K.log(K.clip(y_true,K.epsilon(),None)+1.) #returnK.mean(K.square(first_log-second_log),axis=-1) #5.squared_hinge: #returnK.mean(K.square(K.maximum(1.-y_true*y_pred,0.)),axis=-1) #6.hinge(SVM损失函数): #returnK.mean(K.maximum(1.-y_true*y_pred,0.),axis=-1) #7.categorical_hinge: #pos=K.sum(y_true*y_pred,axis=-1) #neg=K.max((1.-y_true)*y_pred,axis=-1) #returnK.maximum(0.,neg-pos+1.) #8.logcosh: #def_logcosh(x): #returnx+K.softplus(-2.*x)-K.log(2.) #returnK.mean(_logcosh(y_pred-y_true),axis=-1) #9.categorical_crossentropy: #output/=C.reduce_sum(output,axis=-1) #output=C.clip(output,epsilon(),1.0-epsilon()) #return-sum(target*C.log(output),axis=-1) #10.sparse_categorical_crossentropy: #target=C.one_hot(target,output.shape[-1]) #target=C.reshape(target,output.shape) #returncategorical_crossentropy(target,output,from_logits) #11.binary_crossentropy: #returnK.mean(K.binary_crossentropy(y_true,y_pred),axis=-1) #12.kullback_leibler_divergence: #y_true=K.clip(y_true,K.epsilon(),1) #y_pred=K.clip(y_pred,K.epsilon(),1) #returnK.sum(y_true*K.log(y_true/y_pred),axis=-1) #13.poisson: #returnK.mean(y_pred-y_true*K.log(y_pred+K.epsilon()),axis=-1) #14.cosine_proximity: #y_true=K.l2_normalize(y_true,axis=-1) #y_pred=K.l2_normalize(y_pred,axis=-1) #return-K.sum(y_true*y_pred,axis=-1)
补充知识:一文总结Keras的loss函数和metrics函数
Loss函数
定义:
keras.losses.mean_squared_error(y_true,y_pred)
用法很简单,就是计算均方误差平均值,例如
loss_fn=keras.losses.mean_squared_error a1=tf.constant([1,1,1,1]) a2=tf.constant([2,2,2,2]) loss_fn(a1,a2)
Metrics函数
Metrics函数也用于计算误差,但是功能比Loss函数要复杂。
定义
tf.keras.metrics.Mean( name='mean',dtype=None )
这个定义过于简单,举例说明
mean_loss([1,3,5,7]) mean_loss([1,3,5,7]) mean_loss([1,1,1,1]) mean_loss([2,2])
输出结果
这个结果等价于
np.mean([1,3,5,7,1,3,5,7,1,1,1,1,2,2])
这是因为Metrics函数是状态函数,在神经网络训练过程中会持续不断地更新状态,是有记忆的。因为Metrics函数还带有下面几个Methods
reset_states() Resetsallofthemetricstatevariables. Thisfunctioniscalledbetweenepochs/steps,whenametricisevaluatedduringtraining. result() Computesandreturnsthemetricvaluetensor. Resultcomputationisanidempotentoperationthatsimplycalculatesthemetricvalueusingthestatevariables update_state( values,sample_weight=None ) Accumulatesstatisticsforcomputingthereductionmetric.
另外注意,Loss函数和Metrics函数的调用形式,
loss_fn=keras.losses.mean_squared_errormean_loss=keras.metrics.Mean()
mean_loss(1)等价于keras.metrics.Mean()(1),而不是keras.metrics.Mean(1),这个从keras.metrics.Mean函数的定义可以看出。
但是必须先令生成一个实例mean_loss=keras.metrics.Mean(),而不能直接使用keras.metrics.Mean()本身。
以上这篇Kerasloss函数剖析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。