2022-1-3至2022-1-8周报

2022-1-3至2022-1-8周报,第1张

2022-1-3至2022-1-8周报

文章目录

工程项目深度学习

Softmax回归的从零开始实现Softmax回归利用框架实现 带毕设

工程项目
    大数据环境

配置VMnet8、Vmware Workstation Net网络地址转换的IP和网关、配置三台虚拟机的静态IP。开启并测试环境。
2. 数据分析平台

安装SQL Server+Vistual studio,将前后端代码与数据库迁移,并调试。

深度学习 Softmax回归的从零开始实现

softmax是所有深度学习多分类问题的模型的最后一层,将上一层传递下来的结果处理成对应分类的概率。

import torch
from IPython import display
from d2l import torch as d2l

batch_size = 256 #每一个批量为256张图片
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
# 训练集和测试集的迭代器,每次返回一个批量大小的数据

softmax的输入是向量,因此需要将图片拉成向量。同时会损失掉很多空间信息。
W初始为高斯随机分布。

num_inputs = 784 # 28*28
num_output = 10 # 类别数为10

W = torch.normal(0, 0.01, size=(num_input, num_output), requires_grad=True) 
b = torch.zeros(num_outputs, requires_grad=True) # 都需要计算梯度

定义softmax函数,但是矩阵中非常大或非常小的元素可能造成数值上溢或下溢,我们没有采取措施来防止这点。softmax函数使得有正有负的上一层传递过来的结果变成概率的正值,并且每行相加和为1

def softmax(X):
    X_exp = torch.exp(X) # 每个元素做指数计算
    partition = X_exp.sum(1, keepdim=True) # 每一行求和
    return X_exp / partition # 这里应用了广播机制

实现softmax回归模型,下面的代码定义了输入如何通过网络映射到输出。

def net(X)
    return softmax(torch.matmul(X.reshape((-1, W.shape[0])), w) + b)

在数据传递到我们的模型之前,我们使用reshape函数将每张原始图像展平为向量。其中,torch.matmul 为矩阵点乘,-1代表batchsize的大小,即256。W.shape[0]为784。先将矩阵X展平成256*784维的向量,再与参数w点乘。

实现交叉熵损失函数。range()函数创建一个整数列表,返回一个可迭代对象。首先理解y_hat[[0, 1], y],其中**[]中代表样本编号**,整个函数将样本对应真实标签的预测值拿出来。
其次,定义cross_entropy,对于给定的y_hat预测和真实标号y,range生成的从0到y_hat的向量,取每个样本对应的真实标号的预测值,再取对数的相反数。

def cross_entropy(y_hat, y):
    return - torch.log(y_hat[range(len(y_hat)), y])

cross_entropy(y_hat, y)

计算准确率,判断预测类别和真实类别是否一致:预测正确的样本数/总样本数

def accuracy(y_hat, y):
    if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
        y_hat = y_hat.argmax(axis=1)
    cmp = y_hat.type(y.dtype) == y #将y_hat的类型转成y的类型,再作比较,转成一个布尔类型的张量
    return float(cmp.type(y.dtype).sum())

accuracy(y_hat, y) / len(y)

定义Softmax回归的训练:

def train_epoch_ch3(net, train_iter, loss, updater):
    if isinstance(net, torch.nn.Model):
        net.train() # train模式指前向+后向,告诉Pytorch计算梯度
    metric = Accumulator(3)
    for X, y in train_iter:
        y_hat = net(X)
        l = loss(y_hat, y)
        # 如果updater是一个Optimizer
        if isinstance(updater, torch.optim.Optimizer):
            updater.zero_grad()
            l.backward()
            updater.step()
            metric.add(
                float(l) * len(y), accuracy(y_hat, y), y.size().numel())
        # 如果是手动实现,则l是一个向量
        else:
            l.sum().backward()
            updater(X.shape[0])
            metric.add(float(l.sum()), accuracy(y_hat, y), y_numel())
    return metric[0] / metric[2], metric[1] / metric[2] # 错误率与正确率

调用:

def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):
    # 扫num_epochs遍数据
    for epoch in range(num_epochs):
        train_metrics = train_epoch_ch3(net, train_iter, loss, updater)
        test_acc = evaluate_accuracy(net, test_iter)                                                                                

最后,实现小批量随机梯度下降来优化模型的损失函数。

lr = 0.1
num_epochs = 10

def updater(batch_size):
    return d2l.sgd([w, b], lr, batch_size)
    
train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)
Softmax回归利用框架实现

第一步,将数据导入,构造数据迭代器。

import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

第二步,softmax回归的输出层是一个全连接层,而Pytorch不会隐式地调整输入的形状,所以定义了展平层在线性层前调整网络输入的形状。

net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10)

def init_weights(m): 
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);

第三步,没有将softmax概率传递到损失函数中,而是传递未归一化的预测,并同时计算softmax及其对数。

loss = nn.CrossEntropyLoss()

第四步,小批量随机梯度下降作为优化算法。

trainer = torch.optim.SGD(net.parameters(), lr=0.1)

第五步,调用训练函数。

num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
带毕设
    修改、批注开题报告将代码和Anaconda3等动手学深度学习的环境安装好分享前后端实践视频课程,解释前后端如何逻辑地连通搜集Python训练的模型如何进行线上调用分享克里金学习资料

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存