今天起的很早,3:30就起了。我真的很喜欢早起的感觉。 早上第一次尝试用notability做笔记,梳理了一个slide的内容。大概是什么是机器学习,神经网络的搭建步骤(对理解神经网络很有帮助)。
后来又看了一些L2的正课,就去收拾宿舍、干活了。现在8:00,打算继续看L2!
0837听完了L2的正课,主要是在用一个实际区别的例子讲解训练集采样的问题。引出了训练集与Dall之间的概率分布问题,并说明模型复杂度和样本数据量共同决定着L(htrain,Dall)和L(hall,Dall)之间的差距。虽然减小H可以使两者close,但是也会使“理想崩塌”,也就是L(hall,Dall)减小,因为H的可选择空间变小了。
0843突然想到,其实可以在ipad上做预习,到时候复习也好check!!!下载一下slides。
0847下完资料,预习一下作业,看作业去。 0858看完资料了,在想要不要在ipad上做笔记!感觉可以试一下! 0920太香了!!!可以在ipad上预习+做笔记;然后在notability上总结问题和践行费曼学习法的时候!!!去接个水!!!开始看code!!!先跑一下
0926回来看代码 1、这里的*是干什么的呢? 因为大概知道意思,所以就查了一下“如何写多个同样的结构” 大概的意思是,*是一个可以拆分列表的运算符,具体如下:
可以看到psxx的层的东西都是一样的,层结构一样,参数也一样,那么有没有个方便的写法,简化一些。 python里面有个写法是可以这样生成一个列表的, [a for a in list_a] 又有一个能把列表的元素拆分成单个元素的*运算符。 那么就可以改成这样: 参考链接:https://blog.csdn.net/Yonggie/article/details/115373788
2、gc.collect()作用,del作用,两者区别? 大概看了一下,就是del不一定会清空内存,但是del的本意是清空内存,为了确保真的清空了,我们就gc一下。 参考:https://www.py.cn/jishu/jichu/10819.html
清空内存,源代码如下:
3、代码主体流程 正好复习一下pytorch的使用,巩固一下。写了注释。 一、数据预处理 1、观察数据,对其进行加工 2、返回向量形式 二、定义数据集类、划分数据集、dataloader 三、定义模型 四、准备训练(确认gpu及实例化) 1、查看gpu连接 2、定义种子 3、实例化模型 4、实例化criterion,损失函数 5、实例化optimizer 五、训练 清理train_loader和val_loader所占用内存空间 六、测试 ------load data 1、导入 2、实例化数据类 3、使用DataLoader获得batch集。
--------load model 1、实例化模型 2、把参数导入到模型中
---------预测测试集
test_acc = 0.0
test_lengths = 0
pred = np.array([], dtype=np.int32)
model.eval()
with torch.no_grad():
for i, batch in enumerate(tqdm(test_loader)):
features = batch
features = features.to(device)
outputs = model(features)
_, test_pred = torch.max(outputs, 1)
pred = np.concatenate((pred, test_pred.cpu().numpy()), axis=0)
model.load_state_dict(torch.load(model_path))
4、pytorch相关语法 (1)torch.max的返回值 如果加了dim的话,会返回(最大值,索引)
(2)detach()作用
因为torch中计算的数据都是带有gradient的,所以想要转化为其他类型,就要先把gradient去掉,这也就是detach的作用! 参考文献: https://codeantenna.com/a/kYNYAYqUeu 1135啊啊啊上午没看手机,突然被同学叫去开会了。 又弄了一下快递的事情,现在打完饭,预习一下下一章节的slides,一会下去吃的时候可以看。下午1350还要去做核酸~
1139把主要代码的comment补完,梳理了一遍,自己还没能力写!有机会复现!
best_acc = 0.0
for epoch in range(num_epoch):
train_acc = 0.0
train_loss = 0.0
val_acc = 0.0
val_loss = 0.0
model.train()
for i, batch in enumerate(tqdm(train_loader)):
features, labels = batch
features = features.to(device)
labels = labels.to(device)
optimizer.zero_grad()
outputs = model(features)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
_, train_pred = torch.max(outputs, 1)
train_acc += (train_pred.detach() == labels.detach()).sum().item()
train_loss += loss.item()
if len(val_set) > 0:
model.eval()
with torch.no_grad():
for i, batch in enumerate(tqdm(val_loader)):
features, labels = batch
features = features.to(device)
labels = labels.to(device)
outputs = model(features)
loss = criterion(outputs, labels)
_, val_pred = torch.max(outputs, 1)
val_acc += (val_pred.cpu() == labels.cpu()).sum().item()
val_loss += loss.item()
print('[{:03d}/{:03d}] Train Acc: {:3.6f} Loss: {:3.6f} | Val Acc: {:3.6f} loss: {:3.6f}'.format(
epoch + 1, num_epoch, train_acc/len(train_set), train_loss/len(train_loader), val_acc/len(val_set), val_loss/len(val_loader)
))
if val_acc > best_acc:
best_acc = val_acc
torch.save(model.state_dict(), model_path)
print('saving model with acc {:.3f}'.format(best_acc/len(val_set)))
else:
print('[{:03d}/{:03d}] Train Acc: {:3.6f} Loss: {:3.6f}'.format(
epoch + 1, num_epoch, train_acc/len(train_set), train_loss/len(train_loader)
))
if len(val_set) == 0:
torch.save(model.state_dict(), model_path)
print('saving model at last epoch')
1140去预习一下slides,然后下去吃饭!!!
鹅鹅鹅刚刚睡醒了看完了cnn。 去做核酸,发现蓝桥出成绩了。从省三开始看,发现没有自己,以为gg了,没想到得了一等奖。接下来要好好准备了!!!每天写writeup~现在先去y总网站还愿。 看了一下决赛原计划的时间是5月底-6月。从今天开始,每天写两道writeup,应该没啥问题。 现在先去跑个模型。
15:00,和导师交代完了。老师说国一才值得祝贺,那就只好努努力了哈哈哈!!! 我现在要跑L2的实验了。已经忘了写到哪里了。
----1514把代码过了一遍,comment了,现在开始做一些改进! 原本的训练情况
主要看下report的任务吧 任务一: 1\对于隐藏层为6层,每层为1024的网络。 【这个更深一点】
Train Acc: 0.479256 Loss: 1.780055 | Val Acc: 0.468751 loss: 1.823825
2、改为2,1700 【这个更胖一点】 Train Acc: 0.486203 Loss: 1.750067 | Val Acc: 0.471475 loss: 1.814500 saving model with acc 0.471 对比: 1、acc、泛化能力 胖模型的acc差一点,但是loss小一点,也就是泛化能力差。 2、收敛速度 粗略比较,感觉深的收敛快一点???参数一样多的情况下,每个参数性价比更高导致的?
跑的好慢,而且不知道怎么看收敛速度。刚刚预习完了下面的正课,可以开始听课了 想了一下,收敛速度应该就是说loss下降到不动的速度把,应该画个图的。
---------1557看完了Validation set。主要讲的是为什么通过validation set选出来的模型在测试集也不好。我本来以为是数据分布问题。但其实,在Dval里面选一个func使得loss最小,也是一个训练过程,所以也符合我们之前讨论的,“训练集和测试集结果相似度与H和N有关”的结论,如果val里的模型尝试过多,就代表其H过大,那结果相似度就会下降。通俗理解,就是尝试的多了,就过拟合了,失去了generalization,这是我自己理解的部分。 胖模型也跑完了,正好在下一讲之前看看结果。下一讲要讨论这个事情。
任务二:设置dropout(解决过拟合吗) 1\0.25 2\0.5 3\0.75 ACC:随着dropout增大,val和train的acc减小; 收敛:dropout增大,收敛变快 泛化能力:dropout增大,泛化能力变强 我觉得用dropout还是得看模型复杂度和数据多少的,看看有没有过拟合之类的
现在1708,看完了L3的第二讲,讲的是为什么要深度学习,而不是学习。其实,深度学习参数效率会提高,能够在保证h相同的情况下,为模型提供更多可能性,使其L(hall,Dall)变得更小,而由于h没变、N没变,所以二者之间的距离没有变大,所以L(htrain,Dall)【也就是我们需要的那个值】,也随着变小。解决了上面因为改变h造成的两难问题。所以深度学习其实是一种效率很高的学习,和我们想法中的那种需要很多参数,很多数据的理念还不一样,因为人家已经是宽广学习的优化版本了,已经有用到效率很高的参数了!!
=—1712写完了!!养了几天膝盖了,现在去跑步试一试,然后回来吃饭之类的~先把ppt放在云盘,一会路上看看。
—1721找到了17年RNN的课件!!!终于可以学attention了!!!开心!现在传到云盘
-------2107出了点小问题,回来有点晚了,今天先到这里叭。明天再看,去给舍友讲点东西。
|