Tensorflow 2.* 网络训练(一) compile(optimizer, loss, metrics, loss_weights)

在搭建完网络以后,就需要配置模型训练的函数,比如损失函数、误差方向传播优化算法等。Tensorflow 2.* 中compile编译函数便集成了此项功能,比如对于一个分类问题,常见的形式如下:

model.compile(optimizer='rmsprop',
				loss='categorical_crossentropy',
				metrics=['accuracy'])

文章目录

    • tf.keras.Model.compile()
      • optimizer 优化器
      • loss 损失函数
      • metrics 监控指标
      • loss和metrics关系
      • loss_weights
        • 权值字典
        • 权值列表
    • 参考

tf.keras.Model.compile()

optimizer 优化器

基于训练数据损失函数来更新网络的机制,常用的有Adam, RMSprop、SGD等

loss 损失函数

网络衡量在训练数据上的性能,即网络如何朝着正确的方向前进。
BinaryCrossentropy, CategoricalCrossentropy,KLDivergence等

metrics 监控指标

训练和测试过程中需要监控的指标。常用的有AUC、Accuracy、BinaryAccuracy、BinaryCrossentropy, CategoricalCrossentropy, KLDivergence、Precision等等

loss和metrics关系

  1. loss和metrics都是用来评价训练过程中模型的预测性能;
  2. optimizer是根据loss值进行反向误差方向传播,计算更新网络权值;
  3. metrics不参与网络的训练过程,只作为一个监控指标,方便直观显示模型的预测,选择范围相比loss更多;
  4. 比如在分类问题中,交叉熵是模型训练的loss,但是我们难以直观通过交叉熵的数值进行判断,需要一个更为直观的质保,因此选择精度作为metrics

loss_weights

对于一个多输出的网络模型,如果需要定义每个输出对应的loss函数在训练过程中所占的比例就需要设置loss_weights。例如,对于如下的一个三输出的网络模型,每类输出对应不同的损失函数,就会导致严重的损伤函数间的不平衡,即在网络训练过程中网络会倾向于损失函数值最大的输出,而对其他两路输出的优化效果表现不足。因此需要每个损失值对最终损失的贡献分配不同大小的重要性(权值)

age_prediction = layers.Dense(1, name='age')(x)
income_prediction = layers.Dense(nb_classes,activation='softmax', name='income')(x)
gender_prediction = layers.Dense(1, activation='sigmoid', name='gender')(x)
model = Model(posts_input,[age_prediction, income_prediction, gender_prediction])
model.compile(optimizer='rmsprop',
				loss={'age': 'mse',
					'income': 'categorical_crossentropy',
					'gender': 'binary_crossentropy'})

权值字典

按照输出层的名称建立字典分配权值

model.compile(loss_weight={'age': 0.25,
							'income'1.,
							'gender':10.})

权值列表

或者按照Model输出层列表顺序分配权值

model.compile(loss_weight=[loss_weights=[0.25, 1., 10.])

参考

官方文档

你可能感兴趣的:(Tensorflow,深度学习,python,tensorflow)