Mnist数据集进行分类
主要内容:
数据读取 – 路径设置、数据加载
自定义模型MyMnist_NN
自定义损失函数loss_func
自定义fit
[详情看目录]
# 1.读取Mnist数据集
%matplotlib inline
from pathlib import Path
import requests
from matplotlib import pyplot
import numpy as np
1.获取数据
1.1 路径设置
DATA_PATH = Path("data")
PATH = DATA_PATH / "mnist"
PATH.mkdir(parents=True, exist_ok=True)
URL = "http://deeplearning.net/data/mnist/"
FILENAME = "mnist.pkl.gz"
if not (PATH / FILENAME).exists():
content = requests.get(URL + FILENAME).content
(PATH / FILENAME).open("wb").write(content)
1.2 加载读取数据
import pickle
import gzip
with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")
1.3 展示数据
# x_train[i]是一个784维的向量,将其转换为28 * 28的二维矩阵显示出来,是图像形式
# imshow()可以传入二维矩阵(M,N) / 三维(M,N,3) /三维(M.N,4)
pyplot.imshow(x_train[1].reshape((28, 28)), cmap="gray")
print(x_train.shape)
(50000, 784)
# 此时x_train是ndarray数组
x_train
array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]], dtype=float32)
- 将其转换为tensor后才能进行建模训练
import torch
x_train,y_train,x_valid,y_valid = map(
torch.tensor,(x_train,y_train,x_valid,y_valid)
)
x_train # 此时是tensor
tensor([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])
# 查看下标签值的范围最大值和最小值的函数!第一次见
y_train.min(),y_train.max()
(tensor(0), tensor(9))
2.torch.nn.functional的层和函数功能展示
import torch