我正在尝试打印和记录所有类别的自定义指标(骰子得分),以在培训期间进行验证。我希望Keras在每个时期后在验证集上计算自定义指标。我当前的程序正在运行,但是我必须使用一些技巧,这些技巧最终会在训练过程中导致内存问题。
问题是打印并记录所有类的骰子分数,计算是在无法打印的张量上完成的。由于TensorFlow 2.0的某些兼容性问题,我无法使用eager模式,并被迫初始化另一个会话。
我的自定义指标类如下:
class Metrics(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.val_lv = []
self.val_rk = []
self.val_lk = []
self.val_sp = []
def on_epoch_end(self, batch, logs={}):
layer_name = 'loss6'
self.intermediate_layer_model = tf.keras.models.Model(inputs=self.model.input,
outputs=self.model.get_layer(layer_name).output)
for batch_index in range(0, len(self.validation_data)):
temp_targ = self.validation_data[batch_index][1][0]
temp_targ=temp_targ.astype('float32')
temp_predict = (np.asarray( self.intermediate_layer_model.predict(
self.validation_data[batch_index][0]))).round()
val_lvs = tf.reduce_mean((dice_coef(temp_targ[:,1, :, :], temp_predict[:,1, :, :])))
val_rks = tf.reduce_mean(dice_coef(temp_targ[:, 2, :, :], temp_predict[:, 2, :, :]))
val_lks = tf.reduce_mean(dice_coef(temp_targ[:, 3, :, :], temp_predict[:, 3, :, :]))
val_sps = tf.reduce_mean(dice_coef(temp_targ[:, 4, :, :], temp_predict[:, 4, :, :]))
self.val_lv.append(val_lvs)
self.val_rk.append(val_rks)
self.val_lk.append(val_lks)
self.val_sp.append(val_sps)
sess = tf.Session()
print('liver-score:', sess.run(tf.reduce_mean(self.val_lv)))
print('rk-score:', sess.run(tf.reduce_mean(self.val_rk)))
print('lk-score:', sess.run(tf.reduce_mean(self.val_lk)))
print('sp-score:', sess.run(tf.reduce_mean(self.val_sp)))
logs['liver-score'] = sess.run(tf.reduce_mean(self.val_lv))
logs['rk-score'] = sess.run(tf.reduce_mean(self.val_rk))
logs['lk-score'] = sess.run(tf.reduce_mean(self.val_lk))
logs['sp-score'] = sess.run(tf.reduce_mean(self.val_sp))
sess.close()
return
请注意,变量lv
,rk
,lk
和sp
是我的班级名称的缩写。
除了使用会话外,还有其他替代方法来打印和记录指标吗?
答案 0 :(得分:1)
据我了解,temp_predict
和temp_predict
是numpy数组。因此,以张量结尾的唯一方法是因为您正在使用tf.reduce_mean
。您可以将其替换为np.mean
。仅当dice_coef
没有张量流操作时,此方法才有效。如果确实如此,那么您将不得不用numpy函数替换它们。完成此操作后,就不必再打开新会话了。
您也可以使用intermediate_layer_model
more about it here来构造一个keras函数,而不是在每个时期(tf.keras.backend.function
)结束时创建一个新模型。