当刚入门深度学习,进行编程实践时,若掌握一些基本的小技巧(tricks),能够让初学者避免一些重复与无序的操作,更快的进入到深度学习的核心地带。下面我们盘点一下python神经网络编程的几个基础的小技巧。
1 交叉验证
刚开始编写与训练网络时,我们一般在深入理解已有模型和代码的基础上,对模型或代码进行再创造。但是笔者发现,GitHub上有部分研究者提供的源代码不涉及交叉验证部分。交叉验证在改造模型的初期非常重要,模型在验证集上的效果是我们调整超参数的重要参考,已有模型超参数基本上已经定型,所以较少有人提供交叉验证部分的代码,但在实际的研究中交叉验证是不可或缺的。
交叉验证一般分为留出法和K-fold法:留出法:将训练-验证-测试集按照一定比例分开(如6:2:2),留出验证集和测试集时要求随机采样,要尽量确保训练集、验证集合测试集的数据分布相同。
K-fold法:将原本的训练集分为K份,每次选择一份作为验证集。在k-1份的训练集上训练,然后在验证集上验证,持续k次,每次变更一次验证集。K-fold交叉验证法
sklearn.model_selection提供了多种KFold方法
from sklearn.model_selection import StratifiedKFold
kfold = StratifiedKFold(n_splits=k, shuffle=True, random_state=seed)
2 参数解析与汇总
argparser命令行与参数解析是当你输入cmd 打开dos 交互界面时候,启动程序要进行的参数给定。在linux系统中较多使用,当然在win系统也可使用,只要在主程序中一次定义,可以到处传参数。将所有的参数在一处汇总会使你的思路更加清晰。下面是pix2pix的参数段:
parser.add_argument('--dataroot', required=True, help='path to images (should have subfolders trainA, trainB, valA, valB, etc)')
parser.add_argument('--name', type=str, default='experiment_name', help='name of the experiment. It decides where to store samples and models')
parser.add_argument('--gpu_ids', type=str, default='0', help='gpu ids: e.g. 0 0,1,2, 0,2. use -1 for CPU')
parser.add_argument('--checkpoints_dir', type=str, default='./checkpoints', help='models are saved here')
...
pix2pix将所有的参数汇总在option里面,可以参考junyanz/pytorch-CycleGAN-and-pix2pixgithub.com
3 用表格记录误差曲线
训练时将训练集误差曲线和验证集误差曲线记录下来,从两个曲线中可以判断目前的训练状态:包括是否收敛/过拟合,学习率是否应该继续调整等。
可以利用pandas记录训练误差和验证误差
import pandas as pd
data_frame = pd.DataFrame(
data={'train loss': results['train_loss'], 'val loss': results['val_loss']},
index=range(start_epoch, current_epoch)
)
data_frame.to_csv(out_path + 'results.csv', index_label='Epoch')