使用pytorch深度学习框架搭建神经网络

简介

现在主流有两个框架pytorch和TensorFlow,本文主要介绍pytorch

  • PyTorch:由 Facebook 的人工智能研究小组开发和维护。PyTorch 以其动态计算图(Dynamic Computational Graph)和易用性著称,非常适合研究人员和开发者进行实验和快速原型开发。
  • TensorFlow:由 Google 开发和维护。TensorFlow 是一个更加成熟和全面的框架,支持大规模的生产环境部署,特别是在云计算和分布式计算方面具有优势。

然后介绍两个小工具:

dir()打开该包,看看里面有什么东西;如果IDE使用的是pycharm的话,按住Ctrl直接跳转,输入函数的参数的时候按住Ctrl+P可以看需要填哪些参数

help()官方解释文档,教你如何使用该工具

神经网络搭建步骤

数据集介绍

 数据集为CIFAR10,

CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成,每个类有 6000 张图像。有 50000 张训练图像和 10000 张测试图像。图像大小为3x32x32

数据集分为 5 个训练批次和 1 个测试批次,每个批次有 10000 张图像。测试批次包含每个类中随机选择的 1000 张图像。训练批次包含按随机顺序排列的剩余图像,但某些训练批次可能包含来自一个类的图像多于另一个类的图像。在它们之间,训练批次正好包含来自每个类的 5000 张图像。

以下是数据集中的类,以及每个类的 10 张随机图像:

运行下列代码会导入数据集,没有下载的会自动下载

datasets导入数据集

dataloader分发数据,每批次送入64图片进入网络训练

transform更改图片数据的类型,比如将PIL改成tensor类型

train_data = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)
test = train_data.classes
print(test)
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

搭建网络 

由官网可知(官网链接:PyTorch documentation — PyTorch 2.4 documentation),使用pytorch搭建网络至少需要重写2个函数,一个__init__() 初始化函数,另一个forward()前向传播函数,下图为官网截图:

按照官网给的例子我们重写,我们的网络结构如下图所示 

网络结构如下图所示

代码思路:输入:3x32x32--->最后输出10个参数,具体过程如下图所示:

 二维卷积参数计算公式如下图,根据输入输出计算padding和stride

代码实现

使用sequential()

class Wisdom(nn.Module):
    def __init__(self):
        super(Wisdom, self).__init__()
        self.model1 = Sequential(
            nn.Conv2d(3, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),
            nn.Linear(64, 10)

        )

    def forward(self, x):
        x = self.model1(x)

        return x

 不使用sequential()

class Wisdom(nn.Module):
    def __init__(self):
        super(Wisdom, self).__init__()
        self.conv1=Conv2d(3,32,5,padding=2)
        self.maxpool1=MaxPool2d(2)
        self.conv2=Conv2d(32,32,5,padding=2)
        self.maxpool2=MaxPool2d(2)
        self.conv3=Conv2d(32,64,5,padding=2)
        self.maxpool3=MaxPool2d(2)
        self.flatten=Flatten()
        self.linear1=Linear(1024,64)
        self.linear2= Linear(64, 10)

    def forward(self,x):
        x=self.conv1(x)
        x=self.maxpool1(x)
        x=self.conv2(x)
        x=self.maxpool2(x)
        x=self.conv3(x)
        x=self.maxpool3(x)
        x=self.flatten(x)
        x=self.linear1(x)
        x=self.linear2(x)

        return x

实例化神经网络对象,损失函数,优化器

#创建神经网络
wisdom = Wisdom()
wisdom=wisdom.cuda()
#损失函数
loss_fn= nn.CrossEntropyLoss()
loss_fn=loss_fn.cuda()
#优化器
learn_rate =0.01
optimizer = torch.optim.SGD(wisdom.parameters(),lr=learn_rate)

损失函数(Loss Function)

常见的损失函数包括:

选择哪种损失函数取决于具体的任务和模型类型。在训练过程中,目标是最小化损失函数的值,从而提高模型的预测准确性。

优化器

优化器(Optimizer)是机器学习中用于调整模型参数以最小化损失函数的算法。优化器通过迭代过程逐步更新模型的权重和偏置,以找到损失函数的最小值。以下是一些常用的优化器:

设置网络参数

使用writer = SummaryWriter("logs_train")可以可视化整个训练过程
#设置网络的一些参数
#记录的训练次数
total_train_step = 0
#记录测试次数
total_test_step = 0
#训练的轮数
epoch=10
#添加tensorboard
writer = SummaryWriter("logs_train")

 训练和验证网络并将重要信息可视化屏幕

重要代码解析:

wisdom.train()标志网络进入训练状态

loss = loss_fn(outputs,targets)计算损失函数

optimizer.zero_grad() 梯度置零,防止上个梯度对本轮训练产生影响
loss.backward()反向传播
optimizer.step()梯度更新

wisdom.eval()模型进入测试状态

将损失值和精度闯入writer并绘制曲线图

writer.add_scalar("test_loss", total_test_loss, total_test_step) writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)

torch.save(wisdom,"./model_train/wisdom_{}.pth".format(i))保存训练好模型
for i in range(epoch):
    print("----第{}轮开始----".format(i+1))
    #开始训练
    #进入训练状态
    wisdom.train()

    for data in train_dataloader:
        imgs,targets = data
        imgs=imgs.cuda()
        targets=targets.cuda()
        outputs = wisdom(imgs)
        loss = loss_fn(outputs,targets)
        #优化器调优
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        total_train_step += 1
        if total_train_step % 100 ==0:
            print("训练次数:{},loss:{}:".format(total_train_step,loss))
            writer.add_scalar("train_loss",loss.item(),total_train_step)

    #模型测试
    #模型进入测试状态
    wisdom.eval()
    total_test_loss=0
    total_accuracy = 0
    with torch.no_grad():# 提高推理速度和节省内存
        for data in test_dataloader:
            imgs,targets = data
            imgs = imgs.cuda()
            targets = targets.cuda()
            outputs = wisdom(imgs )
            loss = loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy = (outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy

    print("整体测试集合的loss:{}".format(total_test_loss))
    print("整体测试集合的准确率:{}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)
    total_test_step +=1

    torch.save(wisdom,"./model_train/wisdom_{}.pth".format(i))
    print("模型已经保存!")
    #torch.save(wisdom.state_dict(),"./model_train/wisdom_{}.pth".format(i))
writer.close()

使用GPU加速训练

确保电脑有显卡并正确安装驱动,而且要正确下载对应cuda 

下载教程:

进入pytorch官网

根据自己的系统选择,一般使用anaconda 在Windows下进行python环境管理,复制红框部分,在Anaconda Prompt 粘贴运行,注意自己的cuda版本是否支持

查看cuda版本,打开英伟达控制面板,桌面右键或者系统右下角,然后点击系统信息,之后点击组件

GPU程序设置

在神经网络,损失函数的实例对象后加.cuda()即可,以及在图片数据后加.cuda()

wisdom=wisdom.cuda()
loss_fn=loss_fn.cuda()
imgs=imgs.cuda()
targets=targets.cuda()

 保存模型

torch.save(wisdom,"./model_train/wisdom_{}.pth".format(i))

使用训练好的网络进行分类任务

加载网络模型

model = torch.load("./model_train/wisdom_49.pth")

若出现runtime error 将模型加载方式换成下列语句,将GPU训练的模型映射到CPU

出现runtimer error 将模型加载方式换成下列语句,将GPU训练的模型映射到CPU

或者将分类的图片进行cuda加速

image = image.cuda()#使用GPU训练的模型需要加CUDA

 使用SummaryWriter使训练可视化

打开Anaconda Prompt再激活环境后运行下列命令:

tensorboard --logdir "D:\pyc_workspace\learn_pytorch\logs_train

上列的地址根据train.py代码中的这个语句确定

writer = SummaryWriter("logs_train")

一定要改成自己的文件地址,具体操作见下图

可视化结果如下图所示

最后解释一个语句,with torch.no_grad()提高推理速度和节省内存

with torch.no_grad():# 提高推理速度和节省内存
        for data in test_dataloader:
            imgs,targets = data
            imgs = imgs.cuda()
            targets = targets.cuda()
            outputs = wisdom(imgs )
            loss = loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy = (outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy

程序汇总 

train.py

使用cpu训练网络

import torchvision
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

from model import *

train_data = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)

test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

#length长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练集长度:{}".format(train_data_size))
print("测试集长度:{}".format(test_data_size))

#使用dataloader加载数据集
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

#创建神经网络
wisdom = Wisdom()
#损失函数
loss_fn= nn.CrossEntropyLoss()
#优化器
learn_rate =0.01
optimizer = torch.optim.SGD(wisdom.parameters(),lr=learn_rate)

#设置网络的一些参数
#记录的训练次数
total_train_step = 0
#记录测试次数
total_test_step = 0
#训练的轮数
epoch=10
#添加tensorboard
writer = SummaryWriter("logs_train")
#tensorboard --logdir "D:\pyc_workspace\learn_pytorch\logs_train"

for i in range(epoch):
    print("----第{}轮开始----".format(i+1))
    #开始训练
    #进入训练状态
    wisdom.train()

    for data in train_dataloader:
        imgs,targets = data
        outputs = wisdom(imgs)
        loss = loss_fn(outputs,targets)
        #优化器调优
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        total_train_step += 1
        if total_train_step % 100 ==0:
            print("训练次数:{},loss:{}:".format(total_train_step,loss))
            writer.add_scalar("train_loss",loss.item(),total_train_step)

    #模型测试
    #模型进入测试状态
    wisdom.eval()
    total_test_loss=0
    total_accuracy = 0
    with torch.no_grad():
        for data in test_dataloader:
            imgs,targets = data
            outputs = wisdom(imgs )
            loss = loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy = (outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy

    print("整体测试集合的loss:{}".format(total_test_loss))
    print("整体测试集合的准确率:{}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)
    total_test_step +=1

    torch.save(wisdom,"./model_train/wisdom_{}.pth".format(i))
    print("模型已经保存!")
    #torch.save(wisdom.state_dict(),"./model_train/wisdom_{}.pth".format(i))
writer.close()

train_gpu.py 

使用GPU训练网络

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter


train_data = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)
test = train_data.classes
print(test)
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

class Wisdom(nn.Module):
    def __init__(self):
        super(Wisdom, self).__init__()
        self.model1 = Sequential(
            nn.Conv2d(3, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),
            nn.Linear(64, 10)

        )

    def forward(self, x):
        x = self.model1(x)

        return x

#length长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练集长度:{}".format(train_data_size))
print("测试集长度:{}".format(test_data_size))

#使用dataloader加载数据集
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

#创建神经网络
wisdom = Wisdom()
wisdom=wisdom.cuda()
#损失函数
loss_fn= nn.CrossEntropyLoss()
loss_fn=loss_fn.cuda()
#优化器
learn_rate =0.01
optimizer = torch.optim.SGD(wisdom.parameters(),lr=learn_rate)

#设置网络的一些参数
#记录的训练次数
total_train_step = 0
#记录测试次数
total_test_step = 0
#训练的轮数
epoch=10
#添加tensorboard
writer = SummaryWriter("logs_train")
#tensorboard --logdir "D:\pyc_workspace\learn_pytorch\logs_train"

for i in range(epoch):
    print("----第{}轮开始----".format(i+1))
    #开始训练
    #进入训练状态
    wisdom.train()

    for data in train_dataloader:
        imgs,targets = data
        imgs=imgs.cuda()
        targets=targets.cuda()
        outputs = wisdom(imgs)
        loss = loss_fn(outputs,targets)
        #优化器调优
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        total_train_step += 1
        if total_train_step % 100 ==0:
            print("训练次数:{},loss:{}:".format(total_train_step,loss))
            writer.add_scalar("train_loss",loss.item(),total_train_step)

    #模型测试
    #模型进入测试状态
    wisdom.eval()
    total_test_loss=0
    total_accuracy = 0
    with torch.no_grad():# 提高推理速度和节省内存
        for data in test_dataloader:
            imgs,targets = data
            imgs = imgs.cuda()
            targets = targets.cuda()
            outputs = wisdom(imgs )
            loss = loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy = (outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy

    print("整体测试集合的loss:{}".format(total_test_loss))
    print("整体测试集合的准确率:{}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step)
    total_test_step +=1

    torch.save(wisdom,"./model_train/wisdom_{}.pth".format(i))
    print("模型已经保存!")
    #torch.save(wisdom.state_dict(),"./model_train/wisdom_{}.pth".format(i))
writer.close()

test.py

利用神经网络模型进行分类,记得把

img_path ="dog.jpg"改成自己的路径
import torch
import torchvision
from PIL import Image
from torch import nn
from torch.nn import Sequential

train_data = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)
classes_list = train_data.classes#分类物体列表

img_path ="dog.jpg"
# img_path ="airplane.jpg"
image = Image.open(img_path)
#image = image.convert("RGB")#只保留为3通道

transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32,)),torchvision.transforms.ToTensor()])
image = transform(image)
print(image.shape)
class Wisdom(nn.Module):
    def __init__(self):
        super(Wisdom, self).__init__()
        self.model1 = Sequential(
            nn.Conv2d(3, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024, 64),
            nn.Linear(64, 10)

        )

    def forward(self, x):
        x = self.model1(x)

        return x

#加载网络模型
model = torch.load("./model_train/wisdom_49.pth")
#出现runtimer error 将模型加载方式换成下列语句,将GPU训练的模型映射到CPU
#model = torch.load("./model_train/wisdom_9.pth",map_location=torch.device("cpu"))
print(model)

image=torch.reshape(image,(1,3,32,32))#增加batch_size维度
model.eval()
with torch.no_grad():
    image = image.cuda()#使用GPU训练的模型需要加CUDA
    output = model(image)
print(output)
classes_index=output.argmax(1).item()
print(classes_list)

print("测试图片为:{}".format(classes_list[classes_index]))

总结:------>多看官网 <------

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

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

相关文章

小皮面板webman ai项目本地启动教程

1.前置条件 下载小皮面板 下载后&#xff0c;双击安装&#xff0c;一路next&#xff08;下一步&#xff09;&#xff0c;无需更改配置。 2.安装必须软件 在小皮面板的软件管理页&#xff0c;安装编号①②③④下面四个软件。 3.启动本地服务 进入到小皮面板的首页&#x…

深入学习电路基础:从理论到实践

引言 电路是电子学的核心&#xff0c;也是现代科技的基石。从简单的灯泡开关到复杂的计算机处理器&#xff0c;电路在各类电子设备中都起到了至关重要的作用。深入学习电路知识不仅有助于理解电子设备的工作原理&#xff0c;还能够为实际设计和开发电子产品打下坚实的基础。 …

ARP协议(原理,特点,报文格式,具体过程),ARP缓存(有效时间,为什么),ARP欺骗(定向断网,成为中间人),RARP简单介绍

目录 ARP协议 引入 介绍 原理 arp请求/响应 特点 报文格式 硬件类型 协议类型 硬件/协议地址长度 op(操作码) 过程 发送请求并处理 返回响应并处理 总结 arp缓存 介绍 arp表项的有效时间 解释 arp欺骗 介绍 定向断网 基于arp的成为中间人的方式 多向…

有什么简单方便的cad编辑器?2024快速进行cad编辑的软件合集

有什么简单方便的cad编辑器&#xff1f;2024快速进行cad编辑的软件合集 在建筑、工程、设计等领域&#xff0c;CAD&#xff08;计算机辅助设计&#xff09;软件是必不可少的工具。然而&#xff0c;面对复杂的CAD文件&#xff0c;有时我们只需要简单的编辑功能&#xff0c;而不…

工厂模式-小记

工厂模式-小记 工厂模式简单工厂模式场景复现抽象产品接口具体产品工厂类测试方法 工厂方法模式工厂方法模式场景描述抽象工厂接口具体工厂抽象产品具体产品客户端测试 抽象工厂模式场景描述抽象工厂具体工厂抽象产品具体产品客户端测试 三者的对比 工厂模式 工厂模式提供了一…

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。此题涉及对一个动态系统的建模&#xff0c;模拟…

策略模式的小记

策略模式 策略模式支付系统【场景再现】硬编码完成不同的支付策略使用策略模式&#xff0c;对比不同&#xff08;1&#xff09;支付策略接口&#xff08;2&#xff09;具体的支付策略类&#xff08;3&#xff09;上下文&#xff08;4&#xff09;客户端&#xff08;5&#xff0…

vue3获取视频时长、码率、格式等视频详细信息

前言&#xff1a; 我们在上传视频需要视频的帧数等信息的时候&#xff0c;上传组件无法直接读取帧数等信息 方法&#xff1a;通过mediainfo.js来获取视频的帧率、总帧数和视频的总时长 mediainfo.js地址&#xff0c;想详细了解的可以去看看git地址&#xff1a;https://githu…

【生日视频制作】海上绿色摩托艇汽车艇车身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程海上绿色摩托艇汽车艇车身AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板替换工程 怎么如何做的【生日视频制作】海上绿色摩托艇汽车艇车身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模…

Java笔试面试题AI答之JDBC(2)

文章目录 7. 列出Java应该遵循的JDBC最佳实践&#xff1f;8. Statement与PreparedStatement的区别,什么是SQL注入&#xff0c;如何防止SQL注入Statement与PreparedStatement的区别什么是SQL注入如何防止SQL注入 9. JDBC如何连接数据库&#xff1f;1. 加载JDBC驱动程序2. 建立数…

基于FreeRTOS的STM32多功能手表

前言 项目背景 项目演示 使用到的硬件 项目原理图 目前版本实现的功能 设计到的freertos知识 实现思路 代码讲解 初始化GPIO引脚、配置时钟 蜂鸣器初始化以及软件定时器创建 系统默认创建的defaultTaskHandle 创建七个Task&#xff0c;代表七个功能 ShowTimeTask …

MySQL复习2

高级查询 准备 create database greatselect; use greatselect;drop table if exists class; create table class (cid int(11) not null auto_increment,caption varchar(32) not null,primary key (cid) )engine innoDB AUTO_INCREMENT5 default charset utf8;create tab…

磁盘加密工具 | VeraCrypt v1.26.15 绿色版

VeraCrypt 是一个开源项目&#xff0c;旨在提供强大的加密解决方案&#xff0c;以创建和管理加密的磁盘分区和加密容器。它继承了著名的加密软件 TrueCrypt 的特性&#xff0c;并在此基础上进行了扩展和改进。 主要特性 1. 高级加密算法 VeraCrypt 支持多种加密算法&#xf…

运维学习————Jenkins(1)

目录 一、项目开发周期 二、jenkins的简介和作用 三、jenkins下载 1、使用war包安装 2、初始化配置 3、工作流程图 4、Jenkins安装配置maven和git maven git 5、jenkins安装插件 6、配置maven,git,jdk jdk配置 Git配置 Maven配置 四、修改tomcat的一些配置 五…

[网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

文章目录 一. 网络编程套接字TCP和UDP的特点有连接 vs 无连接可靠传输 vs 不可靠传输面向字节流 vs 面向数据报全双工 vs 半双工 二. java用UDP实现网络编程代码实现:运行代码:启动多个客户端别人能否使用?实现翻译功能 一. 网络编程套接字 网络编程套接字, 就是指操作系统提…

[000-01-008].Seata案例应用

业务说明&#xff1a;这里我们创建三个服务&#xff0c;一个订单服务&#xff0c;一个库存服务&#xff0c;一个账户服务。当用户下单时&#xff0c;会在订单服务中创建一个订单&#xff0c;然后通过远程调用库存服务来扣减下单商品的库存&#xff1b;再通过远程调用账户服务来…

AD7606工作原理以及FPGA控制验证(串行和并行模式)

文章目录 一、AD7606介绍二、AD7606采集原理2.1 AD7606功能框图2.2 AD7606管脚说明 三、AD7606并行模式时序分析以及实现3.1 并行模式时序图3.2 并行模式时序要求3.3 代码编写3.4 仿真观察 四、AD7606串行模式时序分析以及实现4.1 串行模式时序图4.2 串行模式时序要求4.3 代码编…

使用Cskin时候 遇到按钮有默认阴影问题解决

使用Cskin时候 遇到按钮有默认阴影 设置 DrawType 属性就可以了

全网最火的AI技术:GraphRag概念详解

GraphRAG是一种结合了知识图谱&#xff08;Knowledge Graph&#xff09;和大语言模型&#xff08;LLM&#xff09;的检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术&#xff0c;旨在通过将结构化和非结构化数据相结合来增强生成式AI的表现。它的…

[已更新问题二三matlab+python]2024数学建模国赛高教社杯C题:农作物的种植策略 思路代码文章助攻手把手保姆级

发布于9.6 10:00 有问题后续会修正!! 问题一代码展示: 问题二代码结果展示: 问题三代码展示: https://docs.qq.com/doc/DVVVlV0NmcnBDTlVJ问题一部分代码分享: #!/usr/bin/env python # coding: utf-8# In[15]:import pandas as pd# In[16]:# 读取Excel文件 file_path 附件2…