softmax线性神经网络


1.数学原理:

a.线性模型

b.softmax模型

softmax模型应用于多个输出要分类的时候,比如我一个神经网络计算出来N个y值,这个时候就需要把他们归一化然后讲数值转换为概率,概率最大的那个就是分类得出的那个,那么这个函数要满足映射的y值不能小于0。softmax的原理式子如下:

Pi=exp(y(i))exp(y(j))P_i=\frac{exp(y_{(i)})}{\sum{exp(y_{(j)})}}

c.熵(entropy)和loss函数:

​ 信息量地大小与信息发生地概率乘反比,信息地概率总是发生在010-1之间,那么用于判定信息量地大小可以由下式进行表示:

l(x)=In(P(x))l(x)=-In(P(x))

entroy是量化数据的信息内容地方式,例如分布P地熵可以由下面地式子得到,这个表示了信息量地期望值,如果我们期望

H[P]=P(xi)In(P(xi))H[P]=\sum{-P(x_i)In(P(x_i))}

如果有两个单独地概率分布,我们要衡量这两个概率之间地差异,可以由下面式子得到:

DKL(pq)=p(xi)log(p(xi)q(xi))=H[p]p(xi)In(q(xi))D_{KL}(p||q)=\sum{p(x_i)log(\frac{p(x_i)}{q(x_i)})} \\=-H[p]-\sum{p(x_i)In(q(x_i))}

差异越大,DklD_{kl}中概率重合地地方越少,$ D_{kl}$越大,反之越小,要想差异最小,直接最小化下面地式子即可:

H(p,q)=p(xi)In(q(xi))H(p,q)=-\sum{p(x_i)In(q(x_i))}

对于固定地训练样本和计算值来说,yiy_i为固定值,因此softmax的损失函数为:

l(y,y^)=yiIn(yi^))l(y,\hat{y})=-\sum{y_iIn(\hat{y_i}))}

2.实现步骤

3.原理实现与关键函数解析

这一章代码较为复杂,会有大量的解释与python语法

需要的包

"""从原理上实现softmax"""
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
"""transforms模块是常用的数据增强模块"""
"""常用的图像预处理模块"""
from d2l import torch as d2l
import matplotlib.pyplot as plt
import numpy
import cv2
import gc
from IPython import display
d2l.use_svg_display()

下载数据集,并且加载到内存中:

data.DataLoader函数要求输入的数据是可以迭代的,返回的数组的调用也是可迭代的。

def load_data_fashion_mnist(batch_size, resize=None,thread=4):
    """下载fashion-mnist数据集,并将其加载到内存中"""
    # 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,# 并除以255使得所有像素的数值均在0到1之间
    trans = [transforms.ToTensor()]
    """生成对象"""
    """将读进来的数据从[0,255]转到[0,1]"""
    if resize:
        """如果resize那为1"""
        trans.insert(0, transforms.Resize(resize))
    trans = transforms.Compose(trans)
    """注意,这个是加载到内存里"""

    mnist_train = torchvision.datasets.FashionMNIST(
        root="../data", train=True, transform=trans, download=True)
    """第一次需要下载的话需要download为true,第二次就不需要了,直接false"""
    mnist_test = torchvision.datasets.FashionMNIST(
        root="../data", train=False, transform=trans, download=True)

    return (
        data.DataLoader(mnist_train, batch_size, shuffle=True,
                        num_workers=thread),
        data.DataLoader(mnist_test, batch_size, shuffle=True,
                        num_workers=thread)
    )

softmax的实现

def softmax(y_hat):
    """定义softmax,最好按照区间进行一次归一化"""
    y_exp=torch.exp(y_hat)
    partition=y_exp.sum(1,keepdim=True)
    """1的时候为按照行相加,0的时候为按照列相加"""
    """每一行都是,共计256行的softmax,这是对y的"""
    return y_exp/partition

4.调包实现


文章作者: dlx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dlx !
评论