基于softmax回归的图像分类二

欢迎关注

利用Pytorch框架实现softmax回归的图像分类

1.导入基础包

import torch
from torch import nn
from torch.nn import init
import torchvision
import torchvision.transforms as transforms
import numpy as np
import sys
# sys.path.append('..')
# import d21zh_pytorch as d21

2.获取读取数据

def load_data_fashion_mnist(batch_size):
    if sys.platform.startswith('win'):
        num_workers=2#0表示不用额外进程来加速读取数据
    else:
        num_workers=4
    mnist_train=torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=True,download=True,
                                  transform=transforms.ToTensor())
    mnist_test=torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=False,download=True,
                                  transform=transforms.ToTensor())
    train_iter=torch.utils.data.DataLoader(mnist_train,batch_size=batch_size,shuffle=True,
                                       num_workers=num_workers)
    test_iter=torch.utils.data.DataLoader(mnist_test,batch_size=batch_size,shuffle=False,
                                       num_workers=num_workers)
    return train_iter,test_iter
batch_size=256
train_iter,test_iter=load_data_fashion_mnist(batch_size)

3.定义和初始化模型

softmax回归的输出层是一个全连接层,所以用一个线性模块就可以了。每个batch样本x的形状为(batch_size,1,28,28),所以我们要先用view()将x的形状转换成(batch_size,784)才送入全连接层

num_inputs=784
num_outputs=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.shape=[batch_size,1,28,28]
        print(x.shape)
        print(x.shape[0])#x.shape[0]获取x的第一个元素
        y=self.linear(x.view(x.shape[0],-1))
        print(y.shape)
        return y

net=LinearNet(num_inputs,num_outputs)#定义线性模型,784个输入,10个输出
#将x的形状进行变换
class FlattenLayer(nn.Module):
    def __init__(self):
        super(FlattenLayer,self).__init__()
    def forward(self,x):
        return x.view(x.shape[0],-1) 
    

# print(net)
# for x,y in train_iter:
#     net.forward(x)
from collections import OrderedDict
net=nn.Sequential(
                OrderedDict([
                    ('flatten',FlattenLayer()),
                    ('linear',nn.Linear(num_inputs,num_outputs))
                    ])
                )
# print(net[1])
# print(net.linear)
# print(net.flatten)
# for param in net.parameters():
#     print(param.shape)

Python字典使用方法包括OrderedDict

使用均值为0、标准差为0.01的正态分布随机初始化模型的权重参数

init.normal_(net.linear.weight,mean=0,std=0.01)
init.constant_(net.linear.bias,val=0)

4.softmax和交叉熵损失函数

#该函数同时包括softmax运算和交叉熵损失计算
loss=nn.CrossEntropyLoss()

5.定义优化算法

# for param in net.parameters():
#     print(param.shape)
optimizer=torch.optim.SGD(net.parameters(),lr=0.1)

6.训练模型

num_epochs=5
def evaluate_accuracy(data_iter,net):
    acc_sum,n=0.0,0
    for x,y in data_iter:
#         print('net(x): ',net(x).shape,'结束')#256行10列
        acc_sum+=(net(x).argmax(dim=1)==y).float().sum().item()#.sum()不是.mean(),这是统计正确的个数,与上面不同
#         print('acc_sum: ',acc_sum)
#         print('y.shape[0]:',y.shape[0])#:y.shape[0]=256
        n+=y.shape[0]
    return acc_sum/n
# print(evaluate_accuracy(test_iter,net))

def train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params=None,lr=None,optimizer=None):
    for epoch in range(num_epochs):
        train_1_sum,train_acc_sum,n=0.0,0.0,0
        for x,y in train_iter:
#             print(x.shape)#torch.Size([256, 1, 28, 28])
            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_1_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_1_sum/n,train_acc_sum/n,test_acc))
train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,None,None,optimizer)

运行结果:

epoch 1 loss  0.0031 train_acc 0.750 test_acc 0.774 
epoch 2 loss  0.0022 train_acc 0.815 test_acc 0.797 
epoch 3 loss  0.0021 train_acc 0.824 test_acc 0.818 
epoch 4 loss  0.0020 train_acc 0.833 test_acc 0.816 
epoch 5 loss  0.0019 train_acc 0.836 test_acc 0.821 

7.预测

def get_fashion_mnist_labels(labels):
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress',
                                'coat','sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[i] for i in labels]

#图片设置
def use_svg_display():
    """用矢量图显示svg"""
#在一行里面画出多张图像和对应标签的函数
def show_fashion_mnist(images,labels):
    use_svg_display()
    #'_'表示我们忽略,不使用的变量
    _,figs=plt.subplots(1,len(images),figsize=(25,25))#
    for f,img,lbl in zip(figs,images,labels):
        f.imshow(img.view((28,28)).numpy())
        f.set_title(lbl,color='white')
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)
    plt.show()
    
x,y=iter(test_iter).next()
true_labels=get_fashion_mnist_labels(y.numpy())
pred_labels=get_fashion_mnist_labels(net(x).argmax(dim=1).numpy())
titles=[true+'\n'+pred for true,pred in zip(true_labels,pred_labels)]
show_fashion_mnist(x[0:9],titles[0:9])

运行结果:

预测结果

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: softmax回归和logistic回归都是常见的分类算法。 其中,logistic回归是一种分类算法,用于将输入数据分为两个类别。它通过sigmoid函数将输入数据映射到和1之间的概率值,然后根据阈值将其分类为正类或负类。 而softmax回归是一种多分类算法,用于将输入数据分为多个类别。它通过softmax函数将输入数据映射到每个类别的概率值,然后将概率最大的类别作为分类结果。 两种算法都是基于概率模型的分类方法,但softmax回归适用于多分类问题,而logistic回归适用于分类问题。 ### 回答2: softmax回归和logistic回归都是分类算法,它们都属于广义线性模型的范畴,但softmax回归是logistic回归的一种扩展。 Logistic回归是基于逻辑斯蒂函数的分类算法,该函数能够将输入的连续值通过sigmoid函数映射到0-1的概率值,因此logistic回归适用于分类问题。由于sigmoid函数的取值范围是0-1,它可以被理解为是将输入“压缩”到了可接受的范围内,并且逻辑斯蒂函数求导简单。因此,logistic回归机器学习中广泛应用于分类问题。 而softmax回归是logistic回归的多类别版本,也称为多项式逻辑斯蒂回归。在softmax回归中,将输入的样本特征通过softmax函数进行变换得到0-1之间的概率值,这些概率值加和为1。因此,softmax回归适用于多分类问题。 softmax回归相对于logistic回归的优越之处在于,对于多分类问题,softmax回归可以更好地处理标签互斥的问题,可以将多个分类问题转化为单个多分类问题。在神经网络中,softmax回归常常用于输出层的分类问题。 在实际应用中,softmax回归和logistic回归可以被当做常规分类算法中的基础理论。它们不仅仅被用于机器学习领域,还被广泛地用于自然语言处理、推荐系统、图像分类等领域。 ### 回答3: softmax回归和logistic回归都是用于分类问题的监督学习算法。两者基于的核心思想都是使用线性模型进行分类,然后通过激活函数将输出映射到概率空间,最终输出对类别的预测概率。下面将分别介绍两种方法。 1. Logistic回归 Logistic回归又叫逻辑回归,它是一种用于分类问题的线性模型。在logistic回归中,使用sigmoid函数作为激活函数将线性模型的输出转换成一个0到1之间的概率值。sigmoid函数为: $$sigmoid(z)=\frac{1}{1+e^{-z}}$$ 其中,$z=w^Tx+b$,$w$和$b$分别为模型参数,$x$为输入。logistic回归的目标是最大化似然函数,即使得预测的概率与实际标签之间的差异最小。损失函数为: $$J(w,b)=\frac{1}{m}\sum_{i=1}^{m}[-y^{(i)}log(\hat{y}^{(i)})-(1-y^{(i)})log(1-\hat{y}^{(i)})]$$ 其中,$m$为数据集大小,$y^{(i)}$为实际的类别标签,$\hat{y}^{(i)}$为预测的类别概率。 2. Softmax回归 Softmax回归又叫多分类逻辑回归,用于多分类问题。softmax回归将线性模型的输出$z$映射到$K$个类别的概率,并且不同类别间的概率是互斥的。softmax函数为: $$softmax(z_i)=\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}$$ 其中,$K$为类别数,$z_i=w_i^Tx+b_i$,$w_i$和$b_i$分别为第$i$类别的模型参数。softmax回归的目标是最大化似然函数,损失函数为: $$J(w_{1...K},b_{1...K})=-\frac{1}{m}\sum_{i=1}^{m}\sum_{j=1}^{K}1(y^{(i)}=j)log\frac{e^{w_j^Tx^{(i)}+b_j}}{\sum_{k=1}^{K}e^{w_k^Tx^{(i)}+b_k}}$$ 其中,$m$为数据集大小,$y^{(i)}$为样本$i$的类别标签。 总之,softmax回归和logistic回归都是监督学习算法,利用线性模型加激活函数将输入映射到概率空间中进行分类预测。softmax回归适用于多分类问题,而logistic回归适用于分类问题。在实际应用中,两种方法都是常见的分类算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值