MNIST 数据集的CSV的格式的使用(ANN)
1:简单单层ANN 网络实现MNIST 数据集的分类
Mnist数据集可以算是学习深度学习最常用到的了。这个数据集包含70000张手写数字图片,分别是60000张训练图片和10000张测试图片,
每个图片都是2828个像素点,数据集/会把一张图片的数据转成一个2828=784的一维向量存储起来。
里面的图片数据如下所示,每张图是0-9的手写数字黑底白字的图片,存储时,黑色用0表示,白色用0-1的浮点数表示。
每张图片是一个28*28像素点的0 ~ 9的灰质手写数字图片,黑底白字,图像像素值为0 ~ 255,越大该点越白。
2:利用CSV 进行图片的读取
每个图片都是2828个像素点,数据集/会把一张图片的数据转成一个2828=784的一维向量存储起来。里面的图片数据如下所示,每张图是0-9的手写数字黑底白字的图片,存储时,黑色用0表示,白色用0-1的浮点数表示。
import pandas as pd
import torch
from torch.utils.data import DataLoader, TensorDataset
from torch import nn, optimdir = 'E:/MNIST_CSV/'# 读取数据
train_data = pd.read_csv(dir+'mnist_train.csv')
y_train = train_data.iloc[:, 0] # 第一列是标签
X_train = train_data.iloc[:, 1:] # 其余列是像素值# 转换为张量
X_train = torch.tensor(X_train.values, dtype=torch.float32)
y_train = torch.tensor(y_train.values, dtype=torch.long)# 创建 DataLoader
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)# 定义神经网络
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(784, 128)self.relu = nn.ReLU()self.fc2 = nn.Linear(128, 10)def forward(self, x):x = x.view(-1, 784)x = self.relu(self.fc1(x))x = self.fc2(x)return x# 实例化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
model = model.cuda()# 训练模型
num_epochs = 5for epoch in range(num_epochs):model.train()running_loss = 0.0for i, (inputs, labels) in enumerate(train_loader):# print("inputs:",inputs.shape)# print("labels:", labels.shape)inputs = inputs.cuda()labels = labels.cuda()outputs = model(inputs)outputs = outputsloss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')print(f'Epoch [{epoch+1}] Loss: {running_loss/len(train_loader):.4f}')# 测试模型(可选)test_data = pd.read_csv(dir+'mnist_test.csv')
X_test = torch.tensor(test_data.values, dtype=torch.float32)test_dataset = TensorDataset(X_test)
test_loader = DataLoader(test_dataset, batch_size=2)model.eval()
predictions = []with torch.no_grad():for inputs in test_loader:inputs = inputs[0]outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)predictions.extend(predicted.cpu().numpy())# 保存预测结果
submission = pd.read_csv('sample_submission.csv')
submission['Label'] = predictions
submission.to_csv('submission.csv', index=False)
Mnist数据集CSV格式下载:https://www.kaggle.com/datasets/oddrationale/mnist-in-csv