• 造车先做三蹦子-之三:自制数据集(6x6数据集)230103


    6*6的数据集制造、与识别:

    1. #6*6的数据集的制作、与识别、测试、输出等
    2. import torch
    3. import torch.nn as nn
    4. import torch.optim as optim
    5. # 定义模型
    6. class NeuralNet(nn.Module):
    7. def __init__(self, input_size, hidden_size, num_classes):
    8. super(NeuralNet, self).__init__()
    9. self.fc1 = nn.Linear(input_size, hidden_size)
    10. self.fc2 = nn.Linear(hidden_size, hidden_size)
    11. self.fc3 = nn.Linear(hidden_size, num_classes)
    12. self.relu = nn.ReLU()
    13. def forward(self, x):
    14. out = self.relu(self.fc1(x))
    15. out = self.relu(self.fc2(out))
    16. out = self.fc3(out)
    17. return out
    18. # 数据准备
    19. train_data = torch.tensor([
    20. [[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0]],
    21. [[0,0,0,0,0,0],[0,0,0,0,0,0],[1,1,1,1,1,1],[1,1,1,1,1,1],[0,0,0,0,0,0],[0,0,0,0,0,0]],
    22. # ... 其他训练数据
    23. ] , dtype=torch.float32 )
    24. train_labels = torch.tensor([
    25. [1,0,0,0,0,0,0],
    26. [0,1,0,0,0,0,0],
    27. # ... 其他训练标签
    28. ] , dtype=torch.float32 )
    29. test_data = torch.tensor([
    30. [[0,0,0,0,0,0],[0,1,1,1,1,0],[1,1,1,1,1,1],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]],
    31. [[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,0,1,0,0]],
    32. # ... 其他测试数据
    33. ] , dtype=torch.float32 )
    34. # 参数设置
    35. input_size = 6 * 6 # 输入维度
    36. hidden_size = 50 # 隐藏层节点数量
    37. num_classes = 7 # 输出维度
    38. learning_rate = 0.001
    39. num_epochs = 1000
    40. model = NeuralNet(input_size, hidden_size, num_classes)
    41. # 损失和优化器
    42. criterion = nn.CrossEntropyLoss()
    43. optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    44. # 训练模型
    45. for epoch in range(num_epochs):
    46. # 前向传播
    47. outputs = model(train_data.view(-1, 36))
    48. loss = criterion(outputs, torch.argmax(train_labels, 1))
    49. # 反向传播和优化
    50. optimizer.zero_grad()
    51. loss.backward()
    52. optimizer.step()
    53. if (epoch+1) % 100 == 0:
    54. print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
    55. # 保存模型
    56. torch.save(model.state_dict(), 'model.ckpt')
    57. # 测试
    58. with torch.no_grad():
    59. test_outputs = model(test_data.view(-1, 36))
    60. predicted = torch.argmax(test_outputs.data, 1)
    61. for i, prediction in enumerate(predicted):
    62. print(f"Test data {i+1}: Predicted label: {prediction.item()}")

    1. #true Type 字体作为训练库,完成字符的识别
    2. import torch
    3. import torch.nn as nn
    4. import torch.optim as optim
    5. from PIL import Image, ImageDraw, ImageFont
    6. from torchvision import transforms
    7. import matplotlib.pyplot as plt
    8. Times2000=1000
    9. # 参数设置
    10. font_path = "arial.ttf" #e:\\arial.ttf"
    11. #siz28e28 = 28
    12. siz28e28=28
    13. characters = ["2","4"] +[str(i) for i in range(8,10)] + ["A","Z"] #["A", "B"]
    14. print(characters)
    15. # 1. 生成字符和数字的点阵数据
    16. def render_char(char, siz28e28):
    17. image = Image.new("L", (siz28e28, siz28e28), "white")
    18. draw = ImageDraw.Draw(image)
    19. font = ImageFont.truetype(font_path, siz28e28)
    20. #-----------------------------------------
    21. w03 = draw.textlength(char, font=font)
    22. h03 = siz28e28
    23. print("{[w3",w03, "h3",w03 ,"]} ")
    24. #-----------------------------------------
    25. draw.text(((siz28e28-w03)/2, (siz28e28-h03)/2), char, font=font, fill="black")
    26. return image
    27. data = []
    28. labels = []
    29. for i, char in enumerate(characters):
    30. img = render_char(char, siz28e28)
    31. data.append(transforms.ToTensor()(img))
    32. labels.append(i)
    33. # 2. 训练神经网络模型
    34. class SimpleNet(nn.Module):
    35. def __init__(self, num_classes):
    36. super(SimpleNet, self).__init__()
    37. self.fc = nn.Linear(siz28e28 * siz28e28, num_classes)
    38. def forward(self, x):
    39. x = x.view(-1, siz28e28 * siz28e28)
    40. x = self.fc(x)
    41. return x
    42. model = SimpleNet(len(characters))
    43. loss_function = nn.CrossEntropyLoss()
    44. optimizer = optim.SGD(model.parameters(), lr=0.01)
    45. for epoch in range(Times2000):#8000):#1000):
    46. inputs = torch.stack(data)
    47. targets = torch.tensor(labels)
    48. optimizer.zero_grad()
    49. outputs = model(inputs)
    50. loss = loss_function(outputs, targets)
    51. loss.backward()
    52. optimizer.step()
    53. # 3. 使用模型进行预测
    54. def predict_image(img_path):
    55. model.eval()
    56. img = Image.open(img_path).convert("L").resize((siz28e28, siz28e28))
    57. img_tensor = transforms.ToTensor()(img).unsqueeze(0)
    58. output = model(img_tensor)
    59. _, predicted = output.max(1)
    60. return characters[predicted[0]]
    61. #//1-----
    62. im="f:\\22letter23r1002\8_16x16.png"
    63. predicted_char = predict_image(im)
    64. print(f"预测的字符为: {predicted_char}")
    65. # 使用matplotlib显示结果
    66. plt.imshow(Image.open(im))
    67. #plt.title(f"Predicted: {predicted_char}")
    68. #plt.axis("off")
    69. #plt.show()

  • 相关阅读:
    spring中那些让你爱不释手的代码技巧(续集)
    KMP算法代码实现
    迪萧科技有限公司邀您参观2024生物发酵展
    ElasticSearch集群配置
    vue3(vite)+electron打包踩坑记录(1)
    Celery基本语法
    活动的四种启动模式详解
    java计算机毕业设计基于安卓/微信的农产品特产销售商城小程序 uniAPP
    剑指offer 14. 二进制中1的个数
    python面向对象
  • 原文地址:https://blog.csdn.net/aw344/article/details/134047275