Datawhale组队学习打卡营 任务2:softmax和分类模型
2020-03-05 19:45
429 查看
模型
损失函数:交叉熵
模型评估:使用准确率accuracy(预测正确的样本数/总的样本数)
使用pytorch来实现softmax
使用的数据集# *****加载各种包或者模块***** import torch from torch import nn from torch.nn import init from collections import OrderedDict import numpy as np import sys import d2lzh1981 as d2l # Datawhale团队提供的包 # *****初始化参数和获取数据***** batch_size = 256 # 设置batch的大小 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) # 获取数据 # *****定义网络模型***** num_inputs = 784 # 将28*28 的二维图片降为784的以为特征 num_outputs = 10 # 10个输出,10分类 # 网络的类,和线性回归类似 class LinearNet(nn.Module): def __init__(self, num_inputs, num_outputs): super(LinearNet, self).__init__() self.linear = nn.Linear(num_inputs, num_outputs) def forward(self, x): # x 的形状: (batch, 1, 28, 28) y = self.linear(x.view(x.shape[0], -1)) return y # 用来特征转换的类 class FlattenLayer(nn.Module): def __init__(self): super(FlattenLayer, self).__init__() def forward(self, x): # x 的形状: (batch, *, *, ...) return x.view(x.shape[0], -1) net = nn.Sequential( # 方式一,第一种比较好理解,方便一点 FlattenLayer(), LinearNet(num_inputs, num_outputs) # 方式二 #OrderedDict([ # ('flatten', FlattenLayer()), # ('linear', nn.Linear(num_inputs, num_outputs))]) # 或者写成我们自己定义的 LinearNet(num_inputs, num_outputs) 也可以 ) # *****初始化模型参数***** init.normal_(net.linear.weight, mean=0, std=0.01) init.constant_(net.linear.bias, val=0) # *****定义损失函数***** loss = nn.CrossEntropyLoss() # 下面是他的函数原型 # class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean') # *****定义优化函数***** optimizer = torch.optim.SGD(net.parameters(), lr=0.1) # 下面是函数原型 # class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False) # *****训练***** # 预测准确率函数 def evaluate_accuracy(data_iter, net, device=None): if device is None and isinstance(net, torch.nn.Module): # 如果没指定device就使用net的device device = list(net.parameters())[0].device acc_sum, n = 0.0, 0 with torch.no_grad(): for X, y in data_iter: if isinstance(net, torch.nn.Module): net.eval() # 评估模式, 这会关闭dropout acc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item() net.train() # 改回训练模式 else: # 自定义的模型, 3.13节之后不会用到, 不考虑GPU if ('is_training' in net.__code__.co_varnames): # 如果有is_training这个参数 # 将is_training设置成False acc_sum += (net(X, is_training=False).argmax(dim=1) == y).float().sum().item() else: acc_sum += (net(X).argmax(dim=1) == y).float().sum().item() n += y.shape[0] return acc_sum / n # 训练函数 def train_fun(net, train_iter, test_iter, loss, num_epochs, batch_size, params=None, lr=None, optimizer=None): for epoch in range(num_epochs): train_l_sum, train_acc_sum, n = 0.0, 0.0, 0 for X, y in train_iter: y_hat = net(X) l = loss(y_hat, y).sum() # 梯度清零 if optimizer is not None: optimizer.zero_grad() elif params is not None and params[0].grad is not None: for param in params: param.grad.data.zero_() l.backward() if optimizer is None: sgd(params, lr, batch_size) else: optimizer.step() # “softmax回归的简洁实现”一节将用到 train_l_sum += l.item() train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item() n += y.shape[0] test_acc = evaluate_accuracy(test_iter, net) print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f' % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc)) num_epochs = 5 train_fun(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 《动手学深度学习》组队学习打卡Task1——softmax和分类模型
- TensorFlow学习Day3读取csv文件,动手写个logistic,softmax分类模型
- Task1.0 学习笔记线性回归;Softmax与分类模型、多层感知机
- 《动手学习深度学习》之一:线性回归、softmax与分类模型、多层感知机-伯禹课程-打卡1
- 动手学深度学习-线性回归;Softmax与分类模型;多层感知机
- ElitesAI·动手学深度学习PyTorch版学习笔记-线性回归;Softmax与分类模型、多层感知机
- 动手学深度学习 线性回归-Softmax与分类模型-多层感知机
- Datawhale 组对学习打卡营 任务11: 注意力机制和Seq2seq模型
- TensorFlow学习笔记:构建多分类任务模型(未完)
- Softmax与分类模型学习笔记
- 深度学习d1:线性回归、Softmax与分类模型、多层感知机
- 动手学深度学习PyTorch版---Task01:线性回归;Softmax与分类模型、多层感知机
- Datawhale组队学习打卡营 任务7:过拟合欠拟合及其解决方案
- Datawhale 组队学习打卡营 任务22:图像分类案例2
- pytorch学习——Softmax与分类模型
- tensorflow学习-示例1(MNIST数据集合上的softmax分类模型)
- Datawhale 组队学习打卡营 任务21:图像分类案例1
- Datawhale 组队学习打卡营 任务5:语言模型
- 深度学习之图像分类模型AlexNet各层解读
- 深度学习在图像分类等任务中的发展