Digit Recognizer | Kaggle 这个小项目算是深度学习的 hello world 了,而其中用到的 MINST 也算是计算机视觉领域的 hello world 数据集了。参考了很多大佬的 solution,算是站在巨人的肩膀上边学习边应用。整个过程中,为了达到更好的效果,超参数的修改,优化器的选择等,边改边跑边比较分析,感觉像在练丹一样(哈哈)......OK进入正题了......
下面的做法是基于PyTorch框架和CNN算法实现的,为了避免在安装环境上踩坑,强烈推荐这个大佬的博客:安装PyTorch,我只踩了两次坑,一是关于CondaHTTPError的问题,可能解决的措施是把.condarc文件中的“https”改为“http”,再把“default”删除;二是关于显卡问题,如果是NAVIDIA显卡,安装PyTorch时,Compute Platform选择所用的CUDA,如果不是NAVIDIA显卡,则用CPU(非NAVIDIA显卡不支持CUDA)。安好之后,我是在pycharm上跑的......
目录
一、数据处理
先大致了解下给的数据集,三个csv文件
数据文件 train.csv
和 test.csv
包含从零到九的手绘数字的灰度图像。每个图像的高度为 28
像素,宽度为 28
像素,总计 28 * 28 = 784
像素。像素值是介于 0 和 255 之间的整数(包括 0 和255),数字越高表示像素越暗。
train.csv:42000*785 ;第1列为标签,后784列为数据(pixel x) x = i * 28 + j 表示在28*28的矩阵中第 i 行 j 列的像素值
test.csv 不含 label ,28000个数据,testset是 MINST 的子集
submission.csv 提交示例文件,包含两个属性 ImageId 和 label
导入库
import pandas as pd
import random
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.optim import lr_scheduler
import numpy as np
import matplotlib.pyplot as plt
import datetime
数据处理过程
- pandas读取train.csv文件
- dataframe数据转化成numpy数组(共42000个数据)
- 标签和数据分开
- reshape(42000*784->42000*28*28)
- 分割验证集 train:38400 val:3600(这里有点写死了)其实可以用 train_test_split
- 将 train 和 val 的 data、label 转化为 PyTorch 的 tensor
- 数据归一化 normalization、stdandization
# pandas读取文件内容
data = pd.read_csv('../train.csv')
# data.head(5) # 显示文件前五行
# dataframe数据转化成numpy数组,共42000个数据
np_data = np.array(data)
# 第一列为标签,后784列为数据,将标签与数据分开
digit_data = np_data[:, 1:] # 取第1列及其后面所有列
digit_label = np_data[:, 0] # 取第0列
# print(digit_data.shape) # 打印数据大小 42000*784
# print(digit_label.shape) # 打印标签大小 42000*1
# 将二维数据转化为三维张量,第一维度代表数据个数,第二第三代表图像长宽像素, 图像为28*28的大小
# 把一维的像素值reshape成图像
digit_data = digit_data.reshape((42000, 28, 28))
# example = digit_data[5, :, :] # 可以看一下第一张图像
# plt.imshow(example)
# 将数据分为train,val两组,分别为train38400 val3600
train_data = digit_data[0:38400, :, :]
val_data = digit_data[38400:, :, :]
# 示例
# train_exam = train_data[0, :, :]
# val_exam = val_data[0, :, :]
print('train and val data shape: ', train_data.shape, ' ', val_data.shape) # 检查维度
train_label = digit_label[0:38400]
val_label = digit_label[38400:]
print('train and val label shape: ', train_label.shape, ' ', val_label.shape)
# 示例
# plt.imshow(train_data[0, :, :])
# 将数据集和验证集都转化为pytorch的tensor
train_data = torch.tensor(train_data)
val_data = torch.tensor(val_data)
train_label = torch