机器学习之softmax实现Fashion-MNIST分类

1.导入MNIST的数据
在开始时我们需要导入MNIST的数据,MNIST的数据可以从github上进行下载Fashion-MNIST数据集,MNIST有四个数据集,分别如下:

train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

前两个数据集是训练集,分别是训练集的图片和标签,后两个数据集是测试集,分别是测试集的图片和标签。一共有60000张训练集以及10000张测试集。共10种标签,以0~9数字形式给出,对应的描述如下:

在这里插入图片描述

在第一个数据集中,数据是以2进制给出,其中前128位不包含图片信息,它是关于数据集的一些说明。在图片数据集中(包括数据集和训练集),前面有4个信息,都是由32位二进制数表示,第一个信息是magic number图片位2049,第二个信息是样本数,第三个是行数,第四个是列数。描述如下:
在这里插入图片描述

其中训练集样本为60000个,测试集样本为10000个。

标签数据集,包含两个头文件信息:

第一个是magic number,第二个是样本个数。下面是matlab导入图片和标签的函数。

function images1=loadImage()
    filename="train-images-idx3-ubyte";%将下载的数据解解压后去掉后缀名得到。
    fid=fopen(filename,"rb");%打开训练集的图片数据集
    A=fread(fid);%读取训练集中的数据,读取后,数据按照每个字节(8位二进制)转化成了十进制数。
    images1=A(17:length(A));%从17位开始是图片信息
    num=A(5:8);%第二个头文件,样本个数
    row=A(9:12);%第三个头文件,行数
    col=A(13:16);%第四个头文件,列数
%下面的操作是将32位二进制数转化为十进制
    num=dec2hex(num);
    row=dec2hex(row);
    col=dec2hex(col);
    num1=[];
    row1=[];
    col1=[];
    for i=1:4
        num1=[num1 num(i,:)];
        row1=[row1,row(i,:)];
        col1=[col1 col(i,:)];
    end
    num1=hex2dec(num1);
    col1=hex2dec(col1);
    row1=hex2dec(row1);
%将图片数据转化为矩阵形式。
    images1=reshape(images1,row1,col1,num1);
    images1=permute(images1,[2,1,3]);
    fclose(fid);
end

为了验证转化的是否正确可以利用imwrite函数将矩阵转化为图片看看是否是数字如取第十个矩阵

a=images1(:,:,50);

imwrite(uint8(a),‘test.tif’)%输出文件名为test.tif。

%imwrite(mat2gray(a), ‘test.tif’);
Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN

上述得到的数据是 28 × 28 × 60000 28\times28\times60000 28×28×60000,需要转化为 60000 × ( 28 ∗ 28 ) 60000\times(28*28) 60000×(2828)的形式,以便带入模型中学习,并且需要将数据进行归一化处理

function [x,x_test,y,y_test]=getData()
    %数据文件同函数在同一目录下
    train_imgs="train-images-idx3-ubyte";      %训练集
    train_labels="train-labels-idx1-ubyte";    %训练集标签
    test_imgs="t10k-images-idx3-ubyte";        %测试集
    test_labels="t10k-labels-idx1-ubyte";      %测试集标签
    x=loadImage(train_imgs);
    x_test=loadImage(test_imgs);
    y=loadLabel(train_labels);
    y_test=loadLabel(test_labels);
    
    x=reshape(x,28*28,60000); 
    x=x/255.0;  %归一化处理
    x=x.';      %转置
    
    x_test=reshape(x_test,28*28,10000);
    x_test=x_test/255.0;
    x_test=x_test.';
end

导入标签:

function labels1=loadLabel()
    filename="train-labels-idx1-ubyte";
    fid=fopen(filename,"rb");
    A=fread(fid);
    labels1=A(9:length(A));
    fclose(fid);
end

2.softmax分类

2.1 softmax回归模型

o 1 = x 1 w 11 + x 2 w 21 + x 3 w 31 + x 4 w 41 + b 1 , o 2 = x 1 w 12 + x 2 w 22 + x 3 w 32 + x 4 w 42 + b 2 , o 3 = x 1 w 13 + x 2 w 23 + x 3 w 33 + x 4 w 43 + b 3 . o_1 = x_1 w_{11} + x_2 w_{21} + x_3 w_{31} + x_4 w_{41} + b_1,\\ o_2 = x_1 w_{12} + x_2 w_{22} + x_3 w_{32} + x_4 w_{42} + b_2,\\ o_3 = x_1 w_{13} + x_2 w_{23} + x_3 w_{33} + x_4 w_{43} + b_3. o1=x1w11+x2w21+x3w31+x4w41+b1,o2=x1w12+x2w22+x3w32+x4w42+b2,o3=x1w13+x2w23+x3w33+x4w43+b3.

转化为矩阵形式:

O = X W T + b O=XW^T+b O=XWT+b

假设一共有 n n n个样本,每个样本有 q q q 个特征, K K K个标签则:

X ∈ R n × q X\in{R^{n\times{q}}} XRn×q 为输入样本

W ∈ R K × q W\in{R^{K\times{q}}} WRK×q 权重

d ∈ R 1 × K d\in{R^{1\times{K}}} dR1×K 偏置

O ∈ R n × k O\in{R^{n\times k}} ORn×k

2.2 softmax损失函数

softmax使用交叉熵来计算损失函数
H ( y ( i ) , y ^ ( i ) ) = − ∑ j = 1 q y j ( i ) log ⁡ y ^ j ( i ) H\left(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}\right ) = -\sum_{j=1}^q y_j^{(i)} \log \hat y_j^{(i)} H(y(i),y^(i))=j=1qyj(i)logy^j(i)
ℓ ( Θ ) = 1 n ∑ i = 1 n H ( y ( i ) , y ^ ( i ) ) \ell(\boldsymbol{\Theta}) = \frac{1}{n} \sum_{i=1}^n H\left(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}\right ) (Θ)=n1i=1nH(y(i),y^(i))

其中 n n n 表示样本总数, i i i表示第 i i i 个样本, j j j 表示第 j j j 个输出。

y j ( i ) y_j^{(i)} yj(i) 表示第 i i i个样本的真实标签。只有样本 $i 标签为 j j j时, y j ( i ) = 1 y_j^{(i)}=1 yj(i)=1 ,其他标签位为0;

y ^ j ( i ) = e O i j ∑ k = 1 K e O i k = e ( X i W ( j , : ) T + b j ) ∑ k = 1 K e ( X i W ( k , : ) T + b k ) \hat y_j^{(i)}=\frac{e^{O_{ij}}}{\sum_{k=1}^{K}{e^{O_{ik}}}}=\frac{e^{(X_iW_{(j,:)}^{T}+b_j)}}{\sum_{k=1}^{K}{e^{(X_iW_{(k,:)}^{T}+b_k)}}} y^j(i)=k=1KeOikeOij=k=1Ke(XiW(k,:)T+bk)e(XiW(j,:)T+bj)

损失函数可以表示为:

ℓ ( Θ ) = − ( 1 / n ) ∑ i = 1 n ∑ j = 1 K y j ( i ) ln ⁡ y ^ j ( i )

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文将介绍如何使用softmax回归对Fashion-MNIST图像数据集行预测。 Fashion-MNIST是一个替代MNIST手写数字集的图像数据集,用于训练和测试机器学习模型。它包含了10个类别的70,000张灰度图像,每个图像的大小为28x28像素。这些图像涵盖了从衣服、鞋子到手提包等各种物品。 为了使用softmax回归对Fashion-MNIST图像数据集行预测,我们需要完成以下步骤: 1.加载Fashion-MNIST数据集 首先,我们需要下载并加载Fashion-MNIST数据集。可以使用以下代码块下载和加载数据集: ``` import tensorflow as tf from tensorflow import keras (x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data() ``` 2.预处理数据集 接下来,我们需要对数据集行预处理。我们需要将每个图像的像素值缩放到0到1之间,并将标签转换为独热编码。可以使用以下代码块完成预处理: ``` x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 y_train = keras.utils.to_categorical(y_train) y_test = keras.utils.to_categorical(y_test) ``` 3.构建模型 接下来,我们需要构建一个softmax回归模型。我们可以使用一个全连接层作为模型的唯一层,并将softmax函数应用于输出。可以使用以下代码块构建模型: ``` model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(10, activation='softmax') ]) ``` 4.编译模型 接下来,我们需要编译模型。我们可以使用categorical_crossentropy作为损失函数,并使用adam优化器行优化。可以使用以下代码块编译模型: ``` model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 5.训练模型 接下来,我们需要训练模型。我们可以使用fit方法来训练模型,并指定训练数据、批量大小、训练迭代次数和验证数据。可以使用以下代码块训练模型: ``` model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test)) ``` 6.评估模型 最后,我们需要评估模型。我们可以使用evaluate方法来评估模型,并指定测试数据。可以使用以下代码块评估模型: ``` loss, accuracy = model.evaluate(x_test, y_test) print('Test accuracy:', accuracy) ``` 完整代码如下: ``` import tensorflow as tf from tensorflow import keras (x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 y_train = keras.utils.to_categorical(y_train) y_test = keras.utils.to_categorical(y_test) model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(10, activation='softmax') ]) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test)) loss, accuracy = model.evaluate(x_test, y_test) print('Test accuracy:', accuracy) ``` 通过以上步骤,我们就可以使用softmax回归对Fashion-MNIST图像数据集行预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值