Pip list
Conda create -n name python=3.x
Anaconda pytorch nvidia驱动
Conda activate创建虚拟环境

[]表示某一行,,进行分隔,比如说:
tensor([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
为[1,2;3,4;5,6;7,8]
是一个四行二列的矩阵
每存在一个[],就有一个维度。例如[1,2]是一个一维向量,而[[1,2]]是一个二维矩阵

维度相同形状不同时的两个张量执行代数运算时,python存在广播机制,python会将两者中各维度最大值作为最终的输出张量的形状,同时将各运算张量的空白部分由原部分复制得到。这个操作很有可能会引起误操作,在执行两个形状不同向量的代数运算时一定要明确广播机制。

处理NaN:
对于数值型数据来说,可以使用fillna(mean())的方法将同一类中NaN的数据变为类中那些不是NaN数据的均值。

get_dummies能实现类别的独热编码,以此实现不同输出的分类,n类独热编码就有n维。

向量:

矩阵范数通常使用下面这个公式:

(m,l,k,n)

此时u不再是关于x的函数

线性回归:

解析解:

用有限的样本近似全部样本

线性回归基本流程:
1.确定神经网络架构,学习率参数,迭代次数,代价函数和优化算法
1>net=nn.Sequential()
2>lr
3>NumEpochs
4>Loss = nn.MSELoss()
5>Trainer = torch.optim.SGD
2.确定训练集
data.TensorDataset
data.DataLoader
3.确定学习参数初值
net[0].weight.data.normal(0, 0.01)
net[0].bias.data.fill
(0)
4.开始学习:
前向传播,计算y=wX+b,进一步计算代价函数
l = Loss(net(X), y)
反向传播,计算导数,进一步利用梯度下降更新学习参数
Trainer.zero_grad()
l.backward()
Trainer.step()

Softmax

关于:if name == ‘main‘:
https://baijiahao.baidu.com/s?id=1744774969325487102&wfr=spider&for=pc

感知机:

多层感知机是神经网络的雏形,而多层感知机使用线性激活就相当于一个单层感知机
单层感知机是一个线性模型

11.

验证数据集不参加训练,用于反应超参数的好坏。(一般代码里的测试数据集test_set实际上是验证数据集Cross-Validation Set)
测试数据集只能被使用一次。

模型复杂度(VC维)、数据复杂度(目前没有定量指标)

权重衰退解决过拟合:

Dropout:

验证=推理

梯度消失与爆炸:

i.i.d独立同分布,输入为h,输入均值为0,E[h]=0

权重通常是一个在0附近很小的数,这使得tanh和ReLU能够满足f(x)->x,而调整sigmoid

Pytorch的层和块:
层思想:

Sequential是python的一个list,可以使用任何list的方法
块思想:

从编程的角度来看,块由类(class)表示。 它的任何子类都必须定义一个将其输入转换为输出的前向传播函数, 并且必须存储任何必需的参数。 注意,有些块不需要任何参数。 最后,为了计算梯度,块必须具有反向传播函数。 在定义我们自己的块时,由于自动微分提供了一些后端实现,我们只需要考虑前向传播函数和必需的参数。
到目前为止,我们一直在通过net(X)调用我们的模型来获得模型的输出。这实际上是net.call(X)的简写。 这个前向传播函数非常简单: 它将列表中的每个块连接在一起,将每个块的输出作为下一个块的输入。
要想直观地了解块是如何工作的,最简单的方法就是自己实现一个。 在实现我们自定义块之前,我们简要总结一下每个块必须提供的基本功能。
1.将输入数据作为其前向传播函数的参数。
2.通过前向传播函数来生成输出。请注意,输出的形状可能与输入的形状不同。例如,我们上面模型中的第一个全连接的层接收一个20维的输入,但是返回一个维度为256的输出。
3.计算其输出关于输入的梯度,可通过其反向传播函数进行访问。通常这是自动发生的。
4.存储和访问前向传播计算所需的参数。
5.根据需要初始化模型参数。

实现复杂的架构:(比nn.Sequential更灵活)

得到参数:

Parameter定义了一个可以优化的参数。可见所有的模型参数(例如weight和bias)都是Parameter的一个子类

键值对的方式访问元素:

方法名后缀_表示该方法是一个替换方法,python会直接将值刷新而不用你去把结果赋值。
Net.apply(function)将function要求的初始化赋入神经网络
Xavier初始化就是在这里被调用

当然,我们也可以对网络的某一层使用apply

torch.save和torch.load不仅可以存取神经网络,还可以存取各种张量,网络层等基本单元

加载时不仅要得到参数,还要得到模型,所以在新文件引入时必须要把模型架构给带走

GPU训练:

卷积层除了各元素是权重之外还可以加偏移(也是学习参数)

更多的特殊卷积层例:

卷积层的定义Conv2d
通道输入,通道输出,过滤器规模,是否要偏差
Conv2d的输入是一个四维张量,分别是批量数,通道数,高度和宽度
因此对于输入通常要进行reshape

可以在行和列上分别取不同的步长

为了简洁起见,当输入高度和宽度两侧的填充数量分别为ph和pw时,我们称之为填充(ph,pw)。当ph=pw=p时,填充是p。同理,当高度和宽度上的步幅分别为sh和sw时,我们称之为步幅(sh,sw)。特别地,当sh=sw=s时,我们称步幅为s。默认情况下,填充为0,步幅为1。在实践中,我们很少使用不一致的步幅或填充,也就是说,我们通常有ph=pw和sh=sw。
多通道时:

池化层:

使用深度学习框架中内置的二维最大汇聚层,来演示汇聚层中填充和步幅的使用:
默认情况下,深度学习框架中的步幅与汇聚窗口的大小相同。 因此,如果我们使用形状为(3, 3)的汇聚窗口,那么默认情况下,我们得到的步幅形状为(3, 3)。
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
pool2d = nn.MaxPool2d(3)
Result:tensor([[[[10.]]]])
填充和步幅可以手动设定
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d = nn.MaxPool2d((2, 3), stride=(2, 3), padding=(0, 1))
在处理多通道输入数据时,池化层在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。 这意味着池化层的输出通道数与输入通道数相同。