【机器学习】机器学习的重要技术——生成对抗网络:理论、算法与实践

引言

生成对抗网络(Generative Adversarial Networks, GANs)由Ian Goodfellow等人在2014年提出,通过生成器和判别器两个神经网络的对抗训练,成功实现了高质量数据的生成。GANs在图像生成、数据增强、风格迁移等领域取得了显著成果,成为深度学习的重要分支。本文将深入探讨GANs的基本原理、核心算法及其在实际中的应用,并提供代码示例以帮助读者更好地理解和掌握这一技术。
在这里插入图片描述

第一章 GANs的基本概念

1.1 什么是生成对抗网络

生成对抗网络由两个相互对抗的神经网络组成:生成器(Generator)和判别器(Discriminator)。生成器负责生成与真实数据相似的假数据,判别器负责区分真实数据和生成数据。生成器和判别器通过对抗训练,最终生成器能够生成逼真的数据,判别器难以区分其真伪。

1.2 GANs的基本结构
  • 生成器(Generator):接受随机噪声作为输入,生成与真实数据分布相似的样本。
  • 判别器(Discriminator):接受真实数据和生成数据作为输入,输出区分它们的概率。

GANs的目标是通过对抗训练,使得生成器生成的数据与真实数据无法区分,从而实现高质量的数据生成。

1.3 GANs的训练过程

GANs的训练过程可以概括为以下步骤:

  1. 初始化:随机初始化生成器和判别器的参数。
  2. 判别器训练:固定生成器的参数,更新判别器的参数,使其能够更好地区分真实数据和生成数据。
  3. 生成器训练:固定判别器的参数,更新生成器的参数,使其生成的数据能够欺骗判别器。
  4. 迭代:重复步骤2和3,直到生成器生成的数据与真实数据难以区分。

第二章 GANs的核心算法

2.1 标准GANs

标准GANs的损失函数由生成器和判别器的对抗损失组成。判别器的目标是最大化正确分类的概率,生成器的目标是最小化生成数据被判别器识别为假的概率。

import tensorflow as tf
from tensorflow.keras import layers# 生成器模型
def build_generator():model = tf.keras.Sequential()model.add(layers.Dense(256, activation='relu', input_dim=100))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Dense(512, activation='relu'))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Dense(1024, activation='relu'))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Dense(28 * 28 * 1, activation='tanh'))model.add(layers.Reshape((28, 28, 1)))return model# 判别器模型
def build_discriminator():model = tf.keras.Sequential()model.add(layers.Flatten(input_shape=(28, 28, 1)))model.add(layers.Dense(512, activation='relu'))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Dense(256, activation='relu'))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Dense(1, activation='sigmoid'))return model# 编译模型
generator = build_generator()
discriminator = build_discriminator()
discriminator.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# GAN模型
discriminator.trainable = False
gan_input = layers.Input(shape=(100,))
generated_image = generator(gan_input)
gan_output = discriminator(generated_image)
gan = tf.keras.models.Model(gan_input, gan_output)
gan.compile(optimizer='adam', loss='binary_crossentropy')# 加载MNIST数据集
(x_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
x_train = (x_train.astype('float32') - 127.5) / 127.5
x_train = np.expand_dims(x_train, axis=3)# 训练GANs
batch_size = 128
epochs = 10000
half_batch = int(batch_size / 2)for epoch in range(epochs):# 训练判别器idx = np.random.randint(0, x_train.shape[0], half_batch)real_images = x_train[idx]noise = np.random.normal(0, 1, (half_batch, 100))generated_images = generator.predict(noise)d_loss_real = discriminator.train_on_batch(real_images, np.ones((half_batch, 1)))d_loss_fake = discriminator.train_on_batch(generated_images, np.zeros((half_batch, 1)))d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)# 训练生成器noise = np.random.normal(0, 1, (batch_size, 100))valid_y = np.array([1] * batch_size)g_loss = gan.train_on_batch(noise, valid_y)if epoch % 1000 == 0:print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100 * d_loss[1]}] [G loss: {g_loss}]")
2.2 深度卷积生成对抗网络(DCGAN)

DCGAN通过在生成器和判别器中引入卷积层,显著提高了图像生成的质量。以下是一个基于DCGAN的示例。

def build_generator():model = tf.keras.Sequential()model.add(layers.Dense(7 * 7 * 256, use_bias=False, input_shape=(100,)))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Reshape((7, 7, 256)))model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))return modeldef build_discriminator():model = tf.keras.Sequential()model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[28, 28, 1]))model.add(layers.LeakyReLU())model.add(layers.Dropout(0.3))model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))model.add(layers.LeakyReLU())model.add(layers.Dropout(0.3))model.add(layers.Flatten())model.add(layers.Dense(1))return modelgenerator = build_generator()
discriminator = build_discriminator()# 编译判别器
discriminator.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# 编译GAN模型
discriminator.trainable = False
gan_input = layers.Input(shape=(100,))
generated_image = generator(gan_input)
gan_output = discriminator(generated_image)
gan = tf.keras.models.Model(gan_input, gan_output)
gan.compile(optimizer='adam', loss='binary_crossentropy')# 加载MNIST数据集
(x_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
x_train = (x_train.astype('float32') - 127.5) / 127.5
x_train = np.expand_dims(x_train, axis=3)# 训练DCGAN
batch_size = 128
epochs = 10000
half_batch = int(batch_size / 2)for epoch in range(epochs):# 训练判别器idx = np.random.randint(0, x_train.shape[0], half_batch)real_images = x_train[idx]noise = np.random.normal(0, 1, (half_batch, 100))generated_images = generator.predict(noise)d_loss_real = discriminator.train_on_batch(real_images, np.ones((half_batch, 1)))d_loss_fake = discriminator.train_on_batch(generated_images, np.zeros((half_batch, 1)))d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)# 训练生成器noise = np.random.normal(0, 1, (batch_size, 100))valid_y = np.array([1] * batch_size)g_loss = gan.train_on_batch(noise, valid_y)if epoch % 1000 == 0:print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100 * d_loss[1]}] [G loss: {g_loss}]")
2.3 条件生成对抗网络(Conditional GAN)

条件生成对抗网络(Conditional GAN, cGAN)通过在生成器和判别器中引入条件变量,使生成的数据能够满足特定条件。

def build_generator():model = tf.keras.Sequential()model.add(layers.Dense(7 * 7 * 256, use_bias=False, input_shape=(110,)))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Reshape((7, 7, 256)))model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))return modeldef build_discriminator():model = tf.keras.Sequential()model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[28, 28, 11]))model.add(layers.LeakyReLU())model.add(layers.Dropout(0.3))model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))model.add(layers.LeakyReLU())model.add(layers.Dropout(0.3))model.add(layers.Flatten())model.add(layers.Dense(1))return modelgenerator = build_generator()
discriminator = build_discriminator()# 编译判别器
discriminator.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# 编译cGAN模型
discriminator.trainable = False
noise_input = layers.Input(shape=(100,))
label_input = layers.Input(shape=(10,))
gan_input = layers.Concatenate()([noise_input, label_input])
generated_image = generator(gan_input)
label_image = layers.Concatenate()([generated_image, label_input])
gan_output = discriminator(label_image)
cgan = tf.keras.models.Model([noise_input, label_input], gan_output)
cgan.compile(optimizer='adam', loss='binary_crossentropy')# 加载MNIST数据集
(x_train, y_train), (_, _) = tf.keras.datasets.mnist.load_data()
x_train = (x_train.astype('float32') - 127.5) / 127.5
x_train = np.expand_dims(x_train, axis=3)
y_train = tf.keras.utils.to_categorical(y_train, 10)# 训练cGAN
batch_size = 128
epochs = 10000
half_batch = int(batch_size / 2)for epoch in range(epochs):# 训练判别器idx = np.random.randint(0, x_train.shape[0], half_batch)real_images = x_train[idx]real_labels = y_train[idx]noise = np.random.normal(0, 1, (half_batch, 100))generated_labels = np.random.randint(0, 10, half_batch)generated_labels = tf.keras.utils.to_categorical(generated_labels, 10)generated_images = generator.predict([noise, generated_labels])real_images_with_labels = np.concatenate([real_images, real_labels], axis=3)generated_images_with_labels = np.concatenate([generated_images, generated_labels], axis=3)d_loss_real = discriminator.train_on_batch(real_images_with_labels, np.ones((half_batch, 1)))d_loss_fake = discriminator.train_on_batch(generated_images_with_labels, np.zeros((half_batch, 1)))d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)# 训练生成器noise = np.random.normal(0, 1, (batch_size, 100))valid_y = np.array([1] * batch_size)labels = np.random.randint(0, 10, batch_size)labels = tf.keras.utils.to_categorical(labels, 10)g_loss = cgan.train_on_batch([noise, labels], valid_y)if epoch % 1000 == 0:print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100 * d_loss[1]}] [G loss: {g_loss}]")

在这里插入图片描述

第三章 GANs的应用实例

3.1 图像生成

GANs在图像生成任务中表现出色,可以生成高质量的图像。以下是一个使用DCGAN生成手写数字图像的示例。

import matplotlib.pyplot as plt# 生成手写数字图像
noise = np.random.normal(0, 1, (25, 100))
generated_images = generator.predict(noise)# 绘制生成的图像
plt.figure(figsize=(10, 10))
for i in range(generated_images.shape[0]):plt.subplot(5, 5, i + 1)plt.imshow(generated_images[i, :, :, 0], cmap='gray')plt.axis('off')
plt.tight_layout()
plt.show()
3.2 数据增强

GANs可以用于数据增强,通过生成新的样本扩展训练数据集,从而提高模型的泛化能力。以下是一个使用cGAN生成带标签的手写数字图像的示例。

# 生成带标签的手写数字图像
noise = np.random.normal(0, 1, (25, 100))
labels = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 2 + [0, 1, 2, 3, 4])
labels = tf.keras.utils.to_categorical(labels, 10)
generated_images = generator.predict([noise, labels])# 绘制生成的图像
plt.figure(figsize=(10, 10))
for i in range(generated_images.shape[0]):plt.subplot(5, 5, i + 1)plt.imshow(generated_images[i, :, :, 0], cmap='gray')plt.axis('off')
plt.tight_layout()
plt.show()
3.3 风格迁移

GANs可以用于风格迁移,通过将一种图像的内容与另一种图像的风格结合,生成具有新风格的图像。以下是一个使用CycleGAN进行图像风格迁移的示例。

import tensorflow as tf
import tensorflow_addons as tfa
from tensorflow.keras import layersdef residual_block(x, filters, kernel_size=3):fx = layers.Conv2D(filters, kernel_size, padding='same')(x)fx = tfa.layers.InstanceNormalization()(fx)fx = layers.ReLU()(fx)fx = layers.Conv2D(filters, kernel_size, padding='same')(fx)fx = tfa.layers.InstanceNormalization()(fx)x = layers.Add()([x, fx])return xdef build_generator():inputs = layers.Input(shape=[256, 256, 3])x = layers.Conv2D(64, 7, padding='same')(inputs)x = tfa.layers.InstanceNormalization()(x)x = layers.ReLU()(x)x = layers.Conv2D(128, 3, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.ReLU()(x)x = layers.Conv2D(256, 3, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.ReLU()(x)for _ in range(9):x = residual_block(x, 256)x = layers.Conv2DTranspose(128, 3, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.ReLU()(x)x = layers.Conv2DTranspose(64, 3, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.ReLU()(x)x = layers.Conv2D(3, 7, padding='same')(x)x = layers.Activation('tanh')(x)return tf.keras.Model(inputs, x)def build_discriminator():inputs = layers.Input(shape=[256, 256, 3])x = layers.Conv2D(64, 4, strides=2, padding='same')(inputs)x = layers.LeakyReLU(alpha=0.2)(x)x = layers.Conv2D(128, 4, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.LeakyReLU(alpha=0.2)(x)x = layers.Conv2D(256, 4, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.LeakyReLU(alpha=0.2)(x)x = layers.Conv2D(512, 4, strides=2, padding='same')(x)x = tfa.layers.InstanceNormalization()(x)x = layers.LeakyReLU(alpha=0.2)(x)x = layers.Conv2D(1, 4, padding='same')(x)return tf.keras.Model(inputs, x)# 构建CycleGAN模型
generator_g = build_generator()
generator_f = build_generator()
discriminator_x = build_discriminator()
discriminator_y = build_discriminator()# 编译模型
generator_g.compile(optimizer='adam', loss='mse')
generator_f.compile(optimizer='adam', loss='mse')
discriminator_x.compile(optimizer='adam', loss='mse')
discriminator_y.compile(optimizer='adam', loss='mse')# 训练CycleGAN
# 训练数据准备和训练代码略# 使用CycleGAN进行风格迁移
def generate_images(model, test_input):prediction = model(test_input)plt.figure(figsize=(12, 12))display_list = [test_input[0], prediction[0]]title = ['Input Image', 'Predicted Image']for i in range(2):plt.subplot(1, 2, i + 1)plt.title(title[i])plt.imshow(display_list[i] * 0.5 + 0.5)plt.axis('off')plt.show()# 测试图像
test_image = tf.expand_dims(tf.image.resize(test_image, (256, 256)), axis=0) / 127.5 - 1
generate_images(generator_g, test_image)

在这里插入图片描述

第四章 GANs的未来发展与挑战

4.1 训练稳定性

GANs的训练过程容易出现不稳定性,如模式崩溃(mode collapse)和梯度消失等问题。研究如何提高GANs训练的稳定性是一个重要的方向。

4.2 模型评价

如何有效评估GANs生成数据的质量和多样性是一个挑战。研究方向包括开发更好的评价指标,如Frechet Inception Distance(FID)和Inception Score(IS)等。

4.3 应用扩展

GANs的应用范围不断扩大,研究如何在更多领域和任务中应用GANs,如文本生成、音频生成和科学模拟等,是一个重要的方向。

结论

生成对抗网络作为一种强大的生成模型,通过生成器和判别器的对抗训练,实现了高质量的数据生成和多种应用。本文详细介绍了GANs的基本概念、核心算法及其在实际中的应用,并提供了具体的代码示例,帮助读者深入理解和掌握这一技术。希望本文能够为您进一步探索和应用生成对抗网络提供有价值的参考。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetCode.97. 交错字符串

leetCode.97. 交错字符串 题目思路 代码 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int n s1.size(), m s2.size();if ( s3.size() ! n m ) return false;vector<vector<bool>> f( n 1, vector<bool> (m 1));s1 …

Sparse4D v3: Advancing End-to-End 3D Detection and Tracking

Sparse4D v3: Advancing End-to-End 3D Detection and Tracking 相关内容&#xff1a;总览&#xff0c;Sparse4D v1&#xff0c;Sparse4D v2&#xff0c; 单位&#xff1a;地平线(Sparse4D v1 v2 原班人马) GitHub&#xff1a;https://github.com/HorizonRobotics/Sparse4D …

昇思25天学习打卡营第5天 | 网络构建

目录 1.定义模型类 2.模型层 nn.Flatten nn.Dense nn.ReLU nn.SequentialCell nn.Softmax 3.模型参数 代码实现&#xff1a; 总结 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c; mindspore.nn提供了常见神经网络层的实现&#xff0c; 在MindSpore中&a…

AI智能客服项目拆解(1) 产品大纲

本文作为拆解AI智能客服项目的首篇&#xff0c;以介绍产品大纲为主。后续以某AI智能客服产品为例&#xff0c;拆解相关技术细节。 AI智能客服是一种基于人工智能技术的客户服务解决方案&#xff0c;旨在提高客户满意度和优化企业运营。利用人工智能和自然语言处理技术&#xff…

MySQL之索引失效的情况

什么情况下索引会失效&#xff1f; 违反最左前缀原则范围查询右边的列不能使用索引不要在索引列上进行运算操作字符串不加单引号导致索引失效以%开头的like模糊查询 什么情况下索引会失效&#xff1f; 示例&#xff0c;有user表如下 CREATE TABLE user (id bigint(20) NOT NU…

JAVA期末速成库(11)第十二章

一、习题介绍 第十二章 Check Point&#xff1a;P454 12.1&#xff0c;12.9&#xff0c;12.10&#xff0c;12,12 二、习题及答案 12.1 What is the advantage of using exception handling? 12.1使用异常处理的优势是什么? 答:使用异常处理有以下优势&#xff1a; 1. 提高…

Spark join数据倾斜调优

Spark中常见的两种数据倾斜现象如下 stage部分task执行特别慢 一般情况下是某个task处理的数据量远大于其他task处理的数据量&#xff0c;当然也不排除是程序代码没有冗余&#xff0c;异常数据导致程序运行异常。 作业重试多次某几个task总会失败 常见的退出码143、53、137…

【电路笔记】-放大器类型

放大器类型 文章目录 放大器类型1、概述2、关于偏置的注意事项3、A类(Class A)放大器4、B类(Class B)放大器5、AB类(Class AB)放大器6、C类(Class C)放大器7、总结1、概述 放大器通常根据输出级的结构进行分类。 事实上,功率放大确实发生在该阶段,因此输出信号的质量和…

Java SE入门及基础(59) 线程的实现(上) 线程的创建方式 线程内存模型 线程安全

目录 线程&#xff08;上&#xff09; 1. 线程的创建方式 Thread类常用构造方法 Thread类常用成员方法 Thread类常用静态方法 示例 总结 2. 线程内存模型 3.线程安全 案例 代码实现 执行结果 线程&#xff08;上&#xff09; 1. 线程的创建方式 An application t…

利用 Docker 简化 Nacos 部署:快速搭建 Nacos 服务

利用 Docker 简化 Nacos 部署&#xff1a;快速搭建 Nacos 服务 引言 在微服务架构中&#xff0c;服务注册与发现是确保服务间通信顺畅的关键组件。Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;作为阿里巴巴开源的一个服务发现和配置管理平台&…

任务调度器——任务切换

一、开启任务调度器 函数原型&#xff1a; void vTaskStartScheduler( void ) 作用&#xff1a;用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c; FreeRTOS 便会开始进行任务调度 内部实现机制&#xff08;以动态创建为例&#xff09;&#xff1a; &#xff0…

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 下载页 ->Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人…

测评推荐:企业管理u盘的软件有哪些?

U盘作为一种便携的存储设备&#xff0c;方便易用&#xff0c;被广泛应用于企业办公、个人学习及日常工作中。然而&#xff0c;U盘的使用也带来了数据泄露、病毒传播等安全隐患。为了解决这些问题&#xff0c;企业管理U盘的软件应运而生。 本文将对市面上流行的几款U盘管理软件…

Hadoop3:Yarn容量调度器配置多队列案例

一、情景描述 需求1&#xff1a; default队列占总内存的40%&#xff0c;最大资源容量占总资源60%&#xff0c;hive队列占总内存的60%&#xff0c;最大资源容量占总资源80%。 二、多队列优点 &#xff08;1&#xff09;因为担心员工不小心&#xff0c;写递归死循环代码&#…

电路笔记(电源模块): 基于FT2232HL实现的jtag下载器硬件+jtag的通信引脚说明

JTAG接口说明 JTAG 接口根据需求可以选择20针或14针的配置&#xff0c;具体选择取决于应用场景和需要连接的功能。比如之前的可编程逻辑器件XC9572XL使用JTAG引脚&#xff08;TCK、TDI、TDO、TMS、VREF、GND&#xff09;用于与器件进行调试和编程通信。更详细的内容可以阅读11…

51单片机STC8H8K64U通过RA8889/RA8876如何控制彩屏(SPI源码下载)

【硬件部份】 一、硬件连接实物&#xff1a; STC8H系列单片机不需要外部晶振和外部复位&#xff0c;在相同的工作频率下&#xff0c;速度比传统的8051单片机要快12倍&#xff0c;具有高可靠抗干扰的优秀特性&#xff0c;与瑞佑的RA8889/RA8876控制芯片刚好可以完美搭配用于工…

redis实战-缓存雪崩问题及解决方案

定义理解 缓存雪崩是指在同一时间段&#xff0c;大量缓存的key同时失效&#xff0c;或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力 和缓存击穿的区别&#xff1a; 缓存雪崩是由于缓存中的大量数据同时失效或缓存服务器故障引起的&#xff1b…

机器学习周记(第四十五周:Graphformer)2024.6.24~2024.6.30

目录 摘要ABSTRACT1 论文信息1.1 论文标题1.2 论文摘要1.3 论文引言1.4 论文贡献 2 论文模型2.1 问题定义2.2 模型架构2.2.1 自注意下采样模块&#xff08;Self-attention down-sampling module&#xff09;2.2.2 稀疏图自注意力机制&#xff08;Sparse graph self-attention m…

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 的学习笔记&#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&a…

新手练习项目 7:猜数字游戏

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、项目描述二、项目实现三、项目步骤四、项目扩展方向 更多项目内容&#xff0c;请关注我、订…