training.py的代码解释

简介: labels、test_loss_op 和 mae_ops 计算模型的性能指标。最后,我们输出当前 epoch 的训练损失、测试损失和平均绝对误差(MAE),并保存模型参数(如果 MAE 小于 0.9)。整个代码的目的是使用协同过滤算法建立电影推荐系统的模型,训练模型并计算模型的性能指标。
import numpy as np
import tensorflow as tf
import os
from data.dataset import _get_training_data, _get_test_data
from model.train_model import TrainModel
from sklearn.metrics import mean_absolute_error, mean_squared_error
tf.app.flags.DEFINE_string('tf_records_train_path', 
                           os.path.abspath(os.path.join(os.path.dirname("__file__"), '..', 'data/tf_records/train/')),
                           'Path of the training data.')
tf.app.flags.DEFINE_string('tf_records_test_path', 
                           os.path.abspath(os.path.join(os.path.dirname("__file__"), '..', 'data/tf_records/test/')),
                           'Path of the test data.')
tf.app.flags.DEFINE_string('checkpoints_path', os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'checkpoints/model.ckpt')), 
                           'Path for the test data.')
tf.app.flags.DEFINE_integer('num_epoch', 1000,
                            'Number of training epochs.')
tf.app.flags.DEFINE_integer('batch_size', 16,
                            'Size of the training batch.')
tf.app.flags.DEFINE_float('learning_rate',0.0005,
                          'Learning_Rate')
tf.app.flags.DEFINE_boolean('l2_reg', False,
                            'L2 regularization.'
                            )
tf.app.flags.DEFINE_float('lambda_',0.01,
                          'Wight decay factor.')
tf.app.flags.DEFINE_integer('num_v', 3952,
                            'Number of visible neurons (Number of movies the users rated.)')
tf.app.flags.DEFINE_integer('num_h', 128,
                            'Number of hidden neurons.)')
tf.app.flags.DEFINE_integer('num_samples', 5953,
                            'Number of training samples (Number of users, who gave a rating).')
FLAGS = tf.app.flags.FLAGS
def main(_):
    '''Building the graph, opening of a session and starting the training od the neural network.'''
    num_batches=int(FLAGS.num_samples/FLAGS.batch_size)
    with tf.Graph().as_default():
        train_data, train_data_infer=_get_training_data(FLAGS)
        test_data=_get_test_data(FLAGS)
        iter_train = train_data.make_initializable_iterator()
        iter_train_infer=train_data_infer.make_initializable_iterator()
        iter_test=test_data.make_initializable_iterator()
        x_train= iter_train.get_next()
        x_train_infer=iter_train_infer.get_next()
        x_test=iter_test.get_next()
        model=TrainModel(FLAGS, 'training')
        train_op, train_loss_op=model.train(x_train)
        prediction, labels, test_loss_op, mae_ops=model._validation_loss(x_train_infer, x_test)
        saver=tf.train.Saver()
        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            train_loss=0
            test_loss=[]
            mae=[]
            for epoch in range(FLAGS.num_epoch):
                sess.run(iter_train.initializer)
                sess.run(iter_train_infer.initializer)
                sess.run(iter_test.initializer)
                for batch_nr in range(num_batches):
                    _, loss_=sess.run((train_op, train_loss_op))
                    train_loss+=loss_
                for i in range(FLAGS.num_samples):
                    pred, labels_, loss_, mae_=sess.run((prediction, labels, test_loss_op,mae_ops))
                    test_loss.append(loss_)
                    mae.append(mae_)
                print('epoch_nr: %i, train_loss: %.3f, test_loss: %.3f, mean_abs_error: %.3f'
                      %(epoch,(train_loss/num_batches),np.mean(test_loss), np.mean(mae)))
                if np.mean(mae)<0.9:
                    saver.save(sess, FLAGS.checkpoints_path)
                train_loss=0
                test_loss=[]
                mae=[]
if __name__ == "__main__":
    tf.app.run()

这段代码是一个基于 TensorFlow 实现的推荐系统模型的训练和测试脚本。下面是每个部分的详细解释:

  1. 引用所需的库和模块:
import numpy as np
import tensorflow as tf
import os
from data.dataset import _get_training_data, _get_test_data
from model.train_model import TrainModel
from sklearn.metrics import mean_absolute_error, mean_squared_error

其中,numpytensorflow 是必备的机器学习库,os 库用于操作文件路径,dataset 模块包含数据预处理的函数,train_model 模块包含了定义模型架构和训练的类,sklearn 库用于计算均方误差和平均绝对误差。

  1. 定义一些 TensorFlow 的全局变量:


tf.app.flags.DEFINE_string('tf_records_train_path', 
                           os.path.abspath(os.path.join(os.path.dirname("__file__"), '..', 'data/tf_records/train/')),
                           'Path of the training data.')
tf.app.flags.DEFINE_string('tf_records_test_path', 
                           os.path.abspath(os.path.join(os.path.dirname("__file__"), '..', 'data/tf_records/test/')),
                           'Path of the test data.')
tf.app.flags.DEFINE_string('checkpoints_path', os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'checkpoints/model.ckpt')), 
                           'Path for the test data.')
tf.app.flags.DEFINE_integer('num_epoch', 1000,
                            'Number of training epochs.')
tf.app.flags.DEFINE_integer('batch_size', 16,
                            'Size of the training batch.')
tf.app.flags.DEFINE_float('learning_rate',0.0005,
                          'Learning_Rate')
tf.app.flags.DEFINE_boolean('l2_reg', False,
                            'L2 regularization.'
                            )
tf.app.flags.DEFINE_float('lambda_',0.01,
                          'Wight decay factor.')
tf.app.flags.DEFINE_integer('num_v', 3952,
                            'Number of visible neurons (Number of movies the users rated.)')
tf.app.flags.DEFINE_integer('num_h', 128,
                            'Number of hidden neurons.)')
tf.app.flags.DEFINE_integer('num_samples', 5953,
                            'Number of training samples (Number of users, who gave a rating).')
FLAGS = tf.app.flags.FLAGS

这些全局变量包括数据路径、训练的超参数、模型架构的参数等。这些参数将在后面的训练和测试过程中使用。

  1. 定义 main 函数,包括以下步骤:
  • 初始化训练和测试数据的迭代器
  • 定义模型架构和损失函数
  • 开始训练,每个 epoch 打印训练和测试结果,并保存最佳模型。


def main(_):
    '''Building the graph, opening of a session and starting the training od the neural network.'''
    num_batches=int(FLAGS.num_samples/FLAGS.batch_size)
    with tf.Graph().as_default():
        train_data, train_data_infer=_get_training_data(FLAGS)
        test_data=_get_test_data(FLAGS)
        iter_train = train_data.make_initializable_iterator()
        iter_train_infer=train_data_infer.make_initializable_iterator()
        iter_test=test_data.make_initializable

with tf.Graph().as_default(): 中,我们首先通过调用 _get_training_data_get_test_data 函数获得了用于训练和测试的数据集对象 train_datatrain_data_infertest_data,然后我们分别为它们创建了可重新初始化的迭代器 iter_trainiter_train_inferiter_test

接下来,我们分别使用 iter_train.get_next()iter_train_infer.get_next()iter_test.get_next() 从这些数据集对象中获取下一个 batch 的数据,这些数据将用于训练和测试模型。

然后,我们使用 TrainModel 类创建了一个名为 model 的对象。 TrainModel 类实现了我们的协同过滤模型。TrainModel类在 model/train_model.py 中定义,并定义了训练、验证和测试模型所需的所有函数。在此处,我们创建了用于训练模型的 train_optrain_loss_op,以及用于验证模型的 predictionlabelstest_loss_opmae_ops

在这个模型之后,我们定义了一个 Saver 对象。在训练过程中,我们可以定期保存模型的参数,以便在训练意外中断或完成时进行恢复或使用。

最后,在 with tf.Session() as sess: 代码块中,我们开始训练我们的模型。我们使用 sess.run(tf.global_variables_initializer()) 初始化所有变量,然后开始循环训练。在每个 epoch 中,我们将训练集和测试集迭代器分别初始化,并在每个 batch 中运行 train_optrain_loss_op 计算损失和更新模型的参数。然后,我们用验证集的数据运行 predictionlabelstest_loss_opmae_ops 计算模型的性能指标。最后,我们输出当前 epoch 的训练损失、测试损失和平均绝对误差(MAE),并保存模型参数(如果 MAE 小于 0.9)。

整个代码的目的是使用协同过滤算法建立电影推荐系统的模型,训练模型并计算模型的性能指标。


这是一个使用 TensorFlow 实现的推荐系统的训练代码。该模型使用基于矩阵分解的协同过滤方法,并且采用了一个含有一个隐藏层的前馈神经网络作为自编码器来学习用户和项目的表示。主要代码如下:

  • 导入必要的库,包括 numpy,tensorflow,os 等,并导入自定义的数据集和模型的相关函数。
  • 使用 tf.app.flags 定义了一些命令行参数,包括训练数据路径、测试数据路径、训练批次大小、学习率、L2 正则化系数、神经网络的输入和输出层大小等。
  • 定义了一个 main 函数作为程序入口,并在该函数中构建了神经网络模型的计算图、训练过程和模型的保存。
  • 程序运行时,会首先初始化所有变量,然后开始迭代训练,每个 epoch 都会进行一次训练和测试,并输出训练和测试的损失和平均绝对误差。如果模型在测试集上的表现优于预设值,就会保存模型。

该模型是基于 TensorFlow 的实现,可以用于推荐系统的训练和预测,以及其他需要进行协同过滤的任务。其中,自编码器的使用可以降低数据维度,并且通过隐含层的特征表示来学习用户和项目的表示,从而提高推荐的准确性。


x_test: 用于在训练期间评估模型验证损失的测试数据。 model: TrainModel类的实例,定义在model/train_model.py中,其中包含定义神经网络架构和训练模型的TensorFlow操作。 train_op: 运行神经网络模型训练步骤的TensorFlow操作。 train_loss_op: 计算神经网络模型训练损失的TensorFlow操作。 prediction: 计算模型在训练数据上预测评分的TensorFlow操作。 labels: 训练数据的实际评分的TensorFlow操作。 test_loss_op: 计算神经网络模型在测试数据上的验证损失的TensorFlow操作。 mae_ops: 计算神经网络模型在测试数据上的平均绝对误差的TensorFlow操作。 saver: 用于将训练好的模型检查点保存到磁盘的TensorFlow saver对象。 num_batches: 训练数据中的批次数,由总训练样本数除以批量大小确定。 sess: 用于运行训练循环和评估神经网络模型性能的TensorFlow会话。 tf.global_variables_initializer(): 初始化神经网络模型的所有可训练参数的TensorFlow操作。 epoch: 循环变量,迭代由num_epoch标志指定的时期数。 batch_nr: 循环变量,迭代训练数据中的批次数。 _: 下划线字符用作未使用值的占位符,在Python中是一种惯例。在此代码中,它用于表示tf.app.run()的返回值未被使用。


相关文章
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(三)
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(三)
|
5月前
|
机器学习/深度学习 编解码 PyTorch
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(四)
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(四)
|
5月前
|
机器学习/深度学习 编解码 计算机视觉
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(一)
|
5月前
|
机器学习/深度学习 编解码 PyTorch
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(二)
深入 YOLOv8:探索 block.py 中的模块,逐行代码分析(二)
|
程序员 开发者 Python
#PY小贴士# py2 和 py3 的差别到底有多大?
虽然结论已经很明确,但我还是想客观地说一句:对于学习者来说,学 py2 还是 py3,真的没有太大差别。之所以这会成为一个问题
|
5月前
|
索引
yolov5--detect.py --v5.0版本-最新代码详细解释-2021-6-29号更新
yolov5--detect.py --v5.0版本-最新代码详细解释-2021-6-29号更新
230 0
yolov5--detect.py --v5.0版本-最新代码详细解释-2021-6-29号更新
|
机器学习/深度学习 测试技术 TensorFlow
dataset.py代码解释
这段代码主要定义了三个函数来创建 TensorFlow 数据集对象,这些数据集对象将被用于训练、评估和推断神经网络模型。
118 0
|
5月前
|
机器学习/深度学习 索引
yolov5--loss.py --v5.0版本-最新代码详细解释-2021-7-1更新
yolov5--loss.py --v5.0版本-最新代码详细解释-2021-7-1更新
276 0
|
5月前
yolov5--datasets.py --v5.0版本-数据集加载 最新代码详细解释2021-7-5更新
yolov5--datasets.py --v5.0版本-数据集加载 最新代码详细解释2021-7-5更新
245 0
|
数据可视化 PyTorch 计算机视觉
YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py
YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py
2625 2
YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py