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.









