当前位置: 首页 > news >正文

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络

使用Python3.9+CUDA11.8+Pytorch实现一个CNN优化版的对抗神经网络

  • 简单的GAN图片生成
    简单的GAN图片生成

  • CNN优化后的图片生成
    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()的常见方法:

  1. 模型架构调整:

    • 确保模型具有足够的容量(即参数数量)来捕捉数据的复杂性,但也要避免过拟合。

    • 使用正则化技术,如L1、L2正则化,或dropout层来减少过拟合。

  2. 数据预处理:

    • 对输入数据进行适当的缩放和归一化,使其分布在模型更容易处理的范围内。

    • 确保标签数据是二进制的(0或1),因为nn.BCELoss()期望的是这种格式。

  3. 损失函数输入:

    • 确保传递给nn.BCELoss()的预测值是原始得分(logits),而不是已经通过sigmoid函数转换过的概率。nn.BCELoss()内部会对这些得分应用sigmoid函数。

  4. 学习率和优化器:

    • 使用合适的学习率。学习率太高可能导致训练不稳定,而学习率太低则会使训练过程收敛缓慢。

    • 选择合适的优化器,如SGD、Adam或RMSprop,并调整其超参数(如动量、权重衰减)。

  5. 批量大小:

    • 尝试不同的批量大小以找到最佳的内存使用效率和梯度估计。

  6. 训练过程监控:

    • 定期监控训练损失和验证损失,以及任何其他相关指标(如准确率)。

    • 使用早停(early stopping)策略来防止过拟合,即在验证损失停止改善时停止训练。

  7. 梯度裁剪:

    • 如果遇到梯度爆炸问题,可以尝试使用梯度裁剪来限制梯度的最大范数。

  8. 标签平滑:

    • 在某些情况下,对标签应用标签平滑可以减少模型对错误标签的过度自信,从而改善泛化能力。

  9. 数据增强:

    • 对输入数据进行增强(如旋转、翻转、缩放等),以增加数据多样性,减少过拟合。

  10. 模型集成:

    • 通过训练多个模型并将它们的预测结果结合起来(如通过平均或投票),可以提高整体性能。

请注意,这些优化策略并不是孤立的,而是应该相互结合使用,以找到最适合特定任务和数据的组合。此外,对于每个任务和数据集,最佳实践可能会有所不同,因此通常需要进行实验和调整来找到最佳配置。


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=1N[yilog(xi)+(1yi)log(1xi)]
其中:

• 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)…...

vscode使用Marscode编程助手

下载 vscode 在插件里下载Marscode编程助手 插件完成 在这里点击安装,点击后这里出现AI编程插件。...

网络分析仪测试S参数

S参数的测试 一:S参数的定义 S参数(Scattering Parameters,散射参数)是一个表征器件在射频信号激励下的电气行为的工具,它以输入信号、输出信号为元素的矩阵来表现DUT的“传输”和“散射”效应,输入、输出…...

docker mysql5.7如何设置不区分大小写

环境 docker部署,镜像是5.7,操作系统是centos 操作方式 mysql 配置文件是放在 /etc/mysql/mysql.conf.d/mysqld.cnf, vim /etc/mysql/mysql.conf.d/mysqld.cnf lower_case_table_names1 重启mysql容器 验证 SHOW VARIABLES LIKE low…...

【1】Word:邀请函

目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开,wps打开作答无效☞作答完毕,F12或者手动另存为(考生文件夹:路径文件名) 注意:一定要检查,很有可能你前面步…...

【gin】中间件使用之jwt身份认证和Cors跨域,go案例

Gin-3 中间件编程及 JWT 身份认证 1. Gin 中间件概述 中间件是处理 HTTP 请求的函数,可以在请求到达路由处理函数之前或之后对请求进行处理。 在 Gin 框架中,中间件常用于处理日志记录、身份验证、权限控制等功能。 router : gin.Default() router.Us…...

【JAVA实战】@FeignClient注解类通用请求封装

背景 最近在编写多个系统数据集成过程中,经常会使用到FeignClient注解标记一个类,类里面编写很多请求方法,如果第三方系统有非常多的URL请求,每个方法对应一个URL请求,那么这个类就会非常的庞大,是否有一种…...

[c语言日寄]精英怪:三子棋(tic-tac-toe)3命慢通[附免费源码]

哈喽盆友们,今天带来《c语言》游戏中[三子棋boss]速通教程!我们的目标是一边编写博文,一边快速用c语言实现三子棋游戏。准备好瓜子,我们计时开始! 前期规划 在速通中,我们必须要有清晰的前期规划&#xf…...

GORM(Go语言数据交互库)

GORM(Go ORM,即对象关系映射)是Go语言中非常流行且功能强大的数据库交互库。它简化了与关系型数据库的交互过程,提供了丰富的API来处理各种数据库操作。下面将详细介绍GORM的功能、使用方法和一些高级特性。 1. 安装 首先&#…...

Redis主从同步是怎么实现的?

Redis主从同步是怎么实现的? 主从节点建立连接后,从节点会进行判断: 1.如果这是从节点之前没有同步过数据 属于初次复制,会进行全量重同步,那么从节点会向主节点发送PSYNC?-1 命令,请求主节点进行全量重…...

Flutter中Get.snackbar避免重复显示的实现

在pubspec.yaml中引入依赖框架。 #GetX依赖注解get: ^4.6.5创建一个SnackBarManager管理类去管理每个提示框。 import package:get/get.dart; import package:flutter/material.dart;class SnackBarManager {factory SnackBarManager() > instance;static final SnackBarMa…...

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo:编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo:编辑学生信息 4.TreeWidget控件 核心方法 核心信号…...

深入Android架构(从线程到AIDL)_32 JNI架构原理_Java与C的对接05

1、EIT造形观点 基于熟悉的EIT造形&#xff0c;很容易理解重要的架构设计决策议题。 前言 2、混合式EIT造形 一般EIT造形是同语言的。也就是<E>、 <I>和<T>都使用同一种语言撰写的&#xff0c;例如上述的Java、 C/C等。于此&#xff0c;将介绍一个EIT造…...

【gRPC】clientPool 客户端连接池简单实现与go案例

什么是 gRPC 客户端连接池&#xff1f; 在 gRPC 中&#xff0c;创建和维护一个到服务器的连接是非常消耗资源的&#xff08;比如 TCP 连接建立和 TLS 握手&#xff09;。 而在高并发场景下&#xff0c;如果每次请求都创建新的连接&#xff0c;不仅会导致性能下降&#xff0c;还…...

Android 15应用适配指南:所有应用的行为变更

Android系统版本适配&#xff0c;一直是影响App上架Google Play非常重要的因素。 当前Google Play政策规定 新应用和应用更新 必须以 Android 14&#xff08;API 级别 34&#xff09;为目标平台&#xff0c;才能提交到Google Play。现有应用 必须以 Android 13&#xff08;AP…...

24-25-1-单片机开卷部分习题和评分标准

依据相关规定试卷必须按评分标准进行批改。 给分一定是宽松的&#xff0c;能给分一定给&#xff0c;如有疑问也可以向学院教务办申请查卷。 一部分学生期末成绩由于紧张或其他原因导致分数过低&#xff0c;也是非常非常遗憾的。 个人也是非常抱歉的。 开卷考试 简答题 第一…...

STM32第6章、WWDG

一、简介 WWDG&#xff1a;全称Window watchdog&#xff0c;即窗口看门狗&#xff0c;本质上是一个能产生系统复位信号和提前唤醒中断的计数器。 特性&#xff1a; 是一个递减计数器。 看门狗被激活后&#xff0c; 当递减计数器值从 0x40减到0x3F时会产生复位&#xff08;即T6位…...

汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮

故障现象  一辆2007款法拉利599 GTB车&#xff0c;搭载6.0 L V12自然吸气发动机&#xff08;图1&#xff09;&#xff0c;累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车&#xff0c;发动机怠速轻微抖动&#xff0c;…...

C语言-数据结构-队列

目录 1.队列的特点 2.队列的实现 2.1.初始化队列 2.2.入队列 2.2.1.入空队列 2.2.2.入非空队列 2.3.出队列 2.4.销毁队列 2.5.完整代码 3.实际应用 1.队列的特点 队列是一种常见的数据结构&#xff0c;它遵循先进先出&#xff08;FIFO, First In First Out&#xff09…...

STL之VectorMapList针对erase方法踩坑笔记

前沿 如下总结的三种容器&#xff0c;开头都会涉及当前容器的特点&#xff0c;再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器&#xff0c;存储内存是连续&#xff0c;且特点支持快速访问&#xff0c;但是插入和删除效率比较地(需要找查找和移动)。另…...

梯度下降法为什么要提前停止

什么是提前停止&#xff08;Early Stopping&#xff09;&#xff1f; 提前停止是一种正则化技术&#xff0c;用于在训练机器学习模型&#xff08;特别是神经网络&#xff09;时防止过拟合。它的核心思想是通过监控模型在验证集上的性能&#xff0c;在性能开始恶化之前停止训练…...

【vue3项目使用 animate动画效果】

vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示&#xff1a;干货篇&#xff0c;不废话&#xff0c;点赞收藏&#xff0c;用到会后好找藕~ 点击这里&#xff0c;直接看官网哦 &#x1f449; 官网地址&#…...

1.1.1 C语言常用的一些函数(持续更新)

总框架见&#xff08;0. 总框架-CSDN博客&#xff09; &#xff08;1&#xff09;socket (a)分配fd&#xff1b;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…...

李宏毅机器学习课程笔记03 | 类神经网络优化技巧

文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training&#xff1a;Batch and MomentumSmall Batch vs Large Batch回顾&#xff1a;optimization优化 找到参数使L最小问题&#xff1a;为什么要用Batch&#xff…...

简洁明快git入门及github实践教程

简洁明快git入门及github快速入门实践教程 前言git知识概要&#xff1a;一&#xff1a;什么是 Git&#xff1f;二&#xff1a;安装 Git三&#xff1a;配置 Git配置git的用户名和邮箱地址创建仓库 四&#xff1a;Git实践五&#xff1a;远程仓库操作&#xff08;基于git命令使用G…...

Python使用socket实现简易的http服务

在接触的一些项目中&#xff0c;有时为了方便可视化一些服务状态&#xff08;请求数很少&#xff09;&#xff0c;那么很容易想到使用http服务来实现。但开源的web后端框架&#xff0c;例如flask&#xff0c;fastapi&#xff0c;django等略显沉重&#xff0c;且使用这些框架会有…...

【Hive】海量数据存储利器之Hive库原理初探

文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…...

linux系统监视(centos 7)

一.系统监视 1.安装iostat&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…...

Blazor中Syncfusion图像编辑器组件使用方法

Blazor中Syncfusion图像编辑器组件是一个功能丰富的图像处理工具&#xff0c;支持多种编辑、操作和交互方式&#xff0c;帮助用户高效处理图像。以下是该组件的主要功能总结&#xff1a; 主要功能&#xff1a; 图像打开与保存 图像编辑器允许用户通过简单的点击操作打开支持的…...

电动汽车V2G技术Matlab/Simulink仿真模型

今天给大家更新关于V2G技术的仿真&#xff0c;不是研究这个方向的&#xff0c;可能会对这个名称比较陌生&#xff0c;那么&#xff0c;什么是“V2G”&#xff1f; V2G全称&#xff1a;Vehicle-to-Grid&#xff0c;即车网互动&#xff0c;利用电动汽车特有的储能功能与电网“双…...