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 实现的推荐系统模型的训练和测试脚本。下面是每个部分的详细解释:
- 引用所需的库和模块:
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
其中,numpy
和 tensorflow
是必备的机器学习库,os
库用于操作文件路径,dataset
模块包含数据预处理的函数,train_model
模块包含了定义模型架构和训练的类,sklearn
库用于计算均方误差和平均绝对误差。
- 定义一些 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
这些全局变量包括数据路径、训练的超参数、模型架构的参数等。这些参数将在后面的训练和测试过程中使用。
- 定义
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_data
、train_data_infer
和 test_data
,然后我们分别为它们创建了可重新初始化的迭代器 iter_train
、iter_train_infer
和 iter_test
。
接下来,我们分别使用 iter_train.get_next()
、iter_train_infer.get_next()
和 iter_test.get_next()
从这些数据集对象中获取下一个 batch 的数据,这些数据将用于训练和测试模型。
然后,我们使用 TrainModel
类创建了一个名为 model
的对象。 TrainModel
类实现了我们的协同过滤模型。TrainModel
类在 model/train_model.py
中定义,并定义了训练、验证和测试模型所需的所有函数。在此处,我们创建了用于训练模型的 train_op
和 train_loss_op
,以及用于验证模型的 prediction
、labels
、test_loss_op
和 mae_ops
。
在这个模型之后,我们定义了一个 Saver
对象。在训练过程中,我们可以定期保存模型的参数,以便在训练意外中断或完成时进行恢复或使用。
最后,在 with tf.Session() as sess:
代码块中,我们开始训练我们的模型。我们使用 sess.run(tf.global_variables_initializer())
初始化所有变量,然后开始循环训练。在每个 epoch 中,我们将训练集和测试集迭代器分别初始化,并在每个 batch 中运行 train_op
和 train_loss_op
计算损失和更新模型的参数。然后,我们用验证集的数据运行 prediction
、labels
、test_loss_op
和 mae_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()的返回值未被使用。