深度学习笔记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)
复制代码

 

posted @   爱和九九  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示