Kaggle-Solution-Digit Recognizer-PyTorch-CNN

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上跑的......

目录

一、数据处理

导入库

数据处理过程

二、设置Compute Platform

​三、训练和评估

构建CNN模型

开始训练

四、预测

处理测试集数据

加载模型,用保存好的模型参数来预测结果

预测并保存


一、数据处理

先大致了解下给的数据集,三个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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python和Keras库来解决Kaggle Digit Recognizer比赛的代码示例: 首先,导入必要的库: ```python import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D from keras.optimizers import RMSprop from keras.preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split ``` 然后,读取和处理训练数据和测试数据: ```python train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') # 将数据分成输入和输出 X_train = train_data.drop(['label'], axis=1) y_train = train_data['label'] # 将输入数据重塑为28x28像素 X_train = X_train.values.reshape(-1, 28, 28, 1) test_data = test_data.values.reshape(-1, 28, 28, 1) # 将像素值转换为浮点数并归一化 X_train = X_train.astype('float32') / 255 test_data = test_data.astype('float32') / 255 # 将输出数据转换为独热编码 y_train = pd.get_dummies(y_train).values ``` 接着,将数据分成训练集和验证集,设置数据增强器并构建卷积神经网络模型: ```python # 将数据分成训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.1) # 设置数据增强器 datagen = ImageDataGenerator( rotation_range=10, zoom_range = 0.1, width_shift_range=0.1, height_shift_range=0.1) # 构建卷积神经网络模型 model = Sequential() model.add(Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation='relu', input_shape=(28,28,1))) model.add(Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation='relu')) model.add(MaxPool2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation='relu')) model.add(Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation='relu')) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256, activation="relu")) model.add(Dropout(0.5)) model.add(Dense(10, activation="softmax")) # 定义优化器和损失函数 optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) model.compile(optimizer=optimizer, loss="categorical_crossentropy", metrics=["accuracy"]) ``` 最后,使用训练集和验证集来训练和评估模型,并对测试数据进行预测: ```python # 训练模型 history = model.fit_generator(datagen.flow(X_train, y_train, batch_size=64), epochs=30, validation_data=(X_val, y_val), verbose=2) # 在验证集上评估模型 score = model.evaluate(X_val, y_val, verbose=0) print("Validation loss:", score[0]) print("Validation accuracy:", score[1]) # 对测试数据进行预测 predictions = model.predict(test_data) ``` 这就是一个简单的使用卷积神经网络和数据增强器来解决Kaggle Digit Recognizer比赛的代码示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值