fashion_mnist--Kaggle 入门篇

Posted 我才三分醉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fashion_mnist--Kaggle 入门篇相关的知识,希望对你有一定的参考价值。

1.介绍

  • 这篇文章适合那些刚接触Kaggle、想尽快熟悉Kaggle并且独立完成一个竞赛项目的同学。本文以湖南农业大学数据专业kaggle竞赛为例,入门讲解一篇竞赛的全流程与代码简介。
  • https://www.kaggle.com/competitions/classifying-the-fashion-mnist/submit
  • 本文所用深度学习框架为:paddle飞浆,安装参考官网https://www.paddlepaddle.org.cn/
  • conda install paddlepaddle-gpu==2.2.2 cudatoolkit=10.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
  • 导库如下:
import paddle
import paddle.vision.transforms as T
import pandas as pd
import numpy as np
from numpy import array
import matplotlib.pyplot as plt
import paddle.nn.functional as F

2.kaggle项目介绍

此次竞赛是对fashion_mnist进行分类,并以最后准确率作为评分。

2.1数据集介绍

2.2可视化(训练集)

3.数据集封装

因为比赛中给的数据集为1x784维度(如图),

我们需要将数据转化为LeNet模型输入的标准形式[1x28x28]维度,因此对数据集进行预处理与封装与训练集,测试集,验证集划分,代码如下:

from paddle.io import Dataset
#继承paddle.io.Dataset类
class myDataset(Dataset):
    def __init__(self, data=None,mode='train',transform=None,val_split=0.2):#初始化
        if mode in ['train', 'val']:
            data=pd.read_csv('../kaggle_data/data/fashion-mnist_train.csv')
            np.random.seed(43)
            data=array(data)
            np.random.shuffle(data)
            data_len = len(data)
            val_set_size = int(data_len*val_split)
            if mode == 'val':
                data = data[:val_set_size,:]
            elif mode == 'train':
                 data = data[val_set_size:,:]
        elif mode == 'test':
            data=pd.read_csv('../kaggle_data/data/fashion-mnist_test.csv')
            data=array(data)
            
        train_label=data[:,0]
        self.label = train_label
        self.data=data[:,1:]
            
            
    def __getitem__(self, idx):#实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)
        image=self.data[idx]
        label=self.label[idx]
        
        image=image.reshape(1,28,28)
        image=(image-127.5)/127.5
        image = np.array(image, dtype='float32')
        image=paddle.to_tensor(image)
        return image, int(label)
    def __len__(self):
 
        return len(self.label) # 返回数据集大小,即图片的数量
train_dataset=myDataset()#读取训练集
val_dataset=myDataset(mode='val')#验证集
test_dataset=myDataset(mode='test')#测试集

以上,我们就以及将数据部分处理完毕,下面开始网络的构建。

4.模型组建

4.1继承paddle.nn.Layer

class LeNet(paddle.nn.Layer):
#继承paddle.nn.Layer
    def __init__(self):#初始化我们所需要用到的网络层结构
        super(LeNet, self).__init__()

        self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2)
        self.max_pool1 = paddle.nn.MaxPool2D(kernel_size=2,  stride=2)
        self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1)
        self.max_pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
        self.linear1 = paddle.nn.Linear(in_features=16*5*5, out_features=120)
        self.linear2 = paddle.nn.Linear(in_features=120, out_features=84)
        self.linear3 = paddle.nn.Linear(in_features=84, out_features=10)

    def forward(self, inputs):#将网络按照顺序‘联’起来
        y = self.conv1(inputs)
        y = F.relu(y)
        y = self.max_pool1(y)
        y = F.relu(y)
        y = self.conv2(y)
        y = self.max_pool2(y)
        y = paddle.flatten(y, start_axis=1,stop_axis=-1)
        y = self.linear1(y)
        y = F.relu(y)
        y = self.linear2(y)
        y = F.relu(y)
        y = self.linear3(y)

        return y

网络结构可视化:

model = paddle.Model(LeNet())
model.summary((-1,1,28, 28))

4.2模型编译(优化器与损失函数)

model.prepare(paddle.optimizer.Adam(learning_rate=0.0001, parameters=model.parameters()), 
              paddle.nn.CrossEntropyLoss(), 
              paddle.metric.Accuracy())#loss:交叉熵;优化器:adam;评价指标:Accuracy(准确率)

以上,数据的准备和模型的搭建已经完成了,下面就是训练部分

5.模型训练

使用高阶API一行代码就可以完成了

model.fit(train_data=train_dataset, epochs=50, batch_size=30, verbose=1,eval_data=val_dataset)

  • epochs, batch_size,learning_rate等超参数大家都可以自行设定,试一试能不能使模型更好。

6.最后–结果的输出

pred_result=model.predict(test_dataset)
#将我们的测试集用训练好的模型预测,结果存在pred_result
re=array(pred_result[0])[:,0,:].argmax(1)
df=pd.DataFrame(re)
df.to_csv('result.csv')

再将我们的结果格式稍作修改,即可上交:

以上是关于fashion_mnist--Kaggle 入门篇的主要内容,如果未能解决你的问题,请参考以下文章

Aspen入门篇2—Aspen Plus 使用介绍

Java入门算法(动态规划篇1:初识动规)

Pandas高级数据分析快速入门之二——基础篇

Pandas高级数据分析快速入门之四——数据可视化篇

Pandas高级数据分析快速入门之一——Python开发环境篇

ESP32-C3入门教程——导读