今天我猛然惊醒,寒假只剩下三天了,2月14号我就要去学校了,但是我的科研进展微乎其微,我瞬间感觉很丧气。但是我也算是经历诸多挫折了,我现在只问自己一个问题,我现在能做什么。
首先,2月11,2月12,2月13,起码这三天,我在吃晚饭前不玩游戏不玩手机不看小说,我可以运动,我可以看书,我可以做家务,我可以学习。
1
train_dataset, val_dataset, test_dataset = torch.utils.data.random_split(
dataset, [train_length, val_length, length-train_length-val_length])
我们看一下这里的代码dataset无非就是原来的data嘛,后面这一部分,length是1009,train_length就是10090.7=706,val_length就是10090.1=100,它还有一个test_data,就是1009-706-100=203,所以这段代码的终极奥义局势train_dataset有706个样本,val_dataset有100个样本,test_dataset有203个样本
2
train_dataloader = utils.DataLoader(
train_dataset, batch_size=dataset_config["batch_size"], shuffle=True, drop_last=False)
这段代码的核心是dataloader,dataloader其实是为了批量处理数据而发明的,比如此处。batch_size是16,那么就是把train_dataset的706个样本每16个划分为一组,这样就划分了45组,这样批量训练可以加快训练速度。
val_dataloader = utils.DataLoader(
val_dataset, batch_size=dataset_config["batch_size"], shuffle=True, drop_last=False)
test_dataloader = utils.DataLoader(
test_dataset, batch_size=dataset_config["batch_size"], shuffle=True, drop_last=False)
这两段是同样的意思
3
return (train_dataloader, val_dataloader, test_dataloader), node_size, node_feature_size, timeseries
这一段是最重要的,dataloader函数要返回什么?要返回的就是三个训练器,以及划分矩阵的维度,还有训练数据
4
dataloader这个函数看完了,现在我看看main.py主函数
dataloaders, node_size, node_feature_size, timeseries_size = \
init_dataloader(config['data'])
这个node_size是100,node_feature_size和timeseries_size各是111。
5
use_train = BasicTrain
我就奇怪,这个BasicTrain我没见过,原来是引入的train里的一个函数
6
optimizer = torch.optim.Adam(
model.parameters(), lr=config['train']['lr'],
weight_decay=config['train']['weight_decay'])
opts = (optimizer,)
这一段的目的是初始化优化器,这个lr和weight都是从abide_PLSNet.yaml里面读取的,都是adam算法要用到的。我虽然没学过这个adam算法,但是我询问gpt了解到这个算法是一种深度模型用到的优化算法。
7
loss_name = 'loss'
if config['train']["group_loss"]:
loss_name = f"{loss_name}_group_loss"
if config['train']["sparsity_loss"]:
loss_name = f"{loss_name}_sparsity_loss"
我看懂这一段什么意思了
这个loss用单引号引起来代表它就是个字符串,之前没有定义过它。
train:
lr: 1.0e-4
weight_decay: 1.0e-4
epochs: 500
pool_ratio: 0.7
optimizer: adam
stepsize: 200
group_loss: true
sparsity_loss: true
sparsity_loss_weight: 0.5e-4
log_folder: result
# uniform or pearson
pure_gnn_graph: pearson
再看一下我的abide_PLSNet.yaml这个配置文件,里面的group_loss和sparsity_loss都是true,那这个loss_name就不断增加。
loss_name_group_loss_sparsity_loss
8
save_folder_name = Path(config['train']['log_folder'])/Path(config['model']['type'])/Path(
# date_time +
f"{config['data']['dataset']}_{config['data']['atlas']}")
也是奇了怪了,一个路径,直接写了不就行了,还要组合这了那了
result/PLSNet/ABIDE_else
9
就剩一个train函数了
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1"
你像我这台电脑,虽然很老了,但是好歹是个游戏本,有个gtx960M,所以device就会选择cuda,我电脑只有一个显卡,对应的标号是0,所以这个那个1没啥用
10
def __init__(self, train_config, model, optimizers, dataloaders, log_folder) -> None:
self.logger = Logger()
self.model = model.to(device)
self.train_dataloader, self.val_dataloader, self.test_dataloader = dataloaders
self.epochs = train_config['epochs']
self.optimizers = optimizers
self.best_acc = 0
self.best_model = None
self.best_acc_val = 0
self.best_auc_val = 0
self.loss_fn = torch.nn.CrossEntropyLoss(reduction='mean')
self.pool_ratio = train_config['pool_ratio']
self.group_loss = train_config['group_loss']
self.sparsity_loss = train_config['sparsity_loss']
self.sparsity_loss_weight = train_config['sparsity_loss_weight']
self.save_path = log_folder
self.save_learnable_graph = True
self.init_meters()
这个init初始化函数我一看就不对劲,因为我只往train函数里传了五个参数,为什么init函数却有6个参数吗,包括一个self,原来self是一个实例,通过self可以调动各种参数
train_process = use_train(
config['train'], model, opts, dataloaders, save_folder_name)
main函数的这一句往train里传了五个参数,分别是abide_PLSNet.yaml的train部分,model包括,abide_PLSNet.yaml的model部分,还有样本的100个维度,111个时间节点;opts是初始化器,大概是用来训练深度模型的;我刚才感觉有点奇怪,opts和dataloader有什么区别呢