【pyTorch基础】softmax

import torch
from torch import nn
# 自定义数据集

# 确定随机数种子
torch.manual_seed(7)
# 产生7张2*2的图片
x = torch.rand((7, 2, 2))
# 标签为0,1,2
y = torch.randint(0, 3, (7,))
print(x)
print(y)
tensor([[[0.5349, 0.1988],
         [0.6592, 0.6569]],

        [[0.2328, 0.4251],
         [0.2071, 0.6297]],

        [[0.3653, 0.8513],
         [0.8549, 0.5509]],

        [[0.2868, 0.2063],
         [0.4451, 0.3593]],

        [[0.7204, 0.0731],
         [0.9699, 0.1078]],

        [[0.8829, 0.4132],
         [0.7572, 0.6948]],

        [[0.5209, 0.5932],
         [0.8797, 0.6286]]])
tensor([0, 2, 0, 1, 0, 1, 1])
# 自定义一个模型,继承父类nn.Module的所有属性和方法
class LinearNet(nn.Module):
    def __init__(self):
        # 用父类的初始化方法来初始化父类,相当于把父类的init内容搬过来并用父类的方法来初始化属于父类的部分
        super(LinearNet, self).__init__()
        # 定义一层全连接层
        self.dense = nn.Linear(4, 3) # 四个输入三个输出
        # 定义softmax
        self.softmax = nn.Softmax(dim = 1)
       
        
    def forward(self, x):
        # view: 相当于resize ,-1相当于估算,比如原(7,2,2) = 28,view(-1,4)因为定了一个4,这个-1被自动定为28/4 = 7
        y = self.dense(x.view(-1,4)) # 因为是4个输入,所以列为4,总共7个样本(转化为2维)
        y = self.softmax(y)
        return y
net = LinearNet() 
# 定义损失函数为交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 定义优化函数(优化的是模型的参数,所以传入参数,lr为学习率)
# torch.nn 会自动初始化参数,所以这里没有设置初始化的参数
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)  # 随机梯度下降法
y_hat = net(x)
print(y_hat)
# 7个样本,输出到输出层的3个,各个softmax后的值
tensor([[0.4235, 0.4221, 0.1544],
        [0.3856, 0.4015, 0.2129],
        [0.3261, 0.4576, 0.2163],
        [0.4156, 0.3965, 0.1878],
        [0.4704, 0.3792, 0.1505],
        [0.4407, 0.3966, 0.1627],
        [0.3677, 0.4519, 0.1804]], grad_fn=<SoftmaxBackward0>)
# 训练
for epoch in range(70):
    train_loss = 0.0 # 每一轮的损失值
    y_hat = net(x) # 预测值
    l = loss(y_hat, y) # loss(预测值, target)
    # 为防止残留梯度值,先清零梯度
    optimizer.zero_grad()
    # 对损失函数求梯度,求出沿各属性下降最快的方向
    l.sum().backward()
    # 更新权重
    optimizer.step()
    # 显示前五轮损失
    train_loss += l
    if epoch >= 5:
        continue
    print('epoch %d, loss %.4f' % (epoch + 1, train_loss))
epoch 1, loss 1.0086
epoch 2, loss 1.0086
epoch 3, loss 1.0085
epoch 4, loss 1.0085
epoch 5, loss 1.0084
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值