Anylearn自定义算法训练跟踪¶
在 本地快速开始 中曾经介绍过, Anylearn后端引擎不仅支持Anylearn算法库内置的标准算法, 也可以通过宽松的执行环境支持用户自定义的自定义算法。
然而,未经过标准化封装的算法的训练过程不尽相同, 可能有各式各样的迭代方式、进度、中间结果等等, 很难做到通用的训练跟踪。 因此,Anylearn SDK提供了一套简洁的接口, 用户只需要在自定义的算法中增加微量的代码, 调用这些接口, 便能做到在Anylearn中对训练过程进行有效跟踪。
自定义算法Hello world¶
我们以一个简单的Hello world级的算法为例, 阐述如何使用Anylearn SDK的训练跟踪功能。 以下是训练 Fashion MNIST数据集 的一个CNN的主体代码:
# 主体逻辑,忽略部分细节
class EpochEndCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
acc = logs['val_acc'] if 'val_acc' in logs else logs['val_accuracy']
print(f"Current acc: {acc}")
parser = argparse.ArgumentParser()
(X_train, y_train), (X_test, y_test) = load_data_local(path=args.data_path)
# ......
# Build model
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, [3, 3], activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
# ......
])
opt = tf.keras.optimizers.Adam(_learning_rate)
model.compile(optimizer=opt,
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
# ......
# Train
model.fit(dset_train,
callbacks=callbacks,
epochs=_epochs)
# Test
test_loss, test_acc = model.evaluate(dset_test, verbose=2)
# Save
model.save(_model_dir)
集成Anylearn SDK使得Anylearn可以对训练进行跟踪¶
只需简单地修改上述CNN的代码, 导入Anylearn SDK、调用中间结果汇报接口、调用最终结果汇报接口, 即可让Anylearn对训练过程进行跟踪:
+ import anylearn
class EpochEndCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
acc = logs['val_acc'] if 'val_acc' in logs else logs['val_accuracy']
- print(f"Current acc: {acc}")
+ anylearn.report_intermediate_metric(acc)
parser = argparse.ArgumentParser()
(X_train, y_train), (X_test, y_test) = load_data_local(path=args.data_path)
# ......
# Build model
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, [3, 3], activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
# ......
])
opt = tf.keras.optimizers.Adam(_learning_rate)
model.compile(optimizer=opt,
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
# ......
# Train
model.fit(dset_train,
callbacks=callbacks,
epochs=_epochs)
# Test
test_loss, test_acc = model.evaluate(dset_test, verbose=2)
+ anylearn.report_final_metric(test_acc)
# Save
model.save(_model_dir)