您现在的位置是:首页 >其他 >深度学习与过程中方法记录(第一次组会)网站首页其他
深度学习与过程中方法记录(第一次组会)
第一次学习记录
一、深度学习
1.1模型介绍:
a.线性回归
解释:回归问题可以解决一些“有多少”的问题,线性回归利用输入特征和权重的线性组合来进行预测输出,类似于把预测值落在一条线性函数的附近,例如给定一个房子的特征,预测价格。
公式: W @ X + b
Pytorch实现方法: net = nn.Sequential(nn.Linear(2,1))
b.Softmax回归(分类)
解释: softmax回归可以解决分类问题,softmax函数可以返回一个0-1范围的数,可以将这个返回的值当作为一种类别的概率,softmax函数进行概率归一化,最终得到每个类别的概率分布,从而完成分类的判断。
公式:分子为对输入X做e的指数幂,分母为X指数幂的和。
Pytorch实现方法: nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
c.多层感知机
解释:多层感知机由多个全连接层构成,每个全连接层由多个神经元组成,其中每个神经元都有一个权重和一个偏置项,通过对输入特征进行线性组合并经过激活函数(例如ReLU、sigmoid或tanh等)进行激活,从而得到输出。多层感知机的深度来自于它具有多个隐藏层,这些隐藏层可以通过非线性变换学习到更高层次的特征表示,从而提高模型的表达能力。
Pytorch实现方法: nn.Sequential(nn.Flatten(), nn.Linear(784,256), nn.ReLU(), nn.Linear(256,10))
1.2损失函数介绍
目的是通过损失函数计算出神经网络的概率模型和理想的概率模型之间的差距。通过反向传播算法,神经网络可以根据损失函数的导数来更新参数,使得模型的预测结果更加准确。
a.平方范数
平方范数作为损失函数,经常应用于线性回归模型中。可以度量预测值和真实值之间的差距,将该差距最小化,从而得到最优的模型。平方范数损失函数也可以用于带有L2正则化的线性回归模型,以平衡模型的拟合能力和泛化能力。
公式: (y_hat - y.reshape(y_hat.shape)) ** 2 / 2
Pytorch方法: nn.MSELoss() :定义损失函数MSELoss类也就是平方范数
b.交叉熵
交叉熵经常用在分类问题中,交叉熵可以测量模型预测的概率分布与真实概率分布之间的差距。经常与softmax函数结合使用,因为softmax可以将神经网络输出转换为概率分布。
公式:-torch.log(y_hat[range(len(y_hat)),y])
Pytorch方法:nn.CrossEntropyLoss(reduction=‘none’)
1.3激活函数
加入激活函数的目的是为神经网络加入了非线性特性,从而使得神经网络可以更好地拟合非线性函数。
a.ReLU函数
公式:ReLU(x) = max(x,0)
含义:保留所有正数,负数设为0。
b.sigmoid函数
公式:sigmoid(x) = 1/(1+exp(-x))
含义:可以将输入变换为 (0,1) 上的输出,也称为挤压函数。
c.tanh 函数(双曲正切)
公式:tanh(x) = ( exp(x) - exp(-x) ) / ( exp(x) + exp(-x) ) 双曲正切
含义: 将输入压缩到(-1,1)上。
二、方法记录
-
detach() 是从计算图中分离下来的,但是仍然指向原变量的存放位置,它的grad_fn=None,requires_grad=False,得到的这个tensor永远不需要计算其梯度,不具有梯度grad。即使之后重新将它。requires_grad设置为true,它也不会再具有梯度grad。
-
x.grad.zero_() 清理梯度信息,pytorch会累计梯度。
-
a.norm() 求范数,就是求长度,即使是一个高维度的例如二维,三位,也是把每个元素的平方和加起来开平方求范数
-
torch.randn(size=(10,), requires_grad=True) 创建一个(size的维度理解成数组)(size的数为每个维度的数量)随机张量。
-
normal(mean, std, *, generator=None, out=None) 使用格式:torch.normal(mean=0.,std=1.,size=(2,2))
解释: 该函数从单独的正态分布中提取随机数的张量进行返回其中mean为均值,std为标准差,size传入张量的形状 -
torch.matmul() 使用格式:torch.matmul(X, w)
解释:传入两个张量进行乘法运算,假如两个一维度进行乘法则结果为标量。假如存在一个二维进行运算,则一维度补充一个维度,进行矩阵运算! -
nn.Linear(2,1) 指定输入维度2和输出维度1的线性层
-
nn.Sequential(nn.Linear(2,1)) Sequential理解为一个容器,用来保存层
-
net[0].weight.data.normal_(0, 0.01)
-
net[0].bias.data.fill_(0) net[0]访问到Linear,weight访问到w。net[0].bias访问到偏差,通过data点方法设置偏差b为0
-
nn.MSELoss() 定义损失函数(MSELoss类也就是平方范数)
-
torch.optim.SGD(net.parameters(), lr=0.03) net.parameters() 包括了所有参数,包括w和b 设置lr为学习率。 SGD为梯度下降算法。
-
d2l.use_svg_display() 使用svg来显示图片,这样清晰度高一些。
-
zip()方法 把传入的若干列表,对应位置封装为一个元组,返回包含若干元组的对象。
-
zip(*)方法 zip()正好相反,将封装为包含若干元组的对象,对应位置返回为一个列表,包含若干列表的二维列表,通过解构的方式可以拿到若干列表。
-
torch.is_tensor(obj) 判断obj是不是张量类型,是就返回True。
-
torch.exp(x) 对输入X做e的指数幂,X可以是张量、标量、变量。
-
torch.argmax(X,dim=?) 返回张量X最大值的下标,dim=0向下找,dim=1向右找。维度高了,类似降维理解。
y.dtype 获取张量的类型。 -
A.numel() 求张量的元素数
-
A.sum(axis=0, keepdims=True) # 按列求和, 向右,keepdims=True表示列的维度不变。就是一个包含了好多列表,每个列表为一列和的列表。
-
A.sum(axis=1, keepdims=True) # 按行求和, 行的维度不变,keepdims默认为False也就是降维度求和,二维会降为一维度。
-
A.cumsum(axis=0) 不会降维度的加和,该函数会按行列计算,第i行/列前的数据和。
-
torch.norm(A) 张量A的范数。
-
nn.Flatten() 将任何维度的tensor改为一个2d的tensor。
-
torch.ones_like(x) X为一个张量,该方法和生成一个全为1的形状和张量X相同的张量
-
y.backward(torch.ones_like(x), retain_graph=True) retain_graph参数:pytorch进行一次backward之后,各个节点的值会清除
这样进行第二次backward会报错,因为虽然计算节点数值保存了,但是计算
图结构被释放了,如果加上retain_graph==True后,可以再来一次backward。 -
power(x, y) 计算 x 的 y 次方。
解释: x=2,y=[1,2,3]时为 [2,4,8]
x=[2,3,4],y=2时为 [4,9,4]
x=[2,3,4], y=[1,2,2] 时为 [2,9,16] (对应位置做xi的yi次方) -
list1[a:b,c:d] 表示取list1的[a,b)行,list1的[c,d)列范围的数据。
-
math.gamma(x) 返回 x 处的伽玛函数(Gamma 函数)。
-
np.dot() 做矩阵乘法。
-
nn.Sequential() 按照上边的说法,与一层一层的单独调用模块组成序列相比,nn.Sequential() 可以允许将整个容器视为单个模块(即相当于把多个模块封装成一个模块),forward()方法接收输入之后,nn.Sequential()按照内部模块的顺序自动依次计算并输出结果。这就意味着我们可以利用nn.Sequential() 自定义自己的网络层。
-
d2l.synthetic_data(true_w, true_b, n_train) 根据设定的w,b以及参数个数,生成训练数据集合。
-
d2l.load_array(train_data, batch_size) 根据数据集生成迭代数据。
-
lambda表达式:
格式: lambda: 参数 : 返回值 就像一个匿名函数。 -
d2l.squared_loss 拿到平方损失函数。
-
d2l.linreg(X,w,b) 拿到线性回归函数,return nn.dot(X,w)+b。
-
d2l.evaluate_loss(net, test_iter, loss) 评估给定数据集上模型的损失。
-
os.makedirs(cache_dir, exist_ok=True): 可以递归的创建目录结构。
-
os.path.join()函数用于路径拼接文件路径,可以传入多个路径。正常理解,当文件路径有时,从右向左,遇到的第一个开始拼接,左侧的都舍去。
-
os.path.exists(fname):是判断括号里的文件是否存在的意思,括号内的可以是文件路径。
-
hashlib.sha1() : sha1加密。
-
hashlib.sha1().update(data): 对data进行加密。
-
hashlib.sha1().hexdigest():返回加密sha1加密后的值。
-
os.path.dirname(fname): 返回该文件所在目录的路径。
-
os.path.splitext(fname): 分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作。
-
zipfile.ZipFile(fname, ‘r’): 打开zip文件。
-
tarfile.open(fname, ‘r’): 打开tar或者gz文件
-
fp.extractall(base_dir): 解压文件。
-
pd.read_csv(download(‘kaggle_house_train’)): 加载csv文件。(详解:https://blog.csdn.net/weixin_47139649/article/details/126744842)
-
fillna():会填充nan数据,并返回填充后的结果。
-
pd.get_dummies(all_features, dummy_na=True): 给all_features中的离散值建立独热编码,dummy_na=True: 表示把NAN当作一个特征也建立独热编码。
-
torch.clamp(input, min, max, out=None) → Tensor函数的功能将输入input张量每个元素的值压缩到区间 [min,max],并返回结果到一个新张量。
-
torch.log是以自然数e为底的对数函数。
-
slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。
-
torch.cat是将两个张量(tensor)拼接在一起。
三、几个概念理解
在学习过程中,遇到一些概念。并不知道具体的意思以及为什么要这么做,通过在b站搜索以及查阅资料,对如下概念有了一个自己的理解。
3.1 损失函数
目的是通过损失函数计算出神经网络的概率模型和理想的概率模型之间的差距。
a.最小二乘法
b.极大似然法
c.交叉熵法
3.2 理解梯度下降,为什么是反向传播?
有了损失函数后,知道神经网络模型和理想模型的差距后,就要有缩短差距的方法,也就是要调整神经网络里的参数(w,b),其中梯度下降作为反向传播的一种方法。我的理解是,通过初试的参数权重w还有特征以及偏移b,求出预测值与理想值做差,理解成一个函数,对这个函数求梯度(*),也就是求一个变化最快的方向,然后根据梯度和手动设置的学习率更新权重w和偏移b,经过中间的隐藏层,直到输入的特征这一层,优化出一个最优的W权值和B偏移。
梯度: 某一函数在该点处的方向导数沿着该方向取得最大值,也就是函数在该点沿着该方向变化最快,变化率最大。
方向导数:函数在定义域内的某点对某个方向求导得到的导数。
3.3 梯度爆炸与梯度消失?
2.3.1 解释 Xavier初始化方法,缓解梯度消失或者爆炸。
3.4 过拟合和欠拟合
过拟合:指的是模型在训练集上表现很好,但在测试集上表现较差的情况,通常是由于模型过于复杂或者训练数据过少等原因导致。在过拟合的情况下,模型过于关注训练数据的细节和噪声,使得模型在新的数据上表现不佳。解决过拟合的方法包括增加训练数据、减少模型复杂度、使用正则化技术等。
解决方法1: 可以通过权限衰退的方式缓解过拟合,因为我们经常使用优化算法更新神经网络的梯度,有坏算法会根据当前的梯度方向对权重进行更新。可以在权重衰退这里加一个额外的惩罚项,使得权重衰退的慢点。避免过拟合的发生。
解决方法2: dropout在训练神经网络时,Dropout会随机地将神经元的输出设置为0,从而使得该神经元在训练期间不参与前向传播和反向传播,相当于从模型中删除了该神经元.这个过程相当于在训练过程中随机的丢弃一些神经元的贡献,这样可以使得模型在测试集上的表现更加鲁棒,降低过拟合的风险。具体来说,Dropout会对每一个神经元,以一定的概率p进行保留,而1-p的概率则将其置为0。这个概率p是一个可调节的超参数,通常设置在0.1到0.5之间。在实际使用中,Dropout通常被应用在全连接层或卷积层之后,但不应该应用在池化层之后,因为池化层没有权重需要正则化。
欠拟合:指的是模型无法很好地拟合训练数据的情况,通常是由于模型过于简单或者训练数据过少等原因导致。在欠拟合的情况下,模型无法捕捉到数据的特征,导致模型无法很好地进行预测。解决欠拟合的方法包括增加模型复杂度、增加训练数据等。