卷积神经05-GAN对抗神经网络
卷积神经05-GAN对抗神经网络
使用Python3.9+CUDA11.8+Pytorch实现一个CNN优化版的对抗神经网络
-
简单的GAN图片生成
-
CNN优化后的图片生成
-
优化模型代码对比
0-核心逻辑脉络
- 1)Anacanda使用CUDA+Pytorch
- 2)使用本地MNIST进行手写图片训练
- 3)添加CNN进行训练过程优化
- 4)Flask点击生成图片
1-参考网址
- 1)GAN解读及代码实现:https://www.bilibili.com/video/BV1yE421u7Gj
- 2)个人实现代码:https://gitee.com/enzoism/gan_pytorch
- 3)CUDA+Pytorch环境安装参考:https://blog.csdn.net/2301_77717148/article/details/145083431
2-CUDA+Pytorch安装
# 1-Anacanda使用Python3.9
conda create -n GAN3.9 python=3.9
conda activate GAN3.9# 2-使用cudatoolkit=11.8
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
conda install pytorch torchvision torchaudio cudatoolkit=11.8 -c pytorch# 3-安装所需依赖包
pip install matplotlib # 4-查看GPU使用命令
nvidia-smi
watch -n 1 nvidia-smi
3-代码实现-本地版
import gzipimport matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset# 检查是否有可用的 GPU,如果没有则使用 CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")# 定义生成器和判别器
class Generator(nn.Module):def __init__(self, z_dim=100, img_dim=784):super(Generator, self).__init__()self.gen = nn.Sequential(nn.Linear(z_dim, 256),nn.ReLU(),nn.Linear(256, img_dim),nn.Tanh(), # 输出范围在 -1 到 1 之间)def forward(self, x):return self.gen(x)class Discriminator(nn.Module):def __init__(self, img_dim=784):super(Discriminator, self).__init__()self.dis = nn.Sequential(nn.Linear(img_dim, 128),nn.LeakyReLU(0.01),nn.Linear(128, 1),nn.Sigmoid(), # 输出范围在 0 到 1 之间)def forward(self, x):return self.dis(x)# 定义加载本地 MNIST 数据集的函数
MNIST_FILE_PATH = 'D:/TT_WORK+/PyCharm/20250109_1_CNN/MNIST/'def load_data():# 加载图像数据with gzip.open(MNIST_FILE_PATH + 'train-images-idx3-ubyte.gz', 'rb') as f: # 训练集X_train = np.frombuffer(f.read(), dtype=np.uint8, offset=16).reshape(-1, 28 * 28)with gzip.open(MNIST_FILE_PATH + 't10k-images-idx3-ubyte.gz', 'rb') as f: # 测试集X_test = np.frombuffer(f.read(), dtype=np.uint8, offset=16).reshape(-1, 28 * 28)# 加载标签数据with gzip.open(MNIST_FILE_PATH + 'train-labels-idx1-ubyte.gz', 'rb') as f: # 训练集标签y_train = np.frombuffer(f.read(), dtype=np.uint8, offset=8)with gzip.open(MNIST_FILE_PATH + 't10k-labels-idx1-ubyte.gz', 'rb') as f: # 测试集标签y_test = np.frombuffer(f.read(), dtype=np.uint8, offset=8)return (X_train, y_train), (X_test, y_test)# 加载数据并转换为 PyTorch 张量
(X_train, y_train), (X_test, y_test) = load_data()# 将数据转换为 PyTorch 张量并归一化到 [-1, 1] 范围
X_train = torch.tensor(X_train, dtype=torch.float32) / 255.0 * 2 - 1
X_test = torch.tensor(X_test, dtype=torch.float32) / 255.0 * 2 - 1# 创建数据集和数据加载器
train_dataset = TensorDataset(X_train)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 初始化生成器和判别器,并将它们移动到设备上
z_dim = 100
img_dim = 28 * 28generator = Generator(z_dim, img_dim).to(device)
discriminator = Discriminator(img_dim).to(device)lr = 0.0001
num_epochs = 100optimizer_gen = optim.Adam(generator.parameters(), lr=lr)
optimizer_dis = optim.Adam(discriminator.parameters(), lr=lr)criterion = nn.BCELoss()# 记录损失值
train_loss_g = []
train_loss_d = []# 训练过程
for epoch in range(num_epochs):gen_loss_epoch = 0disc_loss_epoch = 0for batch_idx, (real,) in enumerate(train_loader):real = real.to(device)batch_size = real.size(0)# 训练判别器noise = torch.randn(batch_size, z_dim, device=device)fake = generator(noise)disc_real_loss = criterion(discriminator(real), torch.ones(batch_size, 1, device=device))disc_fake_loss = criterion(discriminator(fake.detach()), torch.zeros(batch_size, 1, device=device))disc_loss = (disc_real_loss + disc_fake_loss) / 2optimizer_dis.zero_grad()disc_loss.backward()optimizer_dis.step()# 训练生成器noise = torch.randn(batch_size, z_dim, device=device)fake = generator(noise)gen_loss = criterion(discriminator(fake), torch.ones(batch_size, 1, device=device))optimizer_gen.zero_grad()gen_loss.backward()optimizer_gen.step()gen_loss_epoch += gen_loss.item()disc_loss_epoch += disc_loss.item()if batch_idx % 100 == 0:print(f"Epoch [{epoch}/{num_epochs}] Batch {batch_idx}/{len(train_loader)} \Loss D: {disc_loss.item():.4f}, loss G: {gen_loss.item():.4f}")# 记录每个 epoch 的平均损失train_loss_g.append(gen_loss_epoch / len(train_loader))train_loss_d.append(disc_loss_epoch / len(train_loader))# 每个 epoch 保存一些生成的图像generator.eval()with torch.no_grad():noise = torch.randn(1, z_dim, device=device)generated_img = generator(noise).view(28, 28).cpu().numpy()plt.imshow(generated_img, cmap='gray')plt.savefig(f'generated_img_epoch_{epoch}.png')plt.close()generator.train()# 5-保存模型
torch.save(generator.state_dict(), 'generator.pt')
torch.save(discriminator.state_dict(), 'discriminator.pt')# 绘制训练损失曲线
plt.figure(figsize=(10, 5))
plt.title("Generator and Discriminator Loss During Training")
plt.plot(train_loss_g, label="G")
plt.plot(train_loss_d, label="D")
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend()
plt.savefig("GAN_loss_curve.png")
plt.show()
4-代码实现-本地版-添加卷积层
1-修改后的生成器
# 定义生成器
class Generator(nn.Module):def __init__(self, z_dim=100):super(Generator, self).__init__()self.gen = nn.Sequential(nn.ConvTranspose2d(z_dim, 128, kernel_size=7, stride=1, padding=0, bias=False), # 输出尺寸: (128, 7, 7)nn.BatchNorm2d(128),nn.ReLU(),nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1, bias=False), # 输出尺寸: (64, 14, 14)nn.BatchNorm2d(64),nn.ReLU(),nn.ConvTranspose2d(64, 1, kernel_size=4, stride=2, padding=1, bias=False), # 输出尺寸: (1, 28, 28)nn.Tanh() # 输出范围在 -1 到 1 之间)def forward(self, x):x = x.view(-1, x.size(1), 1, 1) # 将输入张量调整为合适的形状return self.gen(x)
2-修改后的判别器
# 定义判别器
class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.dis = nn.Sequential(nn.Conv2d(1, 64, kernel_size=4, stride=2, padding=1, bias=False), # 输出尺寸: (64, 14, 14)nn.LeakyReLU(0.2),nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1, bias=False), # 输出尺寸: (128, 7, 7)nn.BatchNorm2d(128),nn.LeakyReLU(0.2),nn.Flatten(),nn.Linear(128 * 7 * 7, 1),nn.Sigmoid() # 输出范围在 0 到 1 之间)def forward(self, x):return self.dis(x)
5-代码实现-Flask预览图片
import base64
import ioimport numpy as np
import torch
from PIL import Image
from flask import Flask, render_template, jsonifyfrom main00_gan_model_define import Generator # 从你的模型文件中导入Generator类app = Flask(__name__)# 加载生成器模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
z_dim = 100
generator = Generator(z_dim).to(device)
generator.load_state_dict(torch.load('gan_train_cnn/generator.pt', map_location=device))
generator.eval()@app.route('/')
def index():return render_template('index.html')@app.route('/generate', methods=['POST'])
def generate():images = []for _ in range(5):noise = torch.randn(1, z_dim, device=device)with torch.no_grad():generated_img = generator(noise).squeeze(0).cpu().numpy()# 将生成的图像转换为PIL图像,并进行编码以便在网页中显示generated_img = (generated_img * 0.5 + 0.5) * 255 # 反归一化generated_img = generated_img.astype(np.uint8)img = Image.fromarray(generated_img[0], mode='L') # 假设是单通道灰度图像buffered = io.BytesIO()img.save(buffered, format="PNG")img_str = base64.b64encode(buffered.getvalue()).decode('utf-8')images.append(img_str)return jsonify(images=images)if __name__ == '__main__':app.run(debug=True)
6-什么是nn.BCELoss()
优化nn.BCELoss()并不是直接对损失函数本身进行优化,而是指通过调整模型、数据预处理、训练过程等方面的策略,以最小化该损失函数计算得到的损失值,从而提高模型的性能。以下是一些优化nn.BCELoss()的常见方法:
-
模型架构调整:
• 确保模型具有足够的容量(即参数数量)来捕捉数据的复杂性,但也要避免过拟合。
• 使用正则化技术,如L1、L2正则化,或dropout层来减少过拟合。
-
数据预处理:
• 对输入数据进行适当的缩放和归一化,使其分布在模型更容易处理的范围内。
• 确保标签数据是二进制的(0或1),因为nn.BCELoss()期望的是这种格式。
-
损失函数输入:
• 确保传递给nn.BCELoss()的预测值是原始得分(logits),而不是已经通过sigmoid函数转换过的概率。nn.BCELoss()内部会对这些得分应用sigmoid函数。
-
学习率和优化器:
• 使用合适的学习率。学习率太高可能导致训练不稳定,而学习率太低则会使训练过程收敛缓慢。
• 选择合适的优化器,如SGD、Adam或RMSprop,并调整其超参数(如动量、权重衰减)。
-
批量大小:
• 尝试不同的批量大小以找到最佳的内存使用效率和梯度估计。
-
训练过程监控:
• 定期监控训练损失和验证损失,以及任何其他相关指标(如准确率)。
• 使用早停(early stopping)策略来防止过拟合,即在验证损失停止改善时停止训练。
-
梯度裁剪:
• 如果遇到梯度爆炸问题,可以尝试使用梯度裁剪来限制梯度的最大范数。
-
标签平滑:
• 在某些情况下,对标签应用标签平滑可以减少模型对错误标签的过度自信,从而改善泛化能力。
-
数据增强:
• 对输入数据进行增强(如旋转、翻转、缩放等),以增加数据多样性,减少过拟合。
-
模型集成:
• 通过训练多个模型并将它们的预测结果结合起来(如通过平均或投票),可以提高整体性能。
请注意,这些优化策略并不是孤立的,而是应该相互结合使用,以找到最适合特定任务和数据的组合。此外,对于每个任务和数据集,最佳实践可能会有所不同,因此通常需要进行实验和调整来找到最佳配置。
7-如何优化nn.BCELoss()
nn.BCELoss()是 PyTorch 中用于二分类问题的损失函数,全称是 Binary Cross Entropy Loss。这个函数计算的是目标值(通常是二分类问题的真实标签,取值范围为 {0, 1})和预测值(通常是模型输出的概率值,取值范围为 [0, 1])之间的二元交叉熵损失。
二元交叉熵损失的计算公式为:
L = − 1 N ∑ i = 1 N [ y i ⋅ log ( x i ) + ( 1 − y i ) ⋅ log ( 1 − x i ) ] L = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \cdot \log(x_i) + (1 - y_i) \cdot \log(1 - x_i) \right] L=−N1i=1∑N[yi⋅log(xi)+(1−yi)⋅log(1−xi)]
其中:
• NNN是样本数量。
• yiy_iyi是第iii个样本的真实标签(0 或 1)。
• xix_ixi是第iii个样本的预测概率。
这个函数常用于二分类任务中,比如判断一张图片是否包含某个物体、一封邮件是否是垃圾邮件等场景。使用nn.BCELoss()时,需要确保输入的目标值和预测值都是未经过 sigmoid 激活的原始值(即预测值应该是模型最后一层的线性输出),因为在计算损失时,该函数内部会对预测值应用 sigmoid 函数,将其转换为概率值。
示例用法:
import torch
import torch.nn as nn
假设有3个样本的预测值和真实标签
predictions = torch.tensor([0.2, 0.8, 0.4], dtype=torch.float32) # 预测概率
targets = torch.tensor([0, 1, 0], dtype=torch.float32) # 真实标签
初始化 BCELoss
criterion = nn.BCELoss()
计算损失
loss = criterion(predictions, targets)
print(loss) # 输出损失值
在这个例子中,predictions是模型输出的预测概率,targets是真实的标签,criterion(predictions, targets)计算了预测值和真实值之间的二元交叉熵损失。
相关文章:
卷积神经05-GAN对抗神经网络
卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1)Anacanda使用CUDAPytorch2)使用本地MNIST进行手写图片训练3)…...
【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用
提升数据质量:质量评估与改进策略 引言:数据质量的概念 在大数据时代,数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途,确保数据的准确性、完整性、一致性和及时性是数据质量的…...
GLM: General Language Model Pretraining with Autoregressive Blank Infilling论文解读
论文地址:https://arxiv.org/abs/2103.10360 参考:https://zhuanlan.zhihu.com/p/532851481 GLM混合了自注意力和masked注意力,而且使用了2D位置编码。第一维的含义是在PartA中的位置,如5 5 5。第二维的含义是在Span内部的位置&a…...
总结SpringBoot项目中读取resource目录下的文件多种方法
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
云原生第四次作业
下载 [rootopenEuler-1 ~]# wget https://archive.apache.org/dist/httpd/httpd-2.4.46.tar.gz 压缩 配置实验环境 [rootopenEuler-1 httpd-2.4.46]# yum -y install apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-d…...
day10_Structured Steaming
文章目录 Structured Steaming一、结构化流介绍(了解)1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型(掌握)1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…...
设计模式-工厂模式/抽象工厂模式
工厂模式 定义 定义一个创建对象的接口,让子类决定实列化哪一个类,工厂模式使一个类的实例化延迟到其子类; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作…...
【算法学习】——整数划分问题详解(动态规划)
🧮整数划分问题是一个较为常见的算法题,很多问题从整数划分这里出发,进行包装,形成新的题目,所以完全理解整数划分的解决思路对于之后的进一步学习算法是很有帮助的。 「整数划分」通常使用「动态规划」解决࿰…...
【新教程】Ubuntu 24.04 单节点安装slurm
背景 网上教程老旧,不适用。 详细步骤 1、安装slurm sudo apt install slurm-wlm slurm-wlm-doc -y检查是否安装成功: slurmd --version如果得到slurm-wlm 23.11.4,表明安装成功。 2、配置slurm。 使用命令: sudo vi /etc/s…...
window下用vim
Windows 默认不支持 vim 命令,需要手动安装后才能使用。以下是解决方案: 1. 安装 Vim 编辑器 方法 1:通过 Scoop 或 Chocolatey 安装 使用 Scoop: 安装 Scoop(如果尚未安装):iwr -useb get.sco…...
citrix netscaler13.1 重写负载均衡响应头(基础版)
在 Citrix NetScaler 13.1 中,Rewrite Actions 用于对负载均衡响应进行修改,包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成,帮助你根据需求调整请求内容。以下是三种常见的操作: 1. Replace (替换响应头)…...
使用PWM生成模式驱动BLDC三相无刷直流电机
引言 在 TI 的无刷直流 (BLDC) DRV8x 产品系列使用的栅极驱动器应用中,通常使用一些控制模式来切换MOSFET 开关的输出栅极。这些控制模式包括:1x、3x、6x 和独立脉宽调制 (PWM) 模式。 不过,DRV8x 产品系列(例如 DRV8311&…...
常见的php框架有哪几个?
一直以来,PHP作为一种广泛使用的编程语言,拥有着许多优秀的框架来帮助开发人员快速构建稳定的Web应用程序。本文降为大家介绍几种常见的PHP的主流框架,以及它们相关的特点和使用场景。如有问题,欢迎指正! 1.Laravel&a…...
机器学习(2):线性回归Python实现
1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示: y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值);X1, X2, ... Xn 是自变量(特征)β0, β1,…...
Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例
文章目录 前言示例一、球体的基础配置二、三个球体的设置差异三、示例意图LatencySimulation前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开…...
【Unity-Animator】通过 StateMachineBehaviour 实现回调
StateMachineBehaviour 简介 StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例…...
并行服务、远程SSH无法下载conda,报错404
原下载代码无效,报错404 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 使用下面代码下载 wget --user-agent"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12…...
cuquantum 简介
1. 关于 cuquantum 概述 官方文档: https://docs.nvidia.com/cuda/cuquantum/latest/appliance/overview.html#prerequisites NVIDIA 的 cuQuantum 是一个专门用于量子计算的高性能库,旨在加速量子电路的模拟和量子算法的执行。cuQuantum 提供了一系列…...
小程序如何引入腾讯位置服务
小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意:小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务,如果没有就在插件管理中添加插件 2.腾讯位置服务…...
【react】使用antd Table渲染数据遇到的报错问题
记录自己在开发过程中遇到的报错问题: 目录 原本写法:错误分析:解决方案: 原本写法: render: (text) > {console.log(text, "111111text");console.log(typeof text, "111111text");return t…...
55_OpenResty开发入门
Nginx编程需要用到Lua语言,因此我们必须先学习Lua的基本语法。Nginx本身也是C语言开发,因此也允许基于Lua做拓展。多级缓存的实现离不开Nginx编程,而Nginx编程又离不开OpenResty。 1.OpenResty概述 OpenResty是一款基于NGINX和LuaJIT的Web平台。通过Lua扩展NGINX实现的可伸…...
(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力
文章目录 1、Half Wavelet Attention2、代码实现 paper:HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code:https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...
链家房价数据爬虫和机器学习数据可视化预测
完整源码项目包获取→点击文章末尾名片!...
全网首发:编译libssh,产生类似undefined reference to `EVP_aes_256_ctr@OPENSSL_1_1_0‘的大量错误
具体错误 前面和后面的: /opt/linux/x86-arm/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: warning: libcrypto.so.1.1, needed by ../lib/libssh.so.4.10.1, not found (try using -rpath or -rpat…...
springboot 集成javaFx 两个面板之间如何进行跳转
1.创建两个面板 可参考博主的 java8 springboot 集成javaFx 实现一个客户端程序 文章来实现 2.完善代码 以下是博主创建的两个模板 博主在这里实现的是登录跳转功能,注意:这里登录按钮的触发实现方式做了以下小小的改动,也可根据自己的习惯来处理 相较第一篇文章,博主在Lo…...
vue-cli项目配置使用unocss
在了解使用了Unocss后,就完全被它迷住了。接手过的所有项目都配置使用了它,包括一些旧项目,也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的,项目是vue2vue-cli构建的,node<20平常开…...
ASP.NET Core - IStartupFilter 与 IHostingStartup
ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离,但是有些时候我们还会可以根据应用中的功能…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证5)
用户在前端页面登录成功后会从服务端获取Token,后续调用服务器的服务接口时都得带着Token,否则就会验证失败。之前使用postman测试的时候,获取Token后再调用其它服务都是人工将Token添加到Header中,网页中没法这么做,只…...
【Vue】let、const、var的区别、适用场景
let、const、var,有哪些区别,适用场景 var 特点: var 是 JavaScript 中最传统的变量声明方式。具有函数作用域,即在函数内声明的 var 变量,在整个函数内都可以访问。变量提升:使用 var 声明的变量会被提升…...
【llama_factory】qwen2_vl训练与批量推理
训练llama factory配置文件 文件:examples/train_lora/qwen2vl_lora_sft.yaml ### model model_name_or_path: qwen2_vl/model_72b trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_target: all### dataset dataset: ca…...
计算机视觉与深度学习:使用深度学习训练基于视觉的车辆检测器(MATLAB源码-Faster R-CNN)
在人工智能领域,计算机视觉是一个重要且充满活力的研究方向。它使计算机能够理解和分析图像和视频数据,从而做出有意义的决策。其中,目标检测是计算机视觉中的一项关键技术,它旨在识别并定位图像中的多个目标对象。车辆检测作为目标检测的一个重要应用,在自动驾驶、智能交…...
Python 扫描枪读取发票数据导入Excel
财务需要一个扫描枪扫描发票文件,并将主要信息录入Excel 的功能。 文件中sheet表的列名称,依次为:发票编号、发票编码、日期、金额、工号、扫描日期。 扫描的时候,Excel 文件需要关闭,否则会报错。 import openpyxl …...
SpringMVC复习笔记
文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步:导入依赖第二步:Controller 层开发第三步:SpringMVC 配置类配置核心组件第四步:SpringMVC 环境搭建第五步:部…...
arcgis提取不规则栅格数据的矢量边界
效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…...
【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代,零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径࿰…...
链路追踪SkyWalking
链路追踪 链路追踪作用链路追踪的关键概念链路追踪的工作原理常用链路追踪工具链路追踪的实现步骤链路追踪的典型场景 SkyWalkingSkyWalking 的主要功能SkyWalking 的架构安装 SkyWalking从 SkyWalking 的官方 GitHub 仓库 下载最新版本。配置后端存储SkyWalking使用࿰…...
linux下的线程
一、pthread 线程 线程可以说是轻量级的进程,一般是一个进程中的多个任务。 进程:系统中的最小资源分配单元 线程:系统中最小执行单元 二、线程的特征 1、共享资源 2、效率高30% 3.使用第三方库(头文件加pthread.h 编译时添加 -lpthre…...
《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析
全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业,技术革新迅猛,市场竞争激烈。《全星研发管理 APQP 软件系统》的应用,为企业带来了革命性的变化,诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…...
mysql、oracle、sqlserver的区别
一、保存数据的持久性: MySQL:是在数据库更新或者重启,则会丢失数据。 Oracle:把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复。 SqlServer:2…...
CV(10)--目标检测
前言 仅记录学习过程,有问题欢迎讨论 目标检测 object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别;输出的是分类类别label物体的外框(x, y, width, height)。 目标检测算法:…...
SQL LAST()
SQL中的LAST()函数是一个用于返回指定列中最后一个记录值的函数。然而,需要注意的是,这个函数并不是SQL标准的一部分,因此并不是所有数据库系统都支持它。具体来说,只有MS Access直接支持LAST()函数【0†source】。 在其他数据库…...
传统以太网问题与VLAN技术详解
传统以太网的问题 广播域:在网络中能接收同一广播信息的所有设备(计算机、交换机)等的集合 说明:在一个广播域内,当一个设备发送广播帧时,该域内的所有设备都能接收到这个广播帧。工作原理:在以…...
Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的?
Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的? 在 Java 开发中,ArrayList和LinkedList是两个常用的集合类,它们在数据结构和性能上有诸多不同,同时线程安全性也各有特点。深入理解这些差异&am…...
flutter 安卓端打包
在 Flutter 中打包 Android 应用程序是一个相对简单的过程。你可以使用 Flutter 的命令行工具来构建并打包你的 APK 或 AAB(Android App Bundle)。以下是打包 Flutter Android 应用的步骤: 1. 安装 Flutter 环境 确保你已经安装了 Flutter SDK,并且正确配置了 Android 开…...
前端开发:CSS背景属性
1.背景颜色 background-color: [ 指定颜色 ] background-color :blue; background-color : transparent //设置背景是透明的 2.背景图片 background-image : url ( ... ) 1. url 不要遗漏 . 2. url 可以是绝对路径 , 也可以是相对路径 3. url 上可以…...
【Python通过UDP协议传输视频数据】(界面识别)
提示:界面识别项目 前言 随着网络通信技术的发展,视频数据的实时传输在各种场景中得到了广泛应用。UDP(User Datagram Protocol)作为一种无连接的协议,凭借其低延迟、高效率的特性,在实时性要求较高的视频…...
centos 8 中安装Docker
注:本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载,选择适合你们的下载即可! 1、CentOS官方下载地址:https://vault.centos.org/ 2、阿里云开源镜像站下载:centos安装包…...
leetcode hot 100 -划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 示例 1&am…...
CSS 元素的显示模式(块元素,行内元素,行内块元素)
一. 块元素(block) 又称:块级元素 特点: 1. 在页面中独占一行,不会与任何元素共用一行,是从上到下排列的。 2. 默认宽度:撑满父元素。 3. 默认高度:由内容撑开。 4. 可以通过 CSS 设…...
鸿蒙UI开发——键盘弹出避让模式设置
1、概 述 我们在鸿蒙开发时,不免会遇到用户输入场景,当用户准备输入时,会涉及到输入法的弹出,我们的界面针对输入法的弹出有两种避让模式:上抬模式、压缩模式。 下面针对输入法的两种避让模式的设置做简单介绍。 2、…...