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类classmyDataset(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):returnlen(self.label)# 返回数据集大小,即图片的数量
train_dataset=myDataset()#读取训练集
val_dataset=myDataset(mode='val')#验证集
test_dataset=myDataset(mode='test')#测试集
以上,我们就以及将数据部分处理完毕,下面开始网络的构建。
4.模型组建
4.1继承paddle.nn.Layer
classLeNet(paddle.nn.Layer):#继承paddle.nn.Layerdef__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)defforward(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')
再将我们的结果格式稍作修改,即可上交:
版权归原作者 我才三分醉 所有, 如有侵权,请联系我们删除。