什么是GAN?
一、基本概念
生成对抗网络(Generative Adversarial Network,GAN)是一种由两个神经网络共同组成深度学习模型:生成器(Generator)和判别器(Discriminator)。这两个网络通过对抗的方式进行训练,生成器尝试伪造逼真的样本数据,而判别器则负责判断输入的数据是真实数据还是生成器伪造出来的数据。理想情况下,判别器对真实样本和生成样本的判断概率都是1/2,意味着判别器已经无法判断生成器生成的数据真假。
二、模型原理
GAN的模型原理并不复杂。首先,GAN由以下两个子模型组成:
- 生成器(Generator):从随机噪声中生成数据,目标是欺骗判别器,使其认为生成的数据是真实的。
- 判别器(Discriminator):判断输入数据是来自真实数据分布还是生成器,目标是正确区分真实数据和生成数据。
然后,GAN的损失函数是训练的核心,我们需要构建一个合适的损失函数用于衡量生成器和判别器的表现:
- 生成器损失(G_loss):通常表示为最大化判别器对其生成样本的错误分类概率,也就是判别器判定所有生成数据均为真。
- 判别器损失(D_loss):由两部分组成,一部分是真实样本的损失(标签为1),另一部分是生成样本的损失(标签为0)。
最后,我们通过算法设计来交替训练生成器和判别器,例如生成器每训练5个Epoch,我们就训练一次判别器:
- 训练判别器:提高其区分真实样本和生成样本的能力。
- 训练生成器:提高其生成真实样本的能力,目标是最大化判别器将其生成样本识别为真实样本的概率。
三、python实现
1、导库
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from torch.utils.data import DataLoader, TensorDataset
from sklearn.decomposition import PCA
2、数据处理
这里我们的目标是训练一个生成对抗网络来生成iris数据,使用sklearn的iris数据集训练。这意味着,我们输入给生成器的信息中需要包含类别信息,这样生成器才能生成对应类别的数据样本。当然,这一步不是必要的,在类别不敏感的任务中,只需要生成符合要求的数据即可。
# 加载Iris数据集
iris = load_iris()
data = iris.data
labels = iris.target# 标准化数据
scaler = StandardScaler()
data = scaler.fit_transform(data)# One-hot编码标签
encoder = OneHotEncoder(sparse=False)
# torch.Size([100, 3])
labels = encoder.fit_transform(labels.reshape(-1, 1))# 转换为PyTorch张量
data = torch.FloatTensor(data)
labels = torch.FloatTensor(labels)# 创建数据加载器
batch_size = 32
dataset = TensorDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
3、构建生成器
这里,我们构建一个全连接神经网络。生成器的输入包括随机初始化的x,以及x对应的期望类别,期望类别是可以真实标签,表示生成对应类别下的数据样本。
# 生成器网络
class Generator(nn.Module):def __init__(self, input_dim, label_dim, output_dim):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim + label_dim, 128),nn.ReLU(),nn.Linear(128, 256),nn.ReLU(),nn.Linear(256, output_dim),)def forward(self, x, labels):x = torch.cat([x, labels], 1)return self.model(x)
4、构建判别器
这里,我们的判别器实际上是一个二分类模型。判别器的输入维度跟生成器一直,都需要考虑类别信息。
# 判别器网络
class Discriminator(nn.Module):def __init__(self, input_dim, label_dim):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim + label_dim, 256),nn.LeakyReLU(0.2),nn.Linear(256, 128),nn.LeakyReLU(0.2),nn.Linear(128, 1),nn.Sigmoid())def forward(self, x, labels):x = torch.cat([x, labels], 1)return self.model(x)
5、超参数设置
值得注意的是,我们分别为生成器和判别器构造一个优化器,从而便于分开训练两个子模型。
# 设置超参数
latent_dim = 100
data_dim = data.shape[1]
label_dim = labels.shape[1]
lr = 0.0002
num_epochs = 200# 初始化生成器和判别器
generator = Generator(latent_dim, label_dim, data_dim)
discriminator = Discriminator(data_dim, label_dim)# 优化器
optimizer_G = optim.Adam(generator.parameters(), lr=lr)
optimizer_D = optim.Adam(discriminator.parameters(), lr=lr)# 损失函数
criterion = nn.BCELoss()
6、模型训练
这里,我们选择了分开训练生成器和判别器,在一个epoch中,先训练3次生成器,再训练一次判别器。这样的目的是增加生成器的学习时间,从而使得生成的样本更为真实。
# 训练GAN
for epoch in range(num_epochs):for i, (real_data, real_labels) in enumerate(dataloader):batch_size = real_data.size(0)# 当前仅训练生成器generator.train()discriminator.eval()# 迭代训练生成器,这里是每个epoch训练3次for _ in range(3):z = torch.randn(batch_size, latent_dim)# 直接使用真实标签即可,这里的标签代表的是样本类别,目的是让模型学习到类别差异# 生成器生成的是各对应类别的数据fake_data = generator(z, real_labels)# 使用判别器对生成的假数据进行分类outputs = discriminator(fake_data, real_labels)# 基于判别器的结果计算生成器的损失,目标是让判别器认为生成的数据是真实的(标签为1)# 如果这里使用的是torch.zeros则生成器的结果将会非常差,几乎无法生成真实数据# 这是由于我们的目标是让outputs逼近全1向量,也就是让判别器认为所有生成的数据都是真实的,这样才能让生成样本越来越真实g_loss = criterion(outputs, torch.ones(batch_size, 1))# 反向传播生成器的梯度optimizer_G.zero_grad()g_loss.backward()optimizer_G.step()# 当前仅训练判别器generator.eval()discriminator.train()# 训练判别器,真实样本标签为1,生成样本标签为0real_targets = torch.ones(batch_size, 1)fake_targets = torch.zeros(batch_size, 1)# 真实数据损失outputs = discriminator(real_data, real_labels)d_loss_real = criterion(outputs, real_targets)real_score = outputs# 生成假数据,计算损失z = torch.randn(batch_size, latent_dim)fake_data = generator(z, real_labels)outputs = discriminator(fake_data.detach(), real_labels)# 这里的目标与上面生成器部分相反,我们是要让outputs逼近全0向量,也就是全部预测出假数据# 所以fake_targets是一个全0向量d_loss_fake = criterion(outputs, fake_targets)fake_score = outputs# 总的判别器损失d_loss = d_loss_real + d_loss_fake# 反向传播判别器的梯度optimizer_D.zero_grad()d_loss.backward()optimizer_D.step()if epoch%10==0:# 打印损失print(f'Epoch [{epoch+1}/{num_epochs}], d_loss: {d_loss.item():.4f}, g_loss: {g_loss.item():.4f}, 'f'D(x): {real_score.mean().item():.4f}, D(G(z)): {fake_score.mean().item():.4f}')
7、生成新数据
最后,我们使用训练好的GAN中的生成器来生成一批新数据。可以看到,效果不错。
# 生成新数据
num_samples = 100
z = torch.randn(num_samples, latent_dim)
labels = np.array([0, 1, 2] * (num_samples // 3) + [0] * (num_samples % 3))
labels = encoder.transform(labels.reshape(-1, 1))
labels = torch.FloatTensor(labels)
generated_data = generator(z, labels).detach().numpy()# 降维
pca = PCA(n_components=2)
data_2d = pca.fit_transform(data)
generated_data_2d = pca.transform(generated_data)# 可视化生成的数据
plt.figure(figsize=(10, 5))
for i in range(3):real_class_data = data_2d[iris.target == i]generated_class_data = generated_data_2d[np.argmax(labels.numpy(), axis=1) == i]plt.scatter(real_class_data[:, 0], real_class_data[:, 1], label=f'Real Class {i}')plt.scatter(generated_class_data[:, 0], generated_class_data[:, 1], label=f'Generated Class {i}')
plt.legend()
plt.show()
四、完整代码
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from torch.utils.data import DataLoader, TensorDataset
from sklearn.decomposition import PCA# 加载Iris数据集
iris = load_iris()
data = iris.data
labels = iris.target# 标准化数据
scaler = StandardScaler()
data = scaler.fit_transform(data)# One-hot编码标签
encoder = OneHotEncoder(sparse=False)
labels = encoder.fit_transform(labels.reshape(-1, 1))# 转换为PyTorch张量
data = torch.FloatTensor(data)
labels = torch.FloatTensor(labels)# 创建数据加载器
batch_size = 32
dataset = TensorDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)# 生成器网络
class Generator(nn.Module):def __init__(self, input_dim, label_dim, output_dim):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim + label_dim, 128),nn.ReLU(),nn.Linear(128, 256),nn.ReLU(),nn.Linear(256, output_dim),)def forward(self, x, labels):x = torch.cat([x, labels], 1)return self.model(x)# 判别器网络
class Discriminator(nn.Module):def __init__(self, input_dim, label_dim):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim + label_dim, 256),nn.LeakyReLU(0.2),nn.Linear(256, 128),nn.LeakyReLU(0.2),nn.Linear(128, 1),nn.Sigmoid())def forward(self, x, labels):x = torch.cat([x, labels], 1)return self.model(x)# 设置超参数
latent_dim = 100
data_dim = data.shape[1]
label_dim = labels.shape[1]
lr = 0.0002
num_epochs = 200# 初始化生成器和判别器
generator = Generator(latent_dim, label_dim, data_dim)
discriminator = Discriminator(data_dim, label_dim)# 优化器
optimizer_G = optim.Adam(generator.parameters(), lr=lr)
optimizer_D = optim.Adam(discriminator.parameters(), lr=lr)# 损失函数
criterion = nn.BCELoss()# 训练GAN
for epoch in range(num_epochs):for i, (real_data, real_labels) in enumerate(dataloader):batch_size = real_data.size(0)generator.train()discriminator.eval()# 迭代训练生成器,这里是每个epoch训练3次for _ in range(3):z = torch.randn(batch_size, latent_dim)# 直接使用真实标签即可,这里的标签代表的是样本类别,目的是让模型学习到类别差异# 生成器生成的是各对应类别的数据fake_data = generator(z, real_labels)# 使用判别器对生成的假数据进行分类outputs = discriminator(fake_data, real_labels)# 基于判别器的结果计算生成器的损失,目标是让判别器认为生成的数据是真实的(标签为1)# 如果这里使用的是torch.zeros则生成器的结果将会非常差,几乎无法生成真实数据# 这是由于我们的目标是让outputs逼近全1向量,也就是让判别器认为所有生成的数据都是真实的,这样才能让生成样本越来越真实g_loss = criterion(outputs, torch.ones(batch_size, 1))# 反向传播生成器的梯度optimizer_G.zero_grad()g_loss.backward()optimizer_G.step()generator.eval()discriminator.train()# 训练判别器,真实样本标签为1,生成样本标签为0real_targets = torch.ones(batch_size, 1)fake_targets = torch.zeros(batch_size, 1)# 真实数据损失outputs = discriminator(real_data, real_labels)d_loss_real = criterion(outputs, real_targets)real_score = outputs# 生成假数据,计算损失z = torch.randn(batch_size, latent_dim)fake_data = generator(z, real_labels)outputs = discriminator(fake_data.detach(), real_labels)# 这里的目标与上面生成器部分相反,我们是要让outputs逼近全0向量,也就是全部预测出假数据# 所以fake_targets是一个全0向量d_loss_fake = criterion(outputs, fake_targets)fake_score = outputs# 总的判别器损失d_loss = d_loss_real + d_loss_fake# 反向传播判别器的梯度optimizer_D.zero_grad()d_loss.backward()optimizer_D.step()if epoch%10==0:# 打印损失print(f'Epoch [{epoch+1}/{num_epochs}], d_loss: {d_loss.item():.4f}, g_loss: {g_loss.item():.4f}, 'f'D(x): {real_score.mean().item():.4f}, D(G(z)): {fake_score.mean().item():.4f}')# 生成新数据
num_samples = 100
z = torch.randn(num_samples, latent_dim)
labels = np.array([0, 1, 2] * (num_samples // 3) + [0] * (num_samples % 3))
labels = encoder.transform(labels.reshape(-1, 1))
labels = torch.FloatTensor(labels)
generated_data = generator(z, labels).detach().numpy()# 降维
pca = PCA(n_components=2)
data_2d = pca.fit_transform(data)
generated_data_2d = pca.transform(generated_data)# 可视化生成的数据
plt.figure(figsize=(10, 5))
for i in range(3):real_class_data = data_2d[iris.target == i]generated_class_data = generated_data_2d[np.argmax(labels.numpy(), axis=1) == i]plt.scatter(real_class_data[:, 0], real_class_data[:, 1], label=f'Real Class {i}')plt.scatter(generated_class_data[:, 0], generated_class_data[:, 1], label=f'Generated Class {i}')
plt.legend()
plt.show()
五、总结
生成对抗网络是一个很经典的深度学习模型,它在诸多领域中发挥着重要作用。除了超参数调整之外,训练GAN的另一个关键步骤是构造一个合适的训练策略。例如,可以同时训练生成器和判别器,也可以交替训练二者,或者先训练生成器再训练判别器等等。但是,这两个网络是相互博弈的,由于生成器参数是随机初始化的,一开始生成的数据质量往往较差。我们的策略一般是先让生成器变强(通过构造更复杂的网络结构或者更多的训练次数),让生成的数据质量先提升。这样随着训练的迭代,生成的样本越来越逼真,判别器也不得不为了最小化D_loss而提升自身的能力。
相关文章:
什么是GAN?
一、基本概念 生成对抗网络(Generative Adversarial Network,GAN)是一种由两个神经网络共同组成深度学习模型:生成器(Generator)和判别器(Discriminator)。这两个网络通过对抗的方式…...
torch_geometric使用手册-Creating Graph Datasets(专题四)
虽然 PyG 已经提供了很多有用的数据集,但你可能希望创建自己的数据集,使用自己收集的数据或非公开的数据。 自己实现数据集是非常简单的,你可能想查看源代码,了解各种数据集是如何实现的。然而,这里简要介绍一下如何设置你自己的数据集。 我们提供了两个抽象类用于数据集…...
编程语言之Python
Python是一种高级编程语言,自其诞生以来,便因其简洁明了的语法、强大的功能和广泛的应用领域而备受青睐。以下是对Python的详细介绍,包括其历史、特点、应用领域,以及通过代码示例展示其语法、库、函数等关键概念。同时࿰…...
【Go】-调度器简介
目录 数据结构 G M P 调度器启动 创建 Goroutine 初始化结构体 运行队列 调度信息 调度循环 小结 数据结构 Go的运行时调度器的三个重要组成部分 — 线程 M、Goroutine G 和处理器 P: 图 6-29 Go 语言调度器 G — 表示 Goroutine,它是一个待…...
在Ubuntu 22.04上设置Python 3的Jupyter Notebook
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Jupyter Notebook 是一个作为 Web 应用程序的交互式计算命令 shell。该工具可与多种语言一起使用,包括 Python、Julia…...
通讯专题4.1——CAN通信之计算机网络与现场总线
从通讯专题4开始,来学习CAN总线的内容。 为了更好的学习CAN,先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中,有许多的网络,如交通网(铁路、公路等)、通信网(电信、…...
将jar包导入maven
1.将jar包放repository 2.执行命令:mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc7 -Dversion12.1.0.2 -Dpackagingjar -DfileD:\dev\utils\idea\repository\ojdbc7.jar -Dfile: 指定要安装的JAR文件的路径。 -DgroupId: 指定项目的groupId。 -…...
Mysql实现定时自动备份(Windows环境)
一.新建数据库备份目录 二.新建批处理文件 创建批处理文件mysql_backup.bat echo off set BACKUP_DIRD:\backup set MYSQL_USERroot set MYSQL_PASS123456 set MYSQL_HOSTlocalhost set DATABASE_NAMEphoenix set DATE%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time…...
kafka数据在服务端时怎么写入的
学习背景 接着上篇,我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前,我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群,我们在这个集群上创建一个topic叫做shitu-topic&…...
2024算法基础公选课练习七(BFS1)
一、前言 还是偏基础的bfs,但是有几个题不是很好写 二、题目总览 三、具体题目 3.1 问题 A: 数据结构-队列-奇怪的电梯 我的代码 可以看成求一维平面的bfs最短路 #include <bits/stdc.h> using i64 long long; using pii std::pair<int,int>; co…...
算法刷题Day1
BM47 寻找第k大 第一天就随便记录吧,万事开头难,我好不容易开的头,就别难为自己,去追求高质量了。嘿嘿嘿 题目 传送门 解题思路一:维护一个大小为k的最小堆。最后返回堆顶元素。 代码: # # 代码中的类名…...
你还没有将 Siri 接入GPT对话功能吗?
由于各种原因,国内ios用户目前无缘自带 AI 功能,但是这并不代表国内 ios 无法接入 AI 功能,接下来手把手带你为iPhone siri 接入 gpt 对话功能。 siri 接入 chatGPT 暂时还无法下载 ChatGPT app,或者没有账号的读者可以直接跳到…...
LabVIEW 标准状态机设计模式
LabVIEW 标准状态机设计模式 LabVIEW 软件框架介绍LabVIEW编程模式及其应用分析状态机模式的类型分析标准状态机设计模式及状态机应用学习顺序结构它的一个缺点是什么? 状态机结构 LabVIEW 软件框架介绍 源于虚拟仪器技术的LabVIEW程序设计语言,从被创建…...
Scala学习记录,统计成绩
统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名,并保存结果到文件中 解题思路如下: 1.读入txt文件,按行读入 2.处理数据 (1)计算每个同学的总分平均分 import s…...
使用 client-go 实现 Kubernetes 节点 Drain:详解与实战教程
在 Kubernetes 中使用 client-go 实现 drain 功能涉及多个步骤,需要模仿 kubectl drain 的行为。这包括将节点标记为不可调度(cordon)、驱逐 Pod,并处理 DaemonSet 和不可驱逐 Pod 的逻辑。以下是实现 drain 的主要步骤࿱…...
C#VB.Net项目一键多国语言显示
如何在项目什么都不做一键支持多国语言显示 开始我们的一键快捷使用之旅 01.创建多语言项目 02.一键批量窗口开启本地化,添加选中内容添加Mu方法 03.一键快捷翻译 04.运行查看效果 01.创建多语言项目 创建多语言项目前,请先下载安装,注册并登录. 为了便于演示这…...
【关闭or开启电脑自带的数字键盘】
目录 一、按数字键盘左上角的按键【NumLK Scroll】 二、修改注册表中数字键盘对应的数值【InitialKeyboardIndicators】 1、步骤: 2、知识点: 一、按数字键盘左上角的按键【NumLK Scroll】 这是最简单快捷的方法。 关闭后若想开启,再按一…...
如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?
文章目录 问题回答参考 问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!/bin/bash for i in seq 0 9; docalculations $i & d…...
Asio2网络库
header only,不依赖boost库,不需要单独编译,在工程的Include目录中添加asio2路径,在源码中#include <asio2/asio2.hpp>即可使用;支持tcp, udp, http, websocket, rpc, ssl, icmp, serial_port;支持可靠UDP(基于KCP),支持SSL;TCP支持各种数据拆包功能(单个字符或字符串或用…...
Uniapp 微信小程序内打开web网页
技术栈:Uniapp Vue3 简介 实际业务中有时候会需要在本微信小程序内打开web页面,这时候可以封装一个路由页面专门用于此场景。 在路由跳转的时候携带路由参数,拼接上web url,接收页面进行参数接收即可。 实现 webview页面 新…...
学习线性表_3
单链表的删除 直接删除即可删除后要free //删除第i个位置的元素 //删除时L是不会变的,所以不需要加引用 bool ListDelect(LinkList L,int i) {//i 1,即删除头指针//拿到要删除结点的前一个结点LinkList p GetElem(L,i-1);if(NULLp){return false;}//拿到要删除的结…...
智能桥梁安全运行监测系统守护桥梁安全卫士
一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分,其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道,更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行,桥梁安…...
Arrays.asList()新增报错,该怎么解决
一、前言 在 Java 开发中,Arrays.asList() 是一个常用的工具方法,它允许开发者快速将数组转换为列表。尽管这个方法非常方便,但许多开发者在使用时可能会遭遇一个常见的错误:尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...
28.UE5实现对话系统
目录 1.对话结构的设计(重点) 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图,也就是下图中的…...
会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场
11月26日,2024紫光展锐全球合作伙伴大会在上海举办,作为紫光展锐年度盛会,吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年,共同面向5G、AI和卫星通信为代表的前沿科技,聚焦技术…...
IDEA报错: java: JPS incremental annotation processing is disabled 解决
起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错,信息如下 java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process “jps.track.ap.depen…...
面对深度伪造:OWASP发布专业应对指南
从美国大选造谣视频到AI编写的网络钓鱼邮件,深度伪造(deepfake)诈骗和生成式人工智能攻击日益猖獗,人眼越来越难以辨识,企业迫切需要为网络安全团队制定AI安全事件响应指南。 深度伪造攻击威胁日益增加 全球范围内&…...
IDEA全局设置-解决maven加载过慢的问题
一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…...
【阅读笔记】Android广播的处理流程
关于Android的解析,有很多优质内容,看了后记录一下阅读笔记,也是一种有意义的事情, 今天就看看“那个写代码的”这位大佬关于广播的梳理, https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…...
queue 和 Stack
import scala.collection.mutable //queue:队列.排队打饭.... //特点:先进先出 //Stack:栈 //特点:先进后出 class ob5 { def main(args: Array[String]): Unit { val q1 mutable.Queue(1) q1.enqueue(2)//入队 q1.enqueue(3)//入队 q1.enqueue(4)…...
C#窗体小程序计算器
使其能完成2个数的加、减、乘、除基本运算。界面如下图,单击相应的运算符按钮,则完成相应的运算,并将结果显示出来,同时不允许在结果栏中输入内容 代码如下: private void button1_Click(object sender, EventArgs e)…...
Linux——自定义简单shell
shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …...
大模型开发和微调工具Llama-Factory-->WebUI
WebUI LLaMA-Factory 支持通过 WebUI 零代码微调大模型。 通过如下指令进入 WebUI llamafactory-cli webui# 如果是国内, # USE_MODELSCOPE_HUB 设为 1,表示模型从 ModelScope 魔搭社区下载。 # 避免从 HuggingFace 下载模型导致网速不畅 USE_MODELSC…...
【网络】应用层协议HTTPHTTPcookie与sessionHTTPS协议原理
主页:醋溜马桶圈-CSDN博客 专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.应用层协议HTTP 2.认识 URL 2.1 urlencode 和 urldecode 3.HTTP 协议请求与响应格式 3.1 HTTP 请求 3.2 HTTP 响应 …...
基于LSTM的文本多分类任务
概述: LSTM(Long Short-Term Memory,长短时记忆)模型是一种特殊的循环神经网络(RNN)架构,由Hochreiter和Schmidhuber于1997年提出。LSTM被设计来解决标准RNN在处理序列数据时遇到的长期依赖问题…...
Git忽略文件
在Git中,你可以通过修改 .gitignore 文件来忽略整个文件夹。以下是具体步骤: 打开或创建 .gitignore 文件 确保你的项目根目录下有一个 .gitignore 文件。如果没有,创建一个: touch .gitignore 在 .gitignore 文件中添加要忽略…...
Spring的事务管理
tx标签用于配置事务管理用于声明和配置事务的相关属性 transaction-manager指定一个事务管理器的引用,用于管理事务的生命周期。propagation指定事务的传播属性,决定了在嵌套事务中如何处理事务。isolation指定事务的隔离级别,用于控制事务之…...
java int值可以直接赋值给char类型 详解
在 Java 中,int 值可以直接赋值给 char 类型,但有一定的限制和机制。以下是详细的解释: 1. Java 中的 char 和 int 类型关系 char 的本质 char 是一个 16 位无符号整数类型,用于表示 Unicode 字符。范围为 0 到 65535࿰…...
淘宝商品数据获取:Python爬虫技术的应用与实践
引言 随着电子商务的蓬勃发展,淘宝作为中国最大的电商平台之一,拥有海量的商品数据。这些数据对于市场分析、消费者行为研究、商品推荐系统等领域具有极高的价值。然而,如何高效、合法地从淘宝平台获取这些数据,成为了一个技术挑…...
【力扣】389.找不同
问题描述 思路解析 只有小写字母,这种设计参数小的,直接桶排序我最开始的想法是使用两个不同的数组,分别存入他们单个字符转换后的值,然后比较是否相同。也确实通过了 看了题解后,发现可以优化,首先因为t相…...
何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...
pnpm安装electron出现postinstall$ node install.js报错
pnpm install --registryhttp://registry.npm.taobao.org安装依赖包的时候出现了postinstall$ node install.js报错 找到install.js 找到downloadArtifact方法,添加如下代码 mirrorOptions:{mirror:"http://npmmirror.com/mirrors/electron/"}http://n…...
如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件
如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件 在使用 Hugging Face 的数据集进行模型训练时,有时我们并不需要整个数据集,尤其是当数据集非常大时。为了节省存储空间和提高训练效率,我们可以从数据集中随机采样一部分数…...
Rook入门:打造云原生Ceph存储的全面学习路径(上)
文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.2 获取rook最新版本3.3 rook资源文件目录结构3.4 部署Rook/CRD/Ceph集群3.5 查看rook部…...
AWS账号提额
Lightsail提额 控制台右上角,用户名点开,选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...
计算机网络(三)
一个IP包,其数据长度为4900字节,通过一个MTU为1220字节的网络时,路由器的分片情况如何?请用图表的形式表示出路由器分片情况。 已知 IP 包的数据长度为 4900 字节,IP 首部长度通常为 20 字节,所以整个 IP …...
去哪儿Android面试题及参考答案
TCP 的三次握手与四次挥手过程是什么? TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议 ,三次握手和四次挥手是其建立连接和断开连接的重要过程。 三次握手过程 第一次握手:客户端向服务器发送一个 SYN(同步序列号)包,其中包…...
探索温度计的数字化设计:一个可视化温度数据的Web图表案例
随着科技的发展,数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面,传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表,该图表通过动态数据可视化展示了温度值,并通过渐变色…...
JS API事件监听(绑定)
事件监听 语法 元素对象.addEventListener(事件监听,要执行的函数) 事件监听三要素 事件源:那个dom元素被事件触发了,要获取dom元素 事件类型:用说明方式触发,比如鼠标单击click、鼠标经过mouseover等 事件调用的函数&#x…...
【k8s】kube-state-metrics 和 metrics-server
kube-state-metrics 和 metrics-server 是 Kubernetes 生态系统中两个重要的监控组件,但它们的功能和用途有所不同。下面是对这两个组件的详细介绍: kube-state-metrics 功能: kube-state-metrics 是一个简单的服务,它监听 Kub…...