使用Keras训练神经网络备忘录

Posted 好奇不止,探索不息

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Keras训练神经网络备忘录相关的知识,希望对你有一定的参考价值。

文章太长,放个目录:

1.优化函数的选择

先写结论,后面再补上每个优化函数的详细解释:

  1. 如果你的数据很稀疏,那应该选择有自适应性的优化函数。并且你还可以减少调参的时间,用默认参数取得好的结果。 
  2. RMSprop是adagrad的一个拓展,旨在解决它提前结束的问题。 
  3. 而RMSprop和Adadelta类似,只是adadelta采用了RMS的方法更新参数。 
  4. 在RMSprop基础上增加了偏差校正和momentum,形成了Adam。 
  5. 综上,RMSprop、Adadelta、Adam都是类似的。 
  6. Kingma【Kingma, D. P., & Ba, J. L. (2015). Adam: a Method for Stochastic Optimization. International Conference on Learning Representations, 1–13.】的实验表示,偏差校正使得Adam在优化到后面梯度变的稀疏的时候使得其优化性能最好。 
  7. 所以,可能Adam是最好的优化函数。 
  8. 所以,如果你希望你的训练能变的更快,或者你要训练的是一个复杂的深度的网络,尽量选择自适应的优化函数。 

摘自:深度学习各种优化函数详解

2.损失函数的选择

编译模型必须的两个参数之一:

model.compile(loss=\'mean_squared_error\', optimizer=\'sgd\')

  1. from keras import losses 
  2. model.compile(loss=losses.mean_squared_error, optimizer=\'sgd\') 

2.2常用的损失函数

mean_squared_error或mse
mean_absolute_error或mae
mean_absolute_percentage_error或mape
mean_squared_logarithmic_error或msle
squared_hinge
hinge
categorical_hinge
logcosh
categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列
sparse_categorical_crossentropy:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1)
binary_crossentropy:(亦称作对数损失,logloss)
kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异
poisson:即(predictions - targets * log(predictions))的均值
cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数

注:当使用”categorical_crossentropy”作为目标函数时,标签应该为多类模式,即one-hot编码的向量,而不是单个数值. 可以使用工具中的to_categorical函数完成该转换.示例如下:

  1. from keras.utils.np_utils import to_categorical 
  2. categorical_labels = to_categorical(int_labels, num_classes=None) 

摘自:目标函数objectives

2.2自定义函数

keras的Losses部分的源码是这样的:

部分losses
部分losses

可以看出,每次计算loss时,会传给损失函数两个值,一个是正确的标签(y_true),一是模型预测的标签(y_pred),这两个值是shape相同的Theano/TensorFlow张量,根据这一规则,可以设计自己的损失函数.

2.1实践

(1)基本用法
自定义一个,对真实和预测的差距求4次方的损失函数:

  1. #自定义损失函数 
  2. def myloss(pred,true): 
  3. result = np.power(pred-true,4) 
  4. return result.mean() 
  5. #编译模型 
  6. model.compile(optimizer=\'adam\',loss=myloss) 

(2)实际例子
使用one hot分类时,拟合one hot分布的同时,还你拟合均匀分布
自定义的函数是:

实际用keras是这样的:

  1. #自定义损失函数 
  2. def mycrossentropy(y_true, y_pred, e=0.1): 
  3. return (1-e)*K.categorical_crossentropy(y_pred,y_true) + e*K.categorical_crossentropy(y_pred, K.ones_like(y_pred)/nb_classes) 
  4. #编译模型  
  5. model.compile(optimizer=\'adam\', loss=mycrossentropy) 

例子来源Keras中自定义复杂的loss函数

2.2将损失函数自定义为网络层

使用均方差和KL散度定义损失函数

  1. class CustomVariationalLayer(Layer): 
  2. def __init__(self, **kwargs): 
  3. self.is_placeholder = True 
  4. super(CustomVariationalLayer, self).__init__(**kwargs) 
  5.  
  6. def vae_loss(self, x, x_decoded_mean): 
  7. xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)#Square Loss 
  8. kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)# KL-Divergence Loss 
  9. return K.mean(xent_loss + kl_loss) 
  10.  
  11. def call(self, inputs): 
  12. x = inputs[0] 
  13. x_decoded_mean = inputs[1] 
  14. loss = self.vae_loss(x, x_decoded_mean) 
  15. self.add_loss(loss, inputs=inputs) 
  16. # We won\'t actually use the output. 
  17. return x 
  18.  
  19. y = CustomVariationalLayer()([x, x_decoded_mean]) 
  20. vae = Model(x, y) 
  21. vae.compile(optimizer=\'rmsprop\', loss=None) 

例子来源Keras自定义Loss函数

3.模型的保存

3.1同时保存结构和权重

官方保持模型的API是这样的:

def save_model(model, filepath, overwrite=True, include_optimizer=True)

调用这个函数保持的内容包括:

  • 模型的结构
  • 模型的权重
  • 优化器的状态(即保存时优化器的状态,一遍后面从该状态出发继续训练)
  1. from keras.models import load_model 
  2.  
  3. #保持模型 
  4. model.save(\'my_model.h5\')  
  5.  
  6. #载入模型 
  7. model = load_model(\'my_model.h5\') 

3.2模型结构的保存

如果只希望保持模型结构,可以使用以下方法保存和重建.