在搭建完网络以后,就需要配置模型训练的函数,比如损失函数、误差方向传播优化算法等。Tensorflow 2.* 中compile编译函数便集成了此项功能,比如对于一个分类问题,常见的形式如下:
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
基于训练数据和损失函数来更新网络的机制,常用的有Adam, RMSprop、SGD等
网络衡量在训练数据上的性能,即网络如何朝着正确的方向前进。
BinaryCrossentropy, CategoricalCrossentropy,KLDivergence等
训练和测试过程中需要监控的指标。常用的有AUC、Accuracy、BinaryAccuracy、BinaryCrossentropy, CategoricalCrossentropy, KLDivergence、Precision等等
比如在分类问题中,交叉熵是模型训练的loss,但是我们难以直观通过交叉熵的数值进行判断,需要一个更为直观的质保,因此选择精度作为metrics
对于一个多输出的网络模型,如果需要定义每个输出对应的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.])
官方文档