ML的HelloWorld:MNIST识别
数据是很普通的MNIST(28*28
) 即一个 28*28
的256灰度图,要求你识别出数字
操作系统:世界上最垃圾的操作系统(我还没说是哪个呢)
简单CNN Acc:0.99
数据准备
首先我们来实现Baseline(Acc=0.99)
读入数据,我们使用 pandas
读入数据
1 | train_origin = pd.read_csv(PATH+TRAIN) |
由于我们的训练集是只有一个label,但是我们神经网络需要输出一个10维向量(代表 0 to 9
),因此我们改写一下数据集,把 label 转化成 onehot 编码的
其实并不需要输出一个十维的,也可以就输出一个数字,但是一般不会这么写
1 | one_hot_embedding = pd.get_dummies(train_origin.label,prefix='y') |
然后我们把这个编码出来的合并到原来训练集中,并且删除原来的label标签
1 | # axis = 1 是横着合并 |
现在就是划分训练集和测试集,我们使用 sklearn
中的 train_test_split
函数。
stratify表示是否按照数据分布划test和val
1 | x_train, x_val, y_train, y_val = train_test_split(train_origin.iloc[:, 10:], train_origin.iloc[:, 0:10], train_size = 0.92, stratify=train_origin.iloc[:, 0:10]) |
这个是 Dataframe 不多说
1 | class MnistDataset(Dataset): |
接下来我们加载数据
numpy 和 torch 对于图像的表示不同,numpy是 HW C(Channel) ,而torch 是 CHW ,因此需要to tensor
我并不知道 totensorV2后还会不会共享内存,但是它真的快,虽然这模型没跑到GPU瓶颈。
1 | # 在这里,我们设置了一个图像随机旋转,0.5的概率旋转不超过25度 |
加载数据
1 | train_dataloader = DataLoader(train_pytorch_dataset, batch_size=64, shuffle=True,num_workers=NUM_WORKERS) |
CNN
1 | class Simple_CNN(nn.Module): |
train
1 | train_acc, train_loss, val_acc, val_loss = fit(model=net, |
1 | def fit(model, loss_fn, optimizer, epochs, train_dataloader, val_dataloader, device): |
测试测试集
最后是对数据进行验证
1 | # 验证数据 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.