一:函数理解:
1: torch.concatenate(tensor 1 , tensor2 , axis =0,1)
若axis = 0,则在列上进行连接,若axis = 1 ; 则在行上进行连接 ; 同时tensor可以换成numpy进行连接 ;
2:torch.norm(numpy or tensor , ord =1 /2 , axis =0 /1)
详解:是求tensor或者numpy的范数,若ord=1,则求第一范数,axis =0,则求列向量的范数 ;
3:torch.tensor.item():
解析:前面若是单元素的tensor时候,可以调用item将其变成一个标量;
4: 若a是二维的list , 关于list a [x:y]的截取说明:
a[x:y],左闭右开,取这些行 ;
a[x , y]:取x,y这个数 ;
a[1 , x::y]:在第二行,从x处开始,每隔y取一个数 ;
5:tensor和numpy的互换:
a = from_numpy(b),此时将numpy转换为tensor,且两者公用相同的内存 , 改变numpy的值就会改变tensor的值;
6:看完这本书后,记得在看一遍torch文档,然后在把之前的3DDFA和3DDFA_V2之前的项目看下,整理结束后,在看下3dmm face论文 ;
7:关于数据的特征变量还有标签的组合说明:所谓的特征变量就是影响因子 (比如房价估算中的房子面积数x1和房子年数x2就是两个已知特征变量数据),标签就是该特征变量在真实权重参数的计算下得到的真实值 ;
此时我们可用:
import torch.utils.data as Data
dataset = Data.TensorDataset(输入的特征变量值(房子面积还有房子年数), 该特征变量对应的真实标签(真实房价)) 作用:绑定特征白变量(影响因子)还有标签(真实值) ;
data_set = Data.Dataloader(dataset , batch_size , shuffle = true);
此时我们便可以获得打包好的数据集 ;
8:关于网络在训练前参数的初始化形式,可以参考如下形式进行初始化该权重参数 ;
from torch.nn import init
init.normal_(net.linear/conv2d/参数名.weight , mean = 0 ,std =0.1) ;
初始化均值为0 ,方差为0.1的参数 ;
9:关于线性回归中的全连接层说明:
全连接层输入的数据维度是[batch_size , 特征变量个数(参考房价预算的特征个数)] ,输出的维度数据是batch_size , 预测值;线性回归的全连接层一行只能输出一个数据 ;
在其中的运算形式是:output = input @ w.t() +b; 形变后就相当于output = w1x1 + w2x2+b;只不过变成了矢量的运算,返回的是个多维度的罢了;其中这个input就是输入的特征变量,w 就是权重参数, output就是这次的预测值 ; 全程可以参考房价预算的这个例子,包含两个特征的变量, 还有一个预测值 ;
10:关于softmax回归全连接层说明:
和线性回归的全连接层不同,全连接层的输出结果一行可以有多个数据!输出的数据维度是[batch_sieze , 输出数据的种类个数] ; 对于每个种类,都会对应有若干个权重参数 ;此时特征变量的参数维度还是一样, 但权重参数w矩阵就从原来的一列变成了多列,且输出数据的种类个数有多少就有多少列权重参数 , 从而根据全连接层运算的公式:
output = input @w .t()+b;全连接层的输出值才会一行有多个,而不是一行只有单一的输出值 ; 中间会自动经过sotfmax数值概率化处理;得到的输出值就代表每个图片属于该标签的概率值是多少,会自动选取概率值最大的索引为预测的标签!接下来我们引入了交叉熵损失函数,传入的数据注意下;
11:关于线性回归和softmax回归的区别:
线性回归的全连接层输出结果一行只有一个数据,softmax回归的全连接层输出结果一行有多个数据 ; 他们的全连接层输出的公式都为
output = input@w.t() +b ; 其中input是输入特征变量(影响因子),大多数都是固定的相关变量的已知数据 ; 其中线性回归中w权重参数的矩阵是一列的,因为只有一个输出值 ; 而softmax回归的权重参数w矩阵是多列的,至于有多少列取决于输出数据的特征变量的个数,此时矩阵的运算才会输出一行有多个数据;在softmax回归中,输出的结果自动会进行softmax概率化处理,即将数据概率化,从而返回的值变为每个图片属于该标签的概率值是多少,且系统会自动选取概率值最大的索引为给该图片预测的标签 ;
12:多层感知机:
多层感知机中含有至少一层的隐藏层,该层会将中间的过度特征变量(过度影响因子)进行激活函数处理,然后在作为特征变量输入到下一层的全连接层中;形式如下:
其中将前面的特征变量进行全连接层处理后,得到中间的过度特征变量,对该过度特征变量进行激活函数处理,然后继续将该特征变量输入到全连接层中
13:经过上述的分析我们可以得知激活函数的作用:将特征变量经过隐藏层处理后得到的中转特征变量,将中转特征变量进行激活函数处理,然后再将该中转特征变量变成 特征变量,再输入到全连接层中 ;
14:在图片分类的softmax回归中,特征变量(影响因子)就是像素值;
15:多层感知机的说明:
多层感知机就是多个全连接层连接在一起,其中包含了输入层,隐藏层,输出层;
输入层:就是输入的特征变量个数,也就是影响因子;
隐藏层:就是中转特征变量,其中我们可以对中转特征变量进行relu函数处理,然后再对中转特征变量进行dropout随机丢弃处理,所谓的dropout函数就是概率性的随机丢弃部分的中转特征变量,等同于将该中转特征变量因子置为0,然后再该中转特征变量变为 输入的特征变量时,该特征变量的影响度就为0,从而很大程度上减少了对该特征变量的依赖性 ;
输出层:输出层就是输出数据的种类个数,会进行softmax函数处理,返回数据代表每个图片属于该标签的概率值是多少 ;
dropout函数的说明:为了防止抖动过拟合从而引入了dropout函数 ,所谓的dropout函数就是选择性的丢失隐藏层中的中转特征变量,即将丢失的中转特征变量设置为0;从而再下层计算的时候无任何的影响效果 ;
16:关于softmax回归中的全连接层的权重参数说明:权重参数的维度取决于输入数据的特征变量个数和输出数据的种类个数 ; 输入数据的特征变量个数为多少权重参数的行数就有多少 ; 输出数据的种类个数为多少,权重参数的列数就有多少 ; 全程参考全连接层的公式:
output = input @ w.t() +b ;
17:关于全连接层的整体说明:
输入的数据是:batch_size , 输入数据的特征变量个数(影响因子个数);
输出的数据是:batch_size , 输出数据的特征变量个数;
运算公式是:output = input @w.t()+b ;
权重参数的维度说明:行数与输入数据的特征变量的个数保持一致,列数与输出数据的特征变量个数保持一致 ;
全连接层输出的数据一行可能有多个,且会自动进行softmax概率化处理,从而返回的值就变成了每个图片属于该标签的概率值是多少 ;
18:torch.index_select(input , dim , index)的说明:
input是输入的tensor , dim 是再哪个维度上进行选取 ; index是个list,用来标注选取哪些行或者列 ;
19:torch.nn.init.normal(tensor , mean , std): 用于初始化权重参数
torch.nn.init,constant_(tensor , 数值);利用数值填充张量
激活函数对这个隐藏层中的中转特征变量进行处理 ;
pytorch要求所有的计算数据都在同一个GPU上 ,此时才可以运算;
20:collections.OrderDict():创建的字典是个有序字典,他能够记住该字典的键值对的添加顺序,从而形成一个有序字典 ;
再图片分类任务中,像素点就是特征变量,特征变量个数就是像素点个数 ;
21:model.name_paremeters():
for name , param in model.name_parameters()
返回的name是参数名,返回的param是参数值 ;
22:model.parameters()
for param in model . parameters()
只会返回参数值,而不会返回参数名;
23:我们可以利用卷积核对图片进行求导,从而我们可以得到边缘像素(两点的像素突然变化的位置就是边缘,比如从黑色突然变成白色的像素,那么这点就是一个边缘); 如何利用卷积核对相片进行求导呢,即,利用一个1x2的卷积核,进行右边减去左边;
24:沿着梯度的方向更新权重参数,可以优化模型的输出结果,从而使得损失值越来越小 ;
25:np.mgrid()的用法如下:
26:关于画出多窗口的图片说明;
一:首先创建一个窗口对象 :
_ , axes =plt.subplot(2, 3 , figsize = ())
二:分别向每个窗口对象中添加内容:
axes[i][j] = plt.imshow(图片Numpy) ;
三:最后直接显示该窗口对象即可;
axes.show()
27:关于微调神经网络的说明:
首先调用别人已经预训练好的模型:
from torchvision import models
net = models.Resnet(pretrained = true)#此时就可以直接调用resnet模型了,并且已经下载好其源模型的参数 ;此时我们可以将提取特征的部分权重参数的required_grad设置为0 ,即提取特征部分的参数不需要进行更新了,从而节省了存储空间 ;
然后更改别人模型的全连接层,更改为自己想要的全连接层 ; 此时我们还需将该全连接层的参数的requried_grad设置为true ; 需要对该部分的参数进行更新 ‘ ;
总之,对提取特征的部分不需要更新参数,而自定义的分类部分还需更新参数 ;
net . fc = nn.linear(512 , 2)
net.fc.weight.required_grad = true ;
28:关于转置卷积层得说明:
详情可以看下dive into deeplearning 这本书,转置卷积层主要作用就是将输入得图片得长宽进行放大,同时,转置卷积层得权重参数初始化方法采用双线性插值初始化方法 ;
29:全卷积网络先使用卷积神经网络抽取图像特征,然后通过1x1卷积层将通道数变换为类别个数;
最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸,从而输出每个像素的类别(通道数来代替其类别,每个通道上的数据代表该像素属于该类别的概率值是多少)。 其中可以用线性插值法初始化转置卷积层得参数 ;
30:关于Gram(格拉姆矩阵)得说明:
31:在图片分类任务中 , 将图片和标签绑定为一个字典(字典的key是图片名字,value是标签); 然后便可以对该字典进行DataLoader进行打包了 ; 打包数据形成批次,一批就是包括图片还有标签的数据值 ;