【教程】将Python转为C语言并编译生成二进制文件

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

本教程以DGL版本的GCN为例,其他也相似。

1、安装cython、gcc:

sudo apt install cython  gcc -y

2、安装DGL、PyTorch:

pip3 install torch torchvision torchaudio
pip install dgl -f https://data.dgl.ai/wheels/cu117/repo.html
pip install dglgo -f https://data.dgl.ai/wheels-test/repo.html

3、编写gcn.py。注意添加# cython: language_level=3,不然默认用的是python2:

# cython: language_level=3

import torch
import torch.nn as nn
import torch.nn.functional as F
import dgl
from dgl.data import CoraGraphDataset
from dgl.nn import GraphConv

# 定义 GCN 模型
class GCN(nn.Module):
    def __init__(self, in_feats, h_feats, num_classes):
        super(GCN, self).__init__()
        self.conv1 = GraphConv(in_feats, h_feats)
        self.conv2 = GraphConv(h_feats, num_classes)

    def forward(self, g, in_feat):
        h = self.conv1(g, in_feat)
        h = F.relu(h)
        h = self.conv2(g, h)
        return h

if __name__ == "__main__":
    # 加载数据集
    dataset = CoraGraphDataset()
    g = dataset[0]

    # 创建模型实例
    model = GCN(g.ndata['feat'].shape[1], 16, dataset.num_classes)

    # 定义损失函数和优化器
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
    criterion = nn.CrossEntropyLoss()

    # 训练模型
    for epoch in range(200):
        logits = model(g, g.ndata['feat'])
        loss = criterion(logits[g.ndata['train_mask']], g.ndata['label'][g.ndata['train_mask']])
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if epoch % 10 == 0:
            print(f'Epoch {epoch}, Loss: {loss.item()}')

    # 测试模型
    model.eval()
    with torch.no_grad():
        logits = model(g, g.ndata['feat'])
        _, predicted = torch.max(logits[g.ndata['test_mask']], 1)
        correct = (predicted == g.ndata['label'][g.ndata['test_mask']]).sum().item()
        acc = correct / len(predicted)
        print(f'Accuracy: {acc:.4f}')

4、使用cython将Python转为C语言,此时会生成一个gcn.c文件。注意要加--embed

cython gcn.py --embed

5、然后使用 C 编译器来编译gcn.c文件,此时会生成一个gcn.o文件:

gcc -c gcn.c `python3-config --includes` `python3-config --ldflags` -o gcn.o

6、链接生成可执行文件,此时会生成一个gcn可执行文件。注意这里-L后面改成你的路径:

gcc gcn.o -L/home/sxf/anaconda3/envs/dgl/lib  -lpython3.9 -o gcn

7、运行二进制可执行文件:

./gcn

8、如果报错:error while loading shared libraries: libpython3.9.so.1.0: cannot open shared object file: No such file or directory。就把这个so文件的路径包含进来,再重新执行步骤7。注意这里后面改成你的路径:

export LD_LIBRARY_PATH=/home/sxf/anaconda3/envs/dgl/lib/:$LD_LIBRARY_PATH 

9、最终效果:

注意:如果你有多个自定义的py文件要import进来,那么自定义的几个py文件需要转为so库文件,来被主文件调用。而如果只有一个py文件,就没有这个问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/273754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电商数据分析-03-电商数据采集

参考 最最最全数据仓库建设指南,速速收藏!! 第1章 数据仓库概念 数据仓库规划 1.1 数仓搭建 我们这里所说的数据仓库,是基于大数据体系的,里面包含标签类目,区别于传统的数据仓库。下面我们来将这张图分解…

信息网络协议基础-IPv6协议

文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…

元道经纬相机信息化赋能光伏电站运维管理

近年来,我国光伏产业高速发展,尤其以分布式光伏发电项目增长迅速,为更好服务新能源发电,大力推广电能替代。与此同时,电力企业亟需改变落后的管理模式,借助信息化软件提升管理效率。 为了进一步提升光伏电…

SpringBoot3 Web开发

注:SpringBoot的Web开发能力,由SpringMVC提供。 0. WebMvcAutoConfiguration原理 1. 生效条件 AutoConfiguration(after { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) …

大创项目推荐 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 …

信号与线性系统翻转课堂笔记12——时域取样定理

信号与线性系统翻转课堂笔记12 The Flipped Classroom12 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1)了解信号取样的概念&#xff1…

医院云HIS系统源码,saas多医院版,适用于专科医院、集团医院、基层医院

医院云HIS系统源码,自主研发,自主版权,电子病历病历4级 系统概述: 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统…

9.传统的轨道画线算法(完成)

轨道画线分为以下步骤: 1.读取摄像头图片 2.图片灰度处理,截取轨道区域的图片 3.中值滤波处理,并区域取均值后做期望差的绝对值。本人通过一些轨道图片实验,用这种方法二值化得到的效果比caany算子等方法的效果好 4.二值化后再…

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)

简介 实现跑马灯, 但一个个引脚的操作实在是有些繁琐, 本次使用GPIO_WritePin接口实现批量操作GPIO引脚实现LED跑马灯。电路原理图 LED灯电路 LED灯连接主控芯片引脚图 实现说明 stm32f1xx_hal_gpio.h 关于GPIO引脚的定义如下 /** defgroup GPIO_pins_define GPIO pins …

[Angular] 笔记 13:模板驱动表单 - 单选按钮

Radio Buttons (Template Driven Forms) Radio Button&#xff0c; input 元素类型全部为 radio&#xff0c;因为是单选&#xff0c;name 属性值必须相同。 pokemon-template-form.component.html: <form #form"ngForm">Pokemon Name:<input type"t…

2D transform 1-translate

移位&#xff1a;translate 缩放&#xff1a;scale 旋转&#xff1a;rotate 扭曲&#xff1a;skew <style>.outer {width: 200px;height: 200px;border: 2px solid black;margin-top: 100px;}.inner {width: 200px;height: 200px;background-color: pink;transform: t…

使用web_video_server进行网页段的视频传输

引言&#xff1a;在项目中&#xff0c;需要实现无人机摄像头采集到的图像回传到window下进行查看&#xff0c;为此&#xff0c;选择使用web_video_server功能包实现局域网下的图像传输 硬件环境&#xff1a; 硬件&#xff1a;Jetson orin nano 8G D435摄像头 环境&#xff…

vue3+elementPlus+cascader动态加载封装自定义组件+v-model指令实现父子通信

文章目录 select普通操作 &#xff08;1&#xff09;cascader操作&#xff08;2&#xff09; select普通操作 &#xff08;1&#xff09; 搜索条件需求&#xff1a;接口入参需要houseId&#xff0c;但是要先选择完楼栋&#xff0c;再选择单元&#xff0c;最后选择房屋 如图&a…

k8s的二进制部署(一)

k8s的二进制部署&#xff1a;源码包部署 环境&#xff1a; k8smaster01: 20.0.0.71 kube-apiserver kube-controller-manager kube-schedule ETCD k8smaster02: 20.0.0.72 kube-apiserver kube-controller-manager kube-schedule Node节点01: 20.0.0.73 kubelet kube-pr…

GrayLog日志平台的基本使用-ssh接入Dashboards展示

这里使用的版本为graylog4.2.10 1、一键安装graylog4.2.10&#xff0c;解压zip包&#xff0c;执行脚本就行 链接&#xff1a;https://pan.baidu.com/s/11U7GpBZ1B7PXR8pyWVcHNw?pwdudln 提取码&#xff1a;udln 2、通过rsyslog采集系统日志&#xff0c;具体操作参考前面文…

饮用水中的砷、硝酸盐含量超标,离子交换工艺分享

随着人们对健康和生活质量的日益关注&#xff0c;饮用水安全问题成为了社会关注的焦点。在自然水体中的含量往往较高&#xff0c;而这些物质对人体健康存在一定的潜在风险。因此&#xff0c;饮用水处理中如何有效去除溴酸盐和硝酸盐&#xff0c;成为了当前水处理行业的重要课题…

CTFshow-pwn入门-栈溢出pwn39-pwn40

pwn39 首先我们还是先将二级制文件托到虚拟机里面查看文件的保护信息。 chmod x pwn checksec pwn文件依然是只开启了栈不可执行&#xff0c;canary和pie都没开。并且该文件是32位的&#xff0c;那我们就托到ida32中反编译一下吧。 int __cdecl main(int argc, const char **…

LSTM的记忆能力实验 [HBU]

目录 模型构建 LSTM层 模型训练 多组训练 模型评价 模型在不同长度的数据集上的准确率变化图 模型汇总 总结 长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的…

go 源码解读 - sync.Mutex

sync.Mutex mutex简介mutex 方法源码标志位获取锁LocklockSlowUnlock怎么 调度 goroutineruntime 方法 mutex简介 mutex 是 一种实现互斥的同步原语。&#xff08;go-version 1.21&#xff09; &#xff08;还涉及到Go运行时的内部机制&#xff09;mutex 方法 Lock() 方法用于…

nodejs业务分层如何写后端接口

这里展示的是在node express 项目中的操作 &#xff0c;数据库使用的是MongoDB&#xff0c;前期关于express和MongoDB的文章可访问&#xff1a; Nodejs后端express框架 server后端接口操作&#xff1a;通过路由匹配——>调用对应的 Controller——>进行 Service调用——&…
最新文章