顶层设计:关于Session
1.
首先,我有了一个输入args
,它是所有的参数,有可能有多层多级。
他的下一级是args.b
,而不是args["b"]
。但是在下一级就不一样了,它是args.b["c"]
。
没办法,现在只能如此。
2.
-
loss_curve
用于保存每个epoch的loss值; -
acc_curve
用于保存每个epoch的acc值; -
best_acc
用于保存最好的那个acc; -
best_epoch
用于保存最好的那个epoch
3.
关于feeder,
我们首先得到两个dataset, train_set
和test_set
。
然后,利用train_set
得到两个loader,一个是train_loader
,一个是memory_loader
;另外就是test_set
得到test_loader
。
4.
关于model (这块因为涉及到重构,所以问题比较多)
之前的模型是,
Backbone \(\rightarrow\) cl
也就是说,我写了两个类,一个backbone,一个是cl。我得写两套参数,然后分别把这两套参数,给传进去。
但是问题是:
如果我想要复用这套系统,那么如果有一个简单的auto-encoder
并没有cl
模块,不就是吃瘪了吗?
更遑论我把cl
的一些功能,写进了类方法里面,也就是def _train(self):
和def _test(self):
这俩。
所以说我们从一开始就应该打造,统一的模型,输入输出的接口啊。
另外一个需要考虑的因素:
我们现在这个模型是一个训练和测试分离的模型,什么意思呢?也就是说,在训练过程中的诸多组件,在测试时并不会使用的。
5.
最后就是一些小角色,比如adam的优化器,比如cross entropy的loss,实际上我们不需要了吧
番外篇,为什么loss也需要.cuda()??
根据pytorch forum上面的讨论,如果说loss function里面没有可训练参数,那么其实也不必一定使用.cuda()
Additionally to what @royboy said, you need to push your criterion to the GPU, if it's stateful, i.e. if it has some parameters or internal states.
6. 最终面临的大问题。
-
把无监督3个loss,变成一个东西。我们可以给3个argument parser选项,来进行ablation study;
-
换成cosine 模拟退火
-
**在
nn.Module
里面解耦,我们可以,用一个loss
方法,作为training的公开接口,forward变成test的时候的公开接口。具体说来,我们可以在loss方法中,返回一个loss_dict
。
7. 该怎么把我们的net的参数进行一个解耦呢???
-
num_scale
: enc_in_c
enc_out_c
enc_num_layer
repeat_padding
dec_in_c
dec_out_c
dec_num_layer
proj_in_c
proj_hid_c
proj_out_c
pred_in_c
pred_hid_c
pred_out_c
还有一个参数,我觉得可以把num_classes
给变成nb_class
。