基于UNet算法的农业遥感图像语义分割——补充版
前言
本案例希望建立一个UNET网络模型
,来实现对农业遥感图像语义分割
的任务。本篇博客主要包括对上一篇博客中的相关遗留问题进行解决,并对网络结构进行优化调整以适应个人的硬件设施——NVIDIA GeForce RTX 3050。
本案例的前两篇博客直达链接基于UNet算法的农业遥感图像语义分割(下)和基于UNet算法的农业遥感图像语义分割(上)
1.模型简化
1.1 二分类语义分割效果解答
上一篇博客最终的预测结果为二分类的语义分割,即经过彩色映射后,结果只有黑和蓝两种颜色。原因是因为模型虽然参数更新了1400多次,但其实从遍历数据集的角度考虑也就65个epoch.
同时网络模型参数量约7.7M,模型并未充分学习到训练集上的信息。之所以会出现二分类的预测结果,是与模型初始化权重有关。
1.2网络模型调整
因此针对上述情况,我将模型改成了单层的编码器-解码器架构,同时将Block
模块中做进一步特征融合的卷积层移除,具体结构如下所示:
class Block(nn.Module):def __init__(self, in_channels, out_channels):super(Block, self).__init__()self.relu = nn.ReLU(inplace=False)self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)# self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)def forward(self, x):x = self.conv1(x)x = self.relu(x)# x = self.conv2(x)# x = self.relu(x)return xclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.relu = nn.ReLU(inplace=False)self.pool = nn.MaxPool2d(kernel_size=2, stride=2)# 编码器部分self.conv1 = Block(3, 32)# 解码器部分self.up2 = nn.ConvTranspose2d(32, 32, kernel_size=2, stride=2)self.conv2 = Block(32, 32)self.conv3 = nn.Conv2d(32, 4, kernel_size=1)def forward(self, x):# 编码器conv1 = self.conv1(x) # 32, 512, 512pool1 = self.pool(conv1) # 32, 256, 256# 解码器up2 = self.up2(pool1) # 32, 512, 512conv2 = self.conv2(up2) # 32, 512, 512conv3 = self.conv3(conv2) # 4, 512, 512return conv3
此时查看模型的信息如下所示:
模型的参数量已经减少至14.4k
,可以预见结果并不会很好。因为输入的图像尺寸就已经512×512×3
,相比而言,该模型显然不能充分拟合该任务。
2.训练策略调整
2.1训练损失波动解答
因为统计的损失是按照每个iter
进行统计的,每次的迭代过程在该批次下的参数更新朝着当前批次损失变小的方向进行,但对其他批次可能损失会升高,因此损失波动剧烈,但整体呈下降趋势。
这里的解决方案如下:
- 将参数更新过程中记录的iter次数进行减少,如
将iter%10==0调整成iter%200==0
- 将参数更新过程中的记录的结果转换成累积量,即将10个iter中损失进行累加或者将一个epoch中的所有损失进行累加(本案例后续改进采用该方式)。
- 将参数更新过程中的记录的结果转换成平均量,即将10个iter中损失进行平均或者将一个epoch中的所有损失进行平均。
2.2训练过程调整
因为本案例的数据集本身就很小,所以这里采用的是将一个epoch中的所有损失进行累加统计进行输出可视化。同时为了避免模型参数保存冗余问题,将模型保存策略进行调整,只保存在验证集上损失最小的模型,同时使用覆盖原则将之前的保存模型进行覆盖,以节省空间开销,具体代码调整如下:
# 创建一个 SummaryWriter 对象,用于将数据写入 TensorBoardwriter = SummaryWriter("dataset/logs")epoch = 0best_val_loss = float('inf')# best_val_loss = 7.899# model.load_state_dict(torch.load('./models/secweights_40.pth'))while epoch < 500:epoch += 1print("---------第{}轮训练开始---------".format(epoch))train_loss = 0for i, (img, label) in tqdm(enumerate(dataloader_train)):img = img.to(device).float()label = label.long().to(device)model.train()output = model(img)# output = torch.argmax(output, dim=1).double()# iter_num += 1loss = getLoss(output, label)train_loss += loss.item()loss.backward()optimizer.step()optimizer.zero_grad()# print("---------第{}轮训练结束---------".format(epoch))print("第{}轮训练的损失为:{}".format(epoch, train_loss))writer.add_scalar('Training Loss3', train_loss, epoch)if epoch % 10 == 0:# torch.save(model.state_dict(), './models/thirdweights_{}.pth'.format(epoch))val_loss = 0with torch.no_grad():model.eval()for i, (img, label) in tqdm(enumerate(dataloader_val)):img = img.to(device).float()label = label.long().to(device)output = model(img)loss = getLoss(output, label)val_loss += loss.item()print("第{}轮验证的损失为:{}".format(epoch, val_loss))if val_loss < best_val_loss:best_val_loss = val_losstorch.save(model.state_dict(), './models/best_model2.pth')print("Saved new best model")writer.add_scalar('Validation Loss3', val_loss, epoch)writer.close()
3.结果分析
3.1训练过程损失
在训练过程中的损失记录如下:
通过结果可以看出上述修改方式确实取得了不错的效果,模型训练集的抖动已大幅度减小。
从曲线角度考虑,训练集损失已经趋向于平稳,同时验证集上损失也趋向于平稳,由此判断模型已经基本收敛,但训练集的损失仍停留在较高水平,大概率是因为模型过于简单,难以拟合该任务的需求。
3.2模型预测结果
这里将模型最终保存的结果加载进来,对未知图片进行预测,代码如下:
import matplotlib.pyplot as plt
import torch
import cv2
import numpy as np
from torch.utils.tensorboard import SummaryWriterfrom Net2 import Net# I=cv2.imread('dataset/0.9/image/16213.png')#dataset/test.png
I=cv2.imread('dataset/test.png')
I=np.transpose(I, (2, 0, 1))
I=I/255.0
I=I.reshape(1,3,512,512)
I=torch.tensor(I)
model=Net().double()
model.load_state_dict(torch.load('models/best_model2.pth'))
output=model(I)
# print(output.shape)
# print(output[0,:,:5,:5])
predicted_classes = torch.argmax(output, dim=1).squeeze(0).numpy()color_map = {0: [0, 0, 0], # 黑色1: [255, 0, 0], # 红色2: [0, 255, 0], # 绿色3: [0, 0, 255] # 蓝色
}height, width = predicted_classes.shape
colored_image = np.zeros((height, width, 3), dtype=np.uint8)
for i in range(height):for j in range(width):class_id = predicted_classes[i, j]colored_image[i, j] = color_map[class_id]plt.imshow(colored_image)
plt.axis('off')
plt.show()
print(colored_image.shape)
colored_image=np.transpose(colored_image, (2, 0, 1))
writer=SummaryWriter('dataset/logs')writer.add_image('test3',colored_image)
writer.close()
预测结果如下:
从结果角度考虑,确实实现了四分类的语义分割效果,但预测的效果并不是很好,因此需要进一步修改网络结构。
4.网络模型优化
具体修改主要包括引入批量规范化BatchNormalization
的处理和增加了Dropout的机制
以及对网络结构调整为三层的编码器-解码器架构。
4.1 BatchNormalization
批量规范化的核心思想是对每一层的输入进行归一化处理,使得每一层的输入分布在训练过程中保持相对稳定。具体来说,它将输入数据的每个特征维度都归一化到均值为 0、方差为 1 的标准正态分布。这样可以减少内部协变量偏移的影响,加快训练速度。
这里还有其他的逐层归一化方式,这里不做详细介绍。因为BatchNormalization聚焦于小批量层面,更适用于该任务,或者说更适用视觉图像处理方面
图片来源:本校《深度学习》课程的PPT
4.2 Dropout的机制
Dropout的机制
能有效防止过拟合,在训练神经网络时,它通过以一定的概率随机将神经元的输出设置为0,即暂时“丢弃”这些神经元及其连接,每次迭代训练时在训练一个不同的子网络
,通过多个子网络的综合效果来提高模型的泛化能力。类似于基学习器
和集成学习
的思想。
4.3网络模型代码
上述的两种方式是针对Block模块
的,这里为了更好的拟合语义分割的任务,需要进一步加深网络结构,考虑到硬件资源有限,于是使用的是三层编码器-解码器架构,修改后的网络模型完整代码如下:
class Block(nn.Module):def __init__(self, in_channels, out_channels, dropout_rate=0.1):super(Block, self).__init__()self.relu = nn.ReLU(inplace=False)self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(out_channels)self.dropout1 = nn.Dropout2d(p=dropout_rate)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(out_channels)self.dropout2 = nn.Dropout2d(p=dropout_rate)def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.dropout1(x)x = self.conv2(x)x = self.bn2(x)x = self.relu(x)x = self.dropout2(x)return xclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.relu = nn.ReLU(inplace=False)self.pool = nn.MaxPool2d(kernel_size=2, stride=2)# 编码器部分self.conv1 = Block(3, 32)self.conv2 = Block(32, 64)self.conv3 = Block(64, 128)# 解码器部分self.up4 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2)self.conv4 = Block(128, 64)self.up5 = nn.ConvTranspose2d(64, 32, kernel_size=2, stride=2)self.conv5 = Block(64, 32)self.conv6 = nn.Conv2d(32, 4, kernel_size=1)def forward(self, x):# 编码器conv1 = self.conv1(x) # 32, 512, 512pool1 = self.pool(conv1) # 32, 256, 256conv2 = self.conv2(pool1) # 64, 256, 256pool2 = self.pool(conv2) # 64, 128, 128conv3 = self.conv3(pool2) # 128, 128, 128# 解码器up4 = self.up4(conv3) # 64, 256, 256conv4 = torch.cat([up4, conv2], dim=1) # 128, 256, 256conv4 = self.conv4(conv4) # 64, 256, 256up5 = self.up5(conv4) # 32, 512, 512conv5 = torch.cat([up5, conv1], dim=1) # 64, 512, 512conv5 = self.conv5(conv5) # 32, 512, 512conv6 = self.conv6(conv5) # 4, 512, 512return conv6
5.改进模型结果分析
训练策略和之前保持不变,这里就不重复解释,只对结果进行说明。
5.1训练过程损失
训练过程损失记录如下:
通过结果看到,训练集和验证集损失也基本趋于平稳,因此判断模型基本收敛。
5.2模型预测结果
将之前训练好的模型参数加载进来,对未知图片进行预测,结果如下:
通过结果可以看出,预测结果相对于之前有了很大的改善,基本实现了语义分割的效果,只是在微小内容上,识别的并不准确。可能是因为模型还是不够复杂,不足以拟合该任务。
6.结语
至此,基于UNET算法的农业遥感图像语义分割任务到此结束,期望能够对你有所帮助。同时该项目也是我接触的第一个语义分割项目,解释的如有不足还请批评指出!!!
相关文章:
基于UNet算法的农业遥感图像语义分割——补充版
前言 本案例希望建立一个UNET网络模型,来实现对农业遥感图像语义分割的任务。本篇博客主要包括对上一篇博客中的相关遗留问题进行解决,并对网络结构进行优化调整以适应个人的硬件设施——NVIDIA GeForce RTX 3050。 本案例的前两篇博客直达链接基于UNe…...
分布式数字身份:迈向Web3.0世界的通行证 | 北京行活动预告
数字经济浪潮奔涌向前,Web3.0发展方兴未艾,分布式数字身份(Decentralized Identity,简称DID)通过将分布式账本技术与身份治理相融合,在Web3.0时代多方协作的分布式应用场景中发挥核心作用,是构建…...
CentOS网络之network和NetworkManager深度解析
文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段(CentOS 5-6)1.2 过渡期(CentOS 7)1.3 新时代(CentOS 8) 2. network和NetworkManager的核心区别3. ne…...
【XR】MR芯片 和 VR芯片之争
【XR】MR芯片 和 VR芯片之争 1. MR芯片 和 VR芯片 之间的最大差异是什么2. MR芯片 和 VR芯片 之间的最大差异是什么,国内外市场上有哪些芯片,价格如何,市场怎么样,芯片价格怎么样1. MR芯片 和 VR芯片 之间的最大差异是什么 MR芯片(混合现实芯片)与VR芯片(虚拟现实芯片)…...
关于安卓自动化打包docker+jenkins实现
背景 安卓开发过程中,尤其是提测后,会有一个发包的流程。这个流程简单来说,一般都是开发打包,然后发群里,测试再下载,发送到分发平台,然后把分发平台的应用主页发出来,最后群里面的…...
如何使用CAN分析仪验证MCU CAN错误机制
本文通过实验验证CAN控制器的错误处理机制是否符合相关标准。具体而言,我们使用ZPS-CANFD设备(ZPS-CANFD介绍)作为测量工具,USBCANFD-200U作为被测设备(DUT),通过注入特定类型的错误,…...
Centos 7安装 NVIDIA CUDA Toolkit
下载 # 查看操作系统信息 uname -m && cat /etc/redhat-release # 查看显卡信息 lspci | grep -i nvidia从NVIDIA CUDA Toolkit官网下载符合你需求的版本,我这里选择的是runfile(local)的方式。 安装 现在完成后进行安装 chmod x cuda_12.4.0_550.54.1…...
软件测试52讲学习分享:深入理解单元测试
课程背景 最近我在学习极客时间的《软件测试52讲》课程,这是由腾讯TEG基础架构部T4级专家茹炳晟老师主讲的认证课程。作为数字化转型与人工智能(DTAI)产业人才基地建设中心的认证课程,内容非常专业实用。今天想和大家分享第3讲"什么是单元测试&…...
90.如何将Maui应用安装到手机(最简) C#例子 Maui例子
今天我来分享一下如何将Maui应用安装到手机上进行测试。 首先,创建一个新的Maui应用项目。 点击运行 在Visual Studio中,点击“运行”按钮,预览应用的初始效果,确保一切正常。 连接设备 使用数据线将手机连接到电脑。确保手机已…...
“100% 成功的 PyTorch CUDA GPU 支持” 安装攻略
#工作记录 一、总述 在深度学习领域,PyTorch 凭借其灵活性和强大的功能,成为了众多开发者和研究者的首选框架。而 CUDA GPU 支持能够显著加速 PyTorch 的计算过程,大幅提升训练和推理效率。然而,安装带有 CUDA GPU 支持的 PyTor…...
如何在Dify沙盒中安装运行pandas、numpy
如何在Dify沙盒中安装运行pandas、numpy 1. 创建python-requirements.txt文件2. 创建config.yaml文件3. 重启 docker-sandbox-14. 为什么要这样改的一些代码解析(Youtube视频截图) 1. 创建python-requirements.txt文件 在 Dify 的 Docker 目录下面&…...
ES集群搭建及工具类
文章说明 本文主要记录Windows下搭建ES集群的过程,并提供了一个通用的ES工具类;工具类采用http接口调用es功能,目前仅提供了简单的查询功能,可在基础上额外扩展 集群搭建 ES的下载安装非常简单,只需要下载软件的 zip 压…...
抓取工具Charles配置教程(mac电脑+ios手机)
mac电脑上的配置 1. 下载最新版本的Charles 2. 按照以下截图进行配置 2.1 端口号配置: 2.2 https配置 3. mac端证书配置 4. IOS手机端网络配置 4.1 先查看电脑上的配置 4.2 配置手机网络 连接和电脑同一个wifi,然后按照以下截图进行配置 5. 手机端证书…...
JavaScript 代码搜索框
1. 概述与需求分析 功能:在网页中实时搜索用户代码、关键字;展示匹配行、文件名;支持高亮、正则、模糊匹配。非功能:大文件集(几十万行)、高并发、响应 <100ms;支持增量索引和热更新。 2. …...
ESP32开发-作为TCP服务端接收数据
ESP32 ENC28J60 仅作为TCP服务端 (电脑通过 网络调试助手 连接ESP32,实现双向通信) 完整代码 #include <SPI.h> #include <EthernetENC.h> // 或 UIPEthernet.h// 网络配置 byte mac[] {0xDE, 0xAD…...
数智化招标采购系统针对供应商管理解决方案(采购如何管控供应商)
随着《优化营商环境条例》深化实施,采购领域正通过政策驱动和技术赋能,全面构建供应商全生命周期管理体系,以规范化、数智化推动采购生态向透明、高效、智能方向持续升级。 郑州信源数智化招标采购系统研发商,通过供应商管理子系…...
服务端字符过滤 与 SQL PDO防注入
注入示例 # step 1 SQL SELECT * FROM users WHERE username admin AND password e10adc3949ba59abbe56e057f20f883e # step 2 SQL SELECT * FROM users WHERE username admin# AND password 96e79218965eb72c92a549dd5a330112 关键点是这2个SQL的区别.其中第二步由于前台传…...
章越科技赋能消防训练体征监测与安全保障,从传统模式到智能跃迁的实践探索
引言:智能化转型浪潮下,消防训练的“破局”之需 2021年《“十四五”国家消防工作规划》的出台,标志着我国消防救援体系正式迈入“全灾种、大应急”的全新阶段。面对地震、洪涝、危化品泄漏等复杂救援场景,消防员不仅需要更强的体…...
RSYSLOG收集深信服log
RSYSLOG收集深信服ATRUST日志配置一直不成功,没有生成log文件,网上搜索到:如果你想要接收所有来自特定 IP 的日志,可以使用更通用的模式: 参考着修改配置 if $fromhost-ip 172.18.1.13 then /data/logs/network-devi…...
Golang - 实现文件管理服务器
先看效果: 代码如下: package mainimport ("fmt""html/template""log""net/http""os""path/filepath""strings" )// 配置根目录(根据需求修改) //var ba…...
在原生代码(非webpack)里使用iview的注意事项
最近公司在做一个项目,使用的框架是iview,使用过程中同事遇到一些问题,这些问题对于有些同学来说根本就不是问题,但总会有同学需要,为了帮助不太会用的同学快速找到问题,做了如下整理: 下载vue,iview.min.j…...
基于go的简单管理系统(增删改查)
package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" )var db *sql.DBtype user struct {id intname stringage int }// 建立连接 func initDB() (err error) {dsn : "root:123456tcp(127.0.0.1:3306)/mysqltes…...
Python 用一等函数重新审视“命令”设计模式
引言 在软件开发中,设计模式是解决常见问题的有效方法。“命令”设计模式旨在解耦调用操作的对象(调用者)和提供实现的对象(接收者)。本文将深入探讨“命令”模式,并介绍如何使用一等函数对其进行简化。 …...
pycharm导入同目录下文件未标红但报错ModuleNotFoundError
此贴仅为记录debug过程,为防后续再次遇见 问题 问题情境 复现文章模型,pycharm项目初次运行 问题描述 在导入同目录下其它文件夹中的python文件时,未标红,但运行时报错ModuleNotFoundError 报错信息 未找到该模块 Traceback …...
BOSS的收入 - 华为OD机试(A卷,Java题解)
华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 代码不懂有疑问欢迎留言或私我们的VX:code5bug。 题目描述 一个 XX 产品行销总公司,只有一个 boss,其有若干一级分销&…...
Qt:(创建项目)
目录 1. 使⽤QtCreator新建项⽬ 1.1 新建项⽬ 1.2 选择项⽬模板 1.3 选择项⽬路径 1.4 选择构建系统 1.5 填写类信息设置界⾯ 编辑 1.6 选择语⾔和翻译⽂件 1.6 选择Qt套件 1.7 选择版本控制系统 1.8 最终效果 1. 使⽤QtCreator新建项⽬ 1.1 新建项⽬ 打开Qt…...
网络原理 - 12(HTTP/HTTPS - 3 - 响应)
目录 认识“状态码”(status code) 200 OK 404 Not Found 403 Forbidden 405 Method Not Allowed 500 Internal Server Error 504 Gateway Timeout 302 Move temporarily 301 Moved Permanently 418 I am a teaport 状态码小结: …...
OpenCV 4.7企业级开发实战:从图像处理到目标检测的全方位指南
简介 OpenCV作为工业级计算机视觉开发的核心工具库,其4.7版本在图像处理、视频分析和深度学习模型推理方面实现了显著优化。 本文将从零开始,系统讲解OpenCV 4.7的核心特性和功能更新,同时结合企业级应用场景,提供详细代码示例和实战项目,帮助读者掌握从基础图像处理到复…...
QT6 源(63)篇六:阅读与注释 QString 这个类,包含了 QString 类的 完整源码,也附上 QLatin1String 类的
(9)给出完整的源代码: #ifndef QSTRING_H #define QSTRING_H//验证了,没有此宏定义的 #if 不成立 #if defined(QT_NO_CAST_FROM_ASCII) && defined(QT_RESTRICTED_CAST_FROM_ASCII) #error QT_NO_CAST_FROM_ASCII a…...
PixONE 六维力传感器:赋能 OEM 机器人,12 自由度精准感知
The PixONE,一款为OEM设计的多模态12自由度机器人传感器,以其卓越的性能和广泛的适用性,正引领着机器人传感技术的革新。这款传感器不仅外观精致,达到IP68防护等级,易于消毒,而且其中心的大孔设计使得电缆和…...
nginx 解决跨域问题
本地用 8080 端口启动的服务访问后台API有跨域问题, from origin http://localhost:8080 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: Redirect is not allowed for a preflight request. 其实用 9021 端…...
私有知识库 Coco AI 实战(五):打造 ES 新特性查询助手
有了实战(四)的经验,再打造个 ES 新特性查询助手就非常简单了。新的小助手使用的数据还是 ES 官方文档,模型设置也可沿用上次小助手的设置。 克隆小助手 我们进入 Coco Server 首页小助手菜单,选择“ES 索引参数查询…...
2025 新生 DL-FWI 培训
摘要: 本贴给出 8 次讨论式培训的提纲, 每次培训 1 小时. Basic concepts 1.1 Sesmic data processing – regular process 1.2 Full waveform inversion 1.3 Deep learning full waveform inversion Network structure 2.1 InversionNet Encoder-decorder structure 2.2 FCNV…...
VR汽车线束:汽车制造的新变革
汽车线束,作为汽车电路网络的主体,宛如汽车的 “神经网络”,承担着连接汽车各个部件、传输电力与信号的重任,对汽车的正常运行起着关键作用。从汽车的发动机到仪表盘,从传感器到各类电子设备,无一不是通过线…...
Centos离线安装Docker(无坑版)
1、下载并上传docker离线安装包 官方地址:安装包下载 2、上传到离线安装的服务器解压 tar -zxvf docker-28.1.1.tgz#拷贝解压二进制文件到相关目录 cp docker/* /usr/bin/ 3、创建docker启动文件 cat << EOF > /usr/lib/systemd/system/docker.servic…...
JConsole监控centos服务器中的springboot的服务
场景 在centos服务器中,有一个aa.jar的springboot服务,我想用JConsole监控它的JVM情况,具体怎么实现。 配置 Spring Boot 应用以启用 JMX 在java应用启动项进行配置 java -Djava.rmi.server.hostname=服务器IP -Dcom.sun.management.jmxremote=true \ -Dcom.sun.managem…...
centos 安装jenkins
centos 安装jenkins 在 CentOS 上安装 Jenkins 是一个相对直接的过程。以下是一个逐步指南,帮助你安装 Jenkins: 步骤 1:安装 Java Jenkins 需要 Java 运行环境,因此首先确保你的系统上安装了 Java。你可以使用以下命令来安装 …...
M1 Mac pip3 install错误记录
M芯片mac pip install 错误记录 环境 M3芯片MacPython3.13.1pip 24.3.1 场景 安装 nacos-sdk-python 时安装失败 % pip3 install nacos-sdk-pythonerror: externally-managed-environment This environment is externally managed ╰─> To install Python packages sy…...
搭建基于 ChatGPT 的问答系统
对于开发者来说,如何能够基于 ChatGPT 搭建一个完整、全面的问答系统,是极具实战价值与实践意义的。 要搭建基于 ChatGPT 的完整问答系统,除去上一部分所讲述的如何构建 Prompt Engineering 外,还需 要完成多个额外的步骤。例如…...
「动态规划」线性DP:最长上升子序列(LIS)|编辑距离 / LeetCode 300|72(C++)
概述 DP,即动态规划是解决最优化问题的一类算法,我们要通过将原始问题分解成规模更小的、相似的子问题,通过求解这些易求解的子问题来计算原始问题。 线性DP是一类基本DP,我们来通过它感受DP算法的奥义。 最长上升子序列&#x…...
IP 地址和 MAC 地址是如何转换的
在计算机网络的世界里,IP 地址和 MAC 地址就像是网络设备的两个重要 “身份证”,各自承担着不同的职责。IP 地址基于网络层,用于在复杂的网络环境中定位设备;MAC 地址则是固化在网卡上的物理地址,是设备的硬件标识。那…...
[Unity]设置自动打包脚本
背景 我们经常会使用自动打包功能 文件名称: AutoBuild.csusing System.IO; using System.Linq; using UnityEditor; using UnityEngine;public class AutoBuilder {[MenuItem("Build/GetCurrentBuildTarget")]public static void GetCurrentBuildTarget(){Debug.L…...
使用Docker部署魔豆文库:本地化搭建私有文档管理系统
文章目录 前言1.关于Moredoc2.本地部署Moredoc3.Moredoc简单使用4. 安装内网穿透5.配置Moredoc公网地址6. 配置固定公网地址 前言 电脑中文件超多的小伙伴们,是不是每次打开机都感觉像是打开了潘多拉魔盒?那些杂乱无章的文档和文件夹简直让人头大如斗&a…...
数据结构---【二叉搜索树】
必须满足的条件:左子树中所有节点的值< 根节点的值 < 右子树中所有节点的值 任意节点的左右子树也是搜索二叉树,也要满足上面的条件 二叉搜索树与堆不同,不一定是完全二叉树,采用链式结构 搜索二叉树的中序遍历是升序 1、查…...
智能检索革命全景透视——基于《搜索引擎信息检索困境破解体系》深度拆解
以下为严格遵循您要求的完整解析报告,全文约52000字符,包含7章26个子节156个量化指标: 智能检索革命全景透视——基于《搜索引擎信息检索困境破解体系》深度拆解 第一章 行业格局解码(2987字) 1.1 用户画像三维透视…...
STM32printf重定向到串口含armcc和gcc两种方案
STM32串口重定向:MDK与GCC环境下需重写的函数差异 在嵌入式开发中,尤其是使用 STM32系列微控制器 的项目中,调试信息的输出是不可或缺的一部分。为了方便调试,开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC …...
蓝桥杯 序列计数
序列计数 原题目链接 题目描述 小明想知道,满足以下条件的正整数序列的数量: 第一项为 n;第二项不超过 n;从第三项开始,每一项小于前两项的差的绝对值。 请计算,对于给定的 n,有多少种满足…...
CSS常用属性_(进阶)
目录 1.尺寸单位与颜色 (1)尺寸 (2)颜色 常用2种 (3)颜色属性值(透明度) 例如: 2.字体属性font 例如: **顺序 3.文本属性 编辑例如: …...
模拟频谱分析仪(Linux c++ Qt)
此Demo由三个小项目组成,分布是模拟的硬件采集频谱数据端,后台处理端以及qt前端,于Linux系统下进行开发,使用的软件为clion和QtCreator,编程语言为c,使用了linux下的boost库(1.72),多线程和TCP,UDP以及c的一些新特性,为本人自己想的练手的小项目. 1.项目架构 整体设计采集端不…...
从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件
下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…...