10分钟入门神经网络 PyTorch 手写数字识别-哔哩哔哩】 https://b23.tv/nwjMNSz
pytorch tutorial: PyTorch 手写数字识别 教程代码
手写数字识别项目
安装库: pip3 install numpy torch torchvision matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
运行: python test.py
通过 pip list可以查看Pillow版本信息
python版本:3.12
Pillow版本信息10.4.0(注意默认是10.2.0会报错),执行升级到最新即可
pip3 install --upgrade Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple/
import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import MNIST
import matplotlib.pyplot as plt
class Net(torch.nn.Module):
def __init__(self):
super().__init__()
self.fc1 = torch.nn.Linear(28*28, 64)
self.fc2 = torch.nn.Linear(64, 64)
self.fc3 = torch.nn.Linear(64, 64)
self.fc4 = torch.nn.Linear(64, 10)
def forward(self, x):
x = torch.nn.functional.relu(self.fc1(x))
x = torch.nn.functional.relu(self.fc2(x))
x = torch.nn.functional.relu(self.fc3(x))
x = torch.nn.functional.log_softmax(self.fc4(x), dim=1)
return x
def get_data_loader(is_train):
to_tensor = transforms.Compose([transforms.ToTensor()])
data_set = MNIST("", is_train, transform=to_tensor, download=True)
return DataLoader(data_set, batch_size=15, shuffle=True)
def evaluate(test_data, net):
n_correct = 0
n_total = 0
with torch.no_grad():
for (x, y) in test_data:
outputs = net.forward(x.view(-1, 28*28))
for i, output in enumerate(outputs):
if torch.argmax(output) == y[i]:
n_correct += 1
n_total += 1
return n_correct / n_total
def main():
train_data = get_data_loader(is_train=True)
test_data = get_data_loader(is_train=False)
net = Net()
print("initial accuracy:", evaluate(test_data, net))
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
for epoch in range(2):
for (x, y) in train_data:
net.zero_grad()
output = net.forward(x.view(-1, 28*28))
loss = torch.nn.functional.nll_loss(output, y)
loss.backward()
optimizer.step()
print("epoch", epoch, "accuracy:", evaluate(test_data, net))
for (n, (x, _)) in enumerate(test_data):
if n > 3:
break
predict = torch.argmax(net.forward(x[0].view(-1, 28*28)))
plt.figure(n)
plt.imshow(x[0].view(28, 28))
plt.title("prediction: " + str(int(predict)))
plt.show()
if __name__ == "__main__":
main()
执行后,可以看到效果
其他:如何安装dlib 、 opencv
需要安装以下命令:
pip3 install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple/
conda install -c conda-forge dlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
CV2对应opencv-python
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python
train_test_split对应 scikit-learn模块
pip3 install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/