首页 > 其他分享 >在树莓派上使用numpy实现简单的神经网络推理,pytorch在服务器或PC上训练好模型保存成numpy格式的数据,推理在树莓派上加载模型

在树莓派上使用numpy实现简单的神经网络推理,pytorch在服务器或PC上训练好模型保存成numpy格式的数据,推理在树莓派上加载模型

时间:2023-05-30 16:37:12浏览次数:49  
标签:树莓 numpy data train path model 推理

这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是mlp识别mnist手写数字识别

训练代码在电脑上,cpu就能训练,很快的:

 1 import torch
 2 import torch.nn as nn
 3 import torch.optim as optim
 4 from torchvision import datasets, transforms
 5 
 6 # 设置随机种子
 7 torch.manual_seed(42)
 8 
 9 # 定义MLP模型
10 class MLP(nn.Module):
11     def __init__(self):
12         super(MLP, self).__init__()
13         self.fc1 = nn.Linear(784, 256)
14         self.fc2 = nn.Linear(256, 128)
15         self.fc3 = nn.Linear(128, 10)
16 
17     def forward(self, x):
18         x = x.view(-1, 784)
19         x = torch.relu(self.fc1(x))
20         x = torch.relu(self.fc2(x))
21         x = self.fc3(x)
22         return x
23 
24 # 加载MNIST数据集
25 transform = transforms.Compose([
26     transforms.ToTensor(),
27     # transforms.Normalize((0.1307,), (0.3081,))
28 ])
29 
30 train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
31 test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
32 
33 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
34 test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
35 
36 # 创建模型实例
37 model = MLP()
38 
39 # 定义损失函数和优化器
40 criterion = nn.CrossEntropyLoss()
41 optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
42 
43 # 训练模型
44 def train(model, train_loader, optimizer, criterion, epochs):
45     model.train()
46     for epoch in range(1, epochs + 1):
47         for batch_idx, (data, target) in enumerate(train_loader):
48             optimizer.zero_grad()
49             output = model(data)
50             loss = criterion(output, target)
51             loss.backward()
52             optimizer.step()
53             
54             if batch_idx % 100 == 0:
55                 print('Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
56                     epoch, batch_idx * len(data), len(train_loader.dataset),
57                     100. * batch_idx / len(train_loader), loss.item()))
58 
59 # 训练模型
60 train(model, train_loader, optimizer, criterion, epochs=5)
61 
62 # 保存模型为NumPy格式
63 numpy_model = {}
64 numpy_model['fc1.weight'] = model.fc1.weight.detach().numpy()
65 numpy_model['fc1.bias'] = model.fc1.bias.detach().numpy()
66 numpy_model['fc2.weight'] = model.fc2.weight.detach().numpy()
67 numpy_model['fc2.bias'] = model.fc2.bias.detach().numpy()
68 numpy_model['fc3.weight'] = model.fc3.weight.detach().numpy()
69 numpy_model['fc3.bias'] = model.fc3.bias.detach().numpy()
70 
71 # 保存为NumPy格式的数据
72 import numpy as np
73 np.savez('mnist_model.npz', **numpy_model)

然后需要自己倒出一些图片在dataset里:我保存在了mnist_pi文件夹下,“_”后面的是标签,主要是在pc端导出保存到树莓派下

 

树莓派推理端的代码,需要numpy手动重新搭建网络,然后加载那些保存的矩阵参数,做矩阵乘法和加法

 1 import numpy as np
 2 import os
 3 from PIL import Image
 4 
 5 # 加载模型
 6 model_data = np.load('mnist_model.npz')
 7 weights1 = model_data['fc1.weight']
 8 biases1 = model_data['fc1.bias']
 9 weights2 = model_data['fc2.weight']
10 biases2 = model_data['fc2.bias']
11 weights3 = model_data['fc3.weight']
12 biases3 = model_data['fc3.bias']
13 
14 # 进行推理
15 def predict(image, weights1, biases1,weights2, biases2,weights3, biases3):
16     image = image.flatten()/255  # 将输入图像展平并进行归一化
17     output = np.dot(weights1, image) + biases1
18     output = np.dot(weights2, output) + biases2
19     output = np.dot(weights3, output) + biases3
20     predicted_class = np.argmax(output)
21     return predicted_class
22 
23 
24 
25 
26 folder_path = './mnist_pi'  # 替换为图片所在的文件夹路径
27 def infer_images_in_folder(folder_path):
28     for file_name in os.listdir(folder_path):
29         file_path = os.path.join(folder_path, file_name)
30         if os.path.isfile(file_path) and file_name.endswith(('.jpg', '.jpeg', '.png')):
31             image = Image.open(file_path)
32             label = file_name.split(".")[0].split("_")[1]
33             image = np.array(image)
34             print("file_path:",file_path,"img size:",image.shape,"label:",label)
35             predicted_class = predict(image, weights1, biases1,weights2, biases2,weights3, biases3)
36             print('Predicted class:', predicted_class)
37         
38 infer_images_in_folder(folder_path)

 

结果:

效果还不错:

 

这次内容就到这里了,下次争取做一个卷积的神经网络在树莓派上推理,然后争取做一个目标检测的模型在树莓派上 

 

标签:树莓,numpy,data,train,path,model,推理
From: https://www.cnblogs.com/LiuXinyu12378/p/17443613.html

相关文章

  • 如何把树莓派变成一个开机自启动的 Wi-Fi 热点 All In One
    如何把树莓派变成一个开机自启动的Wi-Fi热点AllInOneWi-Fihotspot/Wi-Fi热点应用场景把树莓派变成一个移动的Wi-Fi热点❓SD卡,系统已经提前配置好SSH等访问配置信息;✅树莓派只要开机通电后,通过.profile/.zshrc/.bashrc等系统自启动配置;✅通过she......
  • NumPy学习4
    今天学习NumPy相关数组操作NumPy中包含了一些处理数组的常用方法,大致可分为以下几类:(1)数组变维操作(2)数组转置操作(3)修改数组维度操作(4)连接与分割数组操作numpy_test4.py:importnumpyasnp'''10,NumPy相关数组操作NumPy中包含了一些处理数组的常用方法,大致可分......
  • 【2023 · CANN训练营第一季】应用开发深入讲解之模型离线推理
    应用开发深入讲解之模型离线推理模型离线推理是指使用已经转好的om模型对输入图片进行推理,主要步骤如下图所示:1.Host&Device内存管理与数据传输Host&Device上的内存申请与释放,内存间的相互拷贝。代码中加载输入数据时,需要申请Host内存进行存储,当输入数据处理完毕后,需要将处理完成的......
  • 树莓派使用HC-SR04超声波测距
    超声波模块介绍  超声波测距原理很简单:  1、通过记录发送超声波的时间、记录超声波返回的时间,返回时间与发送时间相减得到超声波的持续时间。  2、通过公式:(超声波持续时间*声波速度)/2就可以得出距离;  HC-SR04参数:  工作电压:5V  工作电流:15mA  最短测......
  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT
    深度学习领域常用的基于CPU/GPU的推理方式有OpenCVDNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下:结论:GPU加速首选Tens......
  • 使用树莓派远程控制灯继电器开关,dht11温湿度网页显示,树莓派物联网
    前段时间使用esp8266搞了个智能家居,通过网页控制,但是没有办法实现远程控制,只能局域网控制,因为我没有平台,使用机制云等平台还需要开发app使用chatgpt生成的main.py程序fromflaskimportFlask,render_template,requestimportAdafruit_DHTimportRPi.GPIOasGPIOapp=F......
  • Numpy_矩阵的multiply_python的属性以及类特性_装饰器——@property_@classmethod_@st
    Python类中有三个常用的装饰器分别是@property(使一个方法可以被当成属性调用,常用于直接返回某一不想被修改的属性)@classmethod(将一个方法定义为类方法,其中第一个参数要修改为cls,使得该方法可以不用实例化即可被调用)@staticmethod(静态方法,类似于类方法,也可以不用实例化,......
  • NumPy_矩阵的八种运算以及变换矩阵
    概念numpy下的linalg=linear+algebra01.数学概念vector向量array:数组matrix:矩阵标量(数量)物理定义:只有大小,没有方向的量n个有次序的数a_{1},a_{2},····,a_{n}所组成的数组称为n维向量--行向量和列向量数组,是有序的元素序列m×n个数aij(i=1,2......
  • NumPy学习3
    继续学习NumPy,今天学习以下3个章节:7,NumPy高级索引8,NumPy广播机制9,NumPy遍历数组numpy_test3.py:importnumpyasnp'''7,NumPy高级索引NumPy与Python的内置序列相比,它提供了更多的索引方式。在NumPy中还可以使用高级索引方式,比如整数数组索引、布尔索引以及花式......
  • 机器学习(八):贝叶斯网络——福尔摩斯推理、草地喷水器推断
    实验4贝叶斯网络一、预备知识二、实验目的掌握贝叶斯网络算法的原理及设计;掌握利用贝叶斯网络算法解决推理分析。三、实验内容福尔摩斯先生在办公室接到了他邻居华生的电话P(W=T)。华生告诉他:他的家里可能进了窃贼P(B=T),因为他家的警铃响了P(A=T)被告......