softmax的基本概念
分类问题
分类问题需要得到离散的预测输出,一个简单的办法是将输出值Oi,当作预测类别是i的置信度,并将值最大的输出所对应的类作为预测输出,即输出 argmax(Oi)。例如,如果O1,O2,O3分别为0.1,10, 0.1,由于O2最大,那么预测类别为2
输出问题
直接使用输出层的输出有两个问题:
- 一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为2,因为该输出值是其他两类的输出值的100倍。但如果O1=1000,O2=10,O3=1000 ,那么输出值10却又表示图像类别为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)