softmax和分类模型

1 篇文章 0 订阅
1 篇文章 0 订阅

softmax的基本概念

分类问题

        分类问题需要得到离散的预测输出,一个简单的办法是将输出值Oi,当作预测类别是i的置信度,并将值最大的输出所对应的类作为预测输出,即输出 argmax(Oi)。例如,如果O1,O2,O3分别为0.1,10, 0.1,由于O2最大,那么预测类别为2

输出问题
直接使用输出层的输出有两个问题:

  1. 一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为2,因为该输出值是其他两类的输出值的100倍。但如果O1=1000,O2=10,O3=1000 ,那么输出值10却又表示图像类别为2的概率很低。
  2. 另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量;

                   

注意:在实际应用中使用softmax需要注意数值溢出问题,当O1,O2,O3数组很大时

如 softmax(100,101,102),  运算结果会出问题

解决办法: 将O1,O2,O3将去他们的最大值,在算softmax

a=max(O1,O2,O3)

softmax(O1,O2,O3)==softmax(O1-a,O2-a,O3-a)

softmax(100,101,102)==softmax(-2,-1,0)

 

#获取MNIST数据集

方法一:优点自动下载代码简单,缺点下载慢

mnist_train = torchvision.datasets.FashionMNIST(root='/home/kesci/input/FashionMNIST2065', train=True, download=True, transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(root='/home/kesci/input/FashionMNIST2065', train=False, download=True, transform=transforms.ToTensor())

class torchvision.datasets.FashionMNIST(root, train=True, transform=None, target_transform=None, download=False)

  • root(string)– 数据集的根目录,其中存放processed/training.pt和processed/test.pt文件。

  • train(bool, 可选)– 如果设置为True,从training.pt创建数据集,否则从test.pt创建。

  • download(bool, 可选)– 如果设置为True,从互联网下载数据并放到root文件夹下。如果root目录下已经存在数据,不会再次下载。

  • transform(可被调用 , 可选)– 一种函数或变换,输入PIL图片,返回变换之后的数据。如:transforms.RandomCrop。

  • target_transform(可被调用 , 可选)– 一种函数或变换,输入目标,进行变换。

方法二:优点速度极快,缺点步骤稍微繁琐

步骤一   先到网站下载MNIST的.gz文件    http://yann.lecun.com/exdb/mnist/

一共四个文件,最大的不超过10MB

步骤二: 将这四个文件解压

步骤三:运行下面代码即可

以下代码只需更改somePath为你下载的文件的路径

import numpy as np
import struct
from PIL import Image
import os

#处理train数据
somePath='C:/Users/zzh/Desktop/MSINT/'
data_file = somePath +'train-images.idx3-ubyte' 
# It's 47040016B, but we should set to 47040000B
data_file_size = 47040016
data_file_size = str(data_file_size - 16) + 'B'
 
data_buf = open(data_file, 'rb').read()
 
magic, numImages, numRows, numColumns = struct.unpack_from(
    '>IIII', data_buf, 0)
datas = struct.unpack_from(
    '>' + data_file_size, data_buf, struct.calcsize('>IIII'))
datas = np.array(datas).astype(np.uint8).reshape(
    numImages, 1, numRows, numColumns)
 
label_file = somePath+'train-labels.idx1-ubyte' 
 
# It's 60008B, but we should set to 60000B
label_file_size = 60008
label_file_size = str(label_file_size - 8) + 'B'
 
label_buf = open(label_file, 'rb').read()
 
magic, numLabels = struct.unpack_from('>II', label_buf, 0)
labels = struct.unpack_from(
    '>' + label_file_size, label_buf, struct.calcsize('>II'))
labels = np.array(labels).astype(np.int64)
 
datas_root = somePath + 'mnist_train' 
if not os.path.exists(datas_root):
    os.mkdir(datas_root)
 
for i in range(10):
    file_name = datas_root + os.sep + str(i)
    if not os.path.exists(file_name):
        os.mkdir(file_name)
 
for ii in range(numLabels):
    img = Image.fromarray(datas[ii, 0, 0:28, 0:28])
    label = labels[ii]
    file_name = datas_root + os.sep + str(label) + os.sep + \
        'mnist_train_' + str(ii) + '.png'
    img.save(file_name)



#处理test数据
somePath='C:/Users/zzh/Desktop/MSINT/'
data_file = somePath+'t10k-images.idx3-ubyte' 

# It's 7840016B, but we should set to 7840000B
data_file_size = 7840016
data_file_size = str(data_file_size - 16) + 'B'
 
data_buf = open(data_file, 'rb').read()
 
magic, numImages, numRows, numColumns = struct.unpack_from(
    '>IIII', data_buf, 0)
datas = struct.unpack_from(
    '>' + data_file_size, data_buf, struct.calcsize('>IIII'))
datas = np.array(datas).astype(np.uint8).reshape(
    numImages, 1, numRows, numColumns)
 
label_file = somePath+'t10k-labels.idx1-ubyte'
 
# It's 10008B, but we should set to 10000B
label_file_size = 10008
label_file_size = str(label_file_size - 8) + 'B'
 
label_buf = open(label_file, 'rb').read()
 
magic, numLabels = struct.unpack_from('>II', label_buf, 0)
labels = struct.unpack_from(
    '>' + label_file_size, label_buf, struct.calcsize('>II'))
labels = np.array(labels).astype(np.int64)
 
datas_root = somePath+'mnist_test' 
 
if not os.path.exists(datas_root):
    os.mkdir(datas_root)
 
for i in range(10):
    file_name = datas_root + os.sep + str(i)
    if not os.path.exists(file_name):
        os.mkdir(file_name)
 
for ii in range(numLabels):
    img = Image.fromarray(datas[ii, 0, 0:28, 0:28])
    label = labels[ii]
    file_name = datas_root + os.sep + str(label) + os.sep + \
        'mnist_test_' + str(ii) + '.png'
    img.save(file_name)

 

 

X = torch.tensor([[1,2,3],[4,5,6]])

print(X.sum(dim=0, keepdim=True))  # dim为0,按照相同的列求和,并在结果中保留列特征
print(X.sum(dim=1, keepdim=True))  # dim为1,按照相同的行求和,并在结果中保留行特征
print(X.sum(dim=0, keepdim=False)) # dim为0,按照相同的列求和,不在结果中保留列特征
print(X.sum(dim=1, keepdim=False)) # dim为1,按照相同的行求和,不在结果中保留行特征

>>>   tensor([[5,7,9]])  shape   (1X3)

>>>   tensor([6],[15])   shape   (2X1)

>>>   tensor([5,7,9])    shape    (3)

>>>   tensor([6,15])     shape    (2)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值