深度学习笔记006SoftmaxRegression Softmax回归的实现
1 # ''' 2 # 回归与分类: 3 # 回归:单连续值输出;自然区间R;跟真实值的区别作为损失; 4 # 分类:通常是多个输出;输出i是预测为第i类的置信度 5 # 6 # Softmax特点:非负,和为1 7 # 8 # 交叉熵损失: H(p,q)= 求和i{-piLog(qi)} 9 # 在多分类问题中,交叉熵损失即为: -logy_haty 10 # 11 # 三个常用的损失函数: 12 # L2 Loss: l=(y-y_hat)²/2 预测值与真实值相隔较远,梯度大,参数更新多;相隔越近,梯度越小,渐渐地参数更新就少了。 13 # L1 Loss: l=|y-y_hat| 预测值与真实值相隔多远,梯度永远是常数,权重更新不会特别大(稳定性很高),但是零点处不可导,且有一个-1到+1的变化,优化末期容易不稳定。 14 # HUber's RobustLoss: 15 # l=|y=y'|-1/2 if|y-y'|>1 16 # l=(y-y')²/2 otherwise 17 # 预测值与真实值相差较远,梯度固定;想差较近,梯度会越来越小,保证优化比较平滑 18 # 19 # ''' 20 # 21 # # Softmax从0实现 22 # import torch 23 # from IPython import display 24 # from d2l import torch as d2l 25 # 26 # batch_size=256 27 # train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size) 28 # 29 # num_inputs=784 #输入的是个3D的向量(长宽通道数),把它拉成一个平的向量,28*28=784 30 # num_outputs=10 #输出是个10维的向量,因为输出只有10个类别 31 # 32 # W=torch.normal(0,0.01,size=(num_inputs,num_outputs),requires_grad=True) 33 # b=torch.zeros(num_outputs,requires_grad=True) 34 # 35 # def softmax(X): 36 # X_exp=torch.exp(X) 37 # partition=X_exp.sum(1,keepdim=True) 38 # return X_exp/partition 39 # 40 # # 测试一下 41 # X=torch.normal(0,1,(2,5)) 42 # print(X) 43 # X=softmax(X) 44 # print(X) 45 # print(X.sum(1)) 46 # print(X.sum(0)) 47 # 48 # # 最终的Softmax函数 49 # def net(X): 50 # return softmax(torch.matmul(X.reshape((-1,W.shape[0])),W)+b) #-1代表批量维度,W的shape即压缩后的一维图片,最后就是一个batch_Size(256) x 784的矩阵 51 # 52 # # 交叉熵损失函数 53 # def cross_entropy(y_hat,y): 54 # return -torch.log(y_hat[range(len(y_hat)),y]) 55 # 56 # def accuracy(y_hat,y): 57 # if len(y_hat.shape>1) and len(y_hat.shape[1])>1: #二维矩阵 & 列数大于1 58 # y_hat=y_hat.argmax(axis=1) #把每一行元素最大的放进来(概率最高) 59 # cmp=y_hat.type(y.dtype)==y #将比较结果T和F存入cmp 60 # return float(cmp.type(y.dtype).sum()) #将cmp里的bool转回int,然后求和(1即为true),与总数做除法就是True的概率 61 # 62 63 # __________________________________________________________________________________________________________- 64 # Softmax简洁实现 65 import torch 66 from torch import nn 67 from d2l import torch as d2l 68 batch_size=256 69 train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size) 70 71 net=nn.Sequential(nn.Flatten(),nn.Linear(784,10)) 72 # Flatten展平层,因为pytorch不会隐式地调整输入的形状,所以需要定义一个展平层在线性层前调整网络形状 73 74 def init_weights(m): 75 if type(m)==nn.Linear: 76 nn.init.normal_(m.weight,std=0.01)#均值为0,方差为1 77 net.apply(init_weights) 78 79 loss = nn.CrossEntropyLoss() 80 81 trainer=torch.optim.SGD(net.parameters(),lr=0.1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~