第一章:
1.一个GPU使用的是.cuda,可以进行加速。要将模型和tensor都转化为GPU形式。
2.当有多个GPU的时候,转化的方式是与一个GPU不同的,代码可以在多个GPU上进行并行处理!
PS:cpu 单gpu 多gpu都可通过最开始的判断方式进行判断,赋值给device
#model是训练模型
#先判断gpu和cpu
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#再判断多个GPU,转换model
if torch.cuda.device_count() > 1:
model = nn.DataParallel(model)
#将模型最终通过.to放到cpu上
model.to(device)
#dataLoader里的数据转换为gpu形式
for data in rand_loader:
input = data.to(device)
output = model(input)
第二章
第一小节
1.对一个tensor x而言,x.shpae等价于x.size().
2.标量是一个0阶张量,区分tensor的不同维度代表不同意义 3.对测试集进行处理时为了增快速度可以采用with torch.no_grad()
4.
有关autograd,例如z=x+y,那么x和y是自己创建的变量,是创建变量/叶子结点,而z是x+y得到的,所以是结果变量。对结果变量进行反向求导而最终得出其创建变量的导数(链式求导法则)。
5.
一般情况下数据类是自己创建的,需要继承Dataset类,并满足以上要求
6.
自定义自己的数据类型,初始化时参数导入自己的文件;可以通过索引访问对应的数据。
7.如何加载数据集,
Dataloader的第一个参数就是经过自定义数据集的变量;
8.该model包含六大常用模型结构,其中以残差网络最为好用与著名
第二小节
1.
多分类一般都是用这个损失函数,因为它结合了其他损失函数的优点,所以更为普遍及适用。
2.在机器学习领域中,由于数据量的不足会导致局部最优点的出现,导致结果错误,而在深度学习领域,特征数呈几何倍数增长,故该问题便无需再担心。
3.mini-batch的作用是为了优化梯度下降!
4.优化器算法用Adam就完了老铁没毛病,默认即可(除非要对比调参什么的)。
5.
方差与偏差的意义。
需要强调的是,L1正则化反而会比L2正则化更易获得稀疏解,
该图中绿点是原始的loss;黄点是L2的loss,因为是L2正则化,其起到的作用就是将原始线的幅度进行小幅度缩小;红点就是L1的正则化,最优的 x 就变成了 0,这里利用的就是绝对值函数的尖峰。
两种 regularization 能不能把最优的 x 变成 0,取决于原先的费用函数在 0 点处的导数。如果本来导数不为 0,那么施加 L2 regularization 后导数依然不为 0,最优的 x 也不会变成 0。而施加 L1 regularization 时,只要 regularization 项的系数 C 大于原先费用函数在 0 点处的导数的绝对值,x = 0 就会变成一个极小值点。上面只分析了一个参数 x。事实上 L1 regularization 会使得许多参数的最优值变成 0,这样模型就稀疏了。
第三小节
1.激活函数的作用,就类似生物神经元一样,如果每一个神经元(上面说到的简单单元)接受输入x,通过带权重w的连接进行传递,将总输入信号与神经元的阈值进行比较,最后通过激活函数处理确定是否激活,并将激活后的计算结果y输出,而我们所说的训练,所训练的就是这里面的权重w。神经网络中的激活函数就是用来判断我们所计算的信息是否达到了往后面传输的条件,而权重w是内部训练的结果,有没有作用则不一定。
激活函数有很多,需要细细挑选。
2.在NLP领域中GELU结合transformer是最好的
3.sigmoid和tanh的区别就在于后者归一化,中心在0处,一般目前只有二分类还在应用sigmoid作为全连接层的激活函数,用tanh作为隐藏层的激活函数。无脑使用Relu总体来说是个不错的选择。
第四小节
1.LeNet是最早的卷积网络,效果不行,98年改进的LeNet-5加入了池化层使得其取得成功。12年的AlexNet,14年的VGGNet、GoogLeNet,15年的ResNet。
2.在卷积网络中的过滤器filter,权重矩阵的大小一般为33或55,因为经过验证3和5是最佳的大小!
3.
根据不同的场景,分类和回归,具有不同的最终输出函数。
4.
不同CNN网络结构的示意图:圆圈大小是参数数量,横轴是操作次数,纵轴是准确率
第五小节
1.
RNN网络搭建中最需要注意的参数以及可以采用默认值就好的参数。
2.
LSTM:长短时记忆网络 ,LSTM虽然只解决了短期依赖的问题,并且它通过刻意的设计来避免长期依赖问题,这样的做法在实际应用中被证明还是十分有效的
GRU:GRU 和 LSTM 最大的不同在于 GRU 将遗忘门和输入门合成了一个"更新门",同时网络不再额外给出记忆状态,而是将输出结果作为记忆状态不断向后循环传递,网络的输人和输出都变得特别简单。
第三章
第一小节
1.一般max()中填取-1即可,选取的就是最后一个维度的最大值。
list必须转换为tensor类型才能用该函数,该函数是专门tensor类型的。
所以[0]输出的是对应维度的最大值,而[1]输出的是最大值所对应的index。二维矩阵当中(-1)与(1)的效果相同(因为1就是最后一个维度),都是对行进行选取。
而max(0)是按照列来挑选的,起始是0。
第二小节
1.softmax搭配CrossEntropyLoss,log_softmax搭配NLLLOSS,具体解释
log_softmax与NllLoss的搭配使用
2.with torch.no_grad():的使用:在使用pytorch时,并不是所有的操作都需要进行计算图的生成(计算过程的构建,以便梯度反向传播等操作)。而对于tensor的计算操作,默认是要进行计算图的构建的,在这种情况下,可以使用 with torch.no_grad():,强制之后的内容不进行计算图构建。因为计算与否的结果无差距,不计算还会省时间。
3.view函数行数是BATCH_SIZE,列数是-1自动匹配,这样再去进行全连接层的处理,首先先要展开数据。
算损失函数的累加和时用这样的函数
4.
torch的一些简写,eq就是等于,返回一个布尔矩阵:
5.view 与 view_as的区别:
后者返回被视作与给定的tensor相同大小的原tensor。 等效于:
self.view(tensor.size())
自我感觉如果不使用view函数进行裁剪操作只是改变维度则两者无区别。
之所以第一个Linear是101020的原因即如此。
第三小节
1.
RNN的结构搭建与CNN是有一些区别的。最后还是要有一个全连接层,并且输入是隐藏神经元的个数,输出是单个数据所以是1.
2.
RNN结构传入的参数是x和h_stae。r_out.size(1)就是有多少个time_step,从而进行循环,每走一步重新进行一次预测判断。
3.
扩展维度,因为RNN模型的输入要求是三维数据!所以必须扩展为三维的[[[1],[2],[3]]]。
4.
教训,能写数据类型的统写为一种数据形式,必须要写,不然会报错!该报错就是因为数据类型不一致,输入是64位的,而要求是float32位的。而且报错的位置会很诡异!
第四章
第一小节
1.针对于某个任务,自己的训练数据不多,那怎么办? 没关系,我们先找到一个同类的别人训练好的模型,把别人现成的训练好了的模型拿过来,换成自己的数据,调整一下参数,再训练一遍,这就是微调(fine-tune)。 PyTorch里面提供的经典的网络模型都是官方通过Imagenet的数据集与训练好的数据,如果我们的数据训练数据不够,这些数据是可以作为基础模型来使用的。
2.Fine-tune 更类似 Transfer Learning 的一部分,适用于后期微调当中。一般发论文都是这样,对原有架构某部分进行微调
3.可应用于消融实验当中,添加一个新的创新点时,针对性训练该部分,训练完成后再添加一部分进行训练。
4.456比较重要,网络结构要确保输入的图片大小是一定的;不然第5点会导致准确率下降!;6…???
5.resnet50的图片输入是224,需要对自己的数据进行尺寸修改,同时,最后一层全连接层可能也需要进行修改,修改输出数目!该例子可以当做模板借鉴!需要好好进行学习,时常查阅但如果要方便改或大范围还是直接借鉴resnet50本身的代码更好!使用自带的resnet50模板修改模型自我感觉没前者便利。
讲真,没咋懂
第二节
1.