深度学习——生成对抗网络(GAN)

embedded/2024/12/23 2:05:17/

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:深度学习——生成对抗网络(GAN)

文章目录

    • 生成图像
      • 步骤1: 随机游走生成边
      • 步骤2: 构建图生成器(Generator)和判别器(Discriminator)
      • 步骤3: GAN训练循环

在这里插入图片描述

生成图像

生成对抗网络(GAN)是一种基于模拟深度学习模型的机器学习方法,它使用两个具有不同特征的网络来训练生成图像。生成图像可以通过以下步骤实现:

  • 生成原始图像。
  • 将生成的图像与真实图像进行对比,以检测差异并调整参数以提高质量。
  • 训练一个新图像生成器,用于生成新的图像。

PYTHON代码示例

IMPORT NUMPY AS NP
FROM KERAS.MODELS IMPORT SEQUENTIAL
FROM KERAS.LAYERS IMPORT DENSE, FLATTEN, CONV2D, MAXPOOLING2D
FROM KERAS.OPTIMIZERS IMPORT ADAM
FROM KERAS.PREPROCESSING.IMAGE IMPORT IMAGEDATAGENERATOR# 定义模型结构
MODEL = SEQUENTIAL()# 输入层
MODEL.ADD(CONV2D(64, (5, 5), ACTIVATION='RELU', INPUT_SHAPE=(64, 64, 3)))
MODEL.ADD(MAXPOOLING2D(POOL_SIZE=(2, 2)))# 全连接层
MODEL.ADD(FLATTEN())
MODEL.ADD(DENSE(1024, ACTIVATION='RELU'))
MODEL.ADD(DROPOUT(0.5))
MODEL.ADD(DENSE(1, ACTIVATION='SIGMOID'))# 编译模型
MODEL.COMPILE(OPTIMIZER=ADAM(), LOSS='BINARY_CROSSENTROPY')# 加载数据集和预处理函数
TRAIN_DATAGEN = IMAGEDATAGENERATOR(RESCALE=1./255,SHEAR_RANGE=0.2,ZOOM_RANGE=0.2,HORIZONTAL_FLIP=TRUE)TEST_DATAGEN = IMAGEDATAGENERATOR(RESCALE=1./255)TRAINING_SET = TRAIN_DATAGEN.FLOW_FROM_DIRECTORY('DATA/TRAIN',TARGET_SIZE=(64, 64),BATCH_SIZE=32,CLASS_MODE='BINARY')VALIDATION_SET = TEST_DATAGEN.FLOW_FROM_DIRECTORY('DATA/VALIDATION',TARGET_SIZE=(64, 64),BATCH_SIZE=32,CLASS_MODE='BINARY')# 训练模型
MODEL.FIT_GENERATOR(TRAINING_SET,STEPS_PER_EPOCH=64,EPOCHS=10,VALIDATION_DATA=VALIDATION_SET,VALIDATION_STEPS=64)# 预测
IMAGE = NP.RANDOM.RAND(64, 64, 3)
PREDICTED_IMAGE = MODEL.PREDICT(IMAGE)PRINT(PREDICTED_IMAGE[0])

这段代码首先导入了必要的库,定义了一个模型结构,并编译模型。然后加载数据集,对数据进行预处理,接着训练模型。最后预测一个新的图像,并打印出预测结果。

要生成一个图结构数据的生成网络(GAN),我们可以基于随机游走的方法来生成节点间的边,并使用神经网络来优化这个过程,确保生成的图具有我们期望的特性。下面是一个简化版的示例代码,它包括了随机游走生成边的逻辑以及一个基本的生成对抗网络框架来学习生成更真实的图结构。注意,这个例子主要用于教学目的,实际应用中可能需要根据具体需求调整模型结构、损失函数等。

步骤1: 随机游走生成边

首先,我们需要一个简单的函数来执行随机游走并返回边的提议集。

import numpy as npdef random_walks(start_nodes, num_walks, walk_length):"""执行随机游走并收集边提议。参数:- start_nodes: 起始节点列表- num_walks: 每个节点进行的随机游走次数- walk_length: 随机游走的长度返回:- edges_proposal: 边的提议集"""nodes = set(range(1, 2709))  # 假设节点编号从1到2708edges_proposal = []for _ in range(num_walks):for node in start_nodes:walk = [node]for _ in range(walk_length-1):neighbors = list(nodes.difference(set(walk)))if not neighbors: break  # 如果没有未访问的邻居,则停止next_node = np.random.choice(neighbors)walk.append(next_node)edges_proposal.append((walk[-2], walk[-1]))  # 记录边return edges_proposal

步骤2: 构建图生成器(Generator)和判别器(Discriminator)

接下来,我们将构建一个简单的图生成器(使用全连接层作为示例),它将节点特征作为输入,尝试预测生成的邻接矩阵元素的概率。同时,构建一个判别器来区分真实图的邻接矩阵与生成的邻接矩阵。

这里简化处理,不直接实现复杂图结构的生成器,而是通过生成边概率矩阵的方式来示意如何构建GAN。实际中,你可能需要设计更复杂的模型来直接生成邻接矩阵或其变种表示。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Reshape
from tensorflow.keras.optimizers import Adamdef build_generator(input_dim, output_dim):model = Sequential([Dense(128, input_shape=(input_dim,), activation='relu'),Dense(output_dim, activation='sigmoid')])return modeldef build_discriminator(input_dim):model = Sequential([Dense(128, input_shape=(input_dim,), activation='relu'),Dense(1, activation='sigmoid')])return model# 假设每个节点有10维特征
node_features_dim = 10
num_nodes = 2708
adj_matrix_dim = num_nodes * num_nodes  # 邻接矩阵展平后的维度generator = build_generator(node_features_dim, adj_matrix_dim)
discriminator = build_discriminator(adj_matrix_dim)# 编译模型
generator_optimizer = Adam(learning_rate=0.0002)
discriminator_optimizer = Adam(learning_rate=0.0002)discriminator.compile(optimizer=discriminator_optimizer, loss='binary_crossentropy', metrics=['accuracy'])

步骤3: GAN训练循环

接下来是GAN的训练循环,这包括交替训练生成器和判别器。这里我们简化处理,仅展示基本流程框架。

import tensorflow as tf# 假设我们已经有了真实图的邻接矩阵表示
real_adj_matrix_flattened = ...  # 你需要提供真实图的邻接矩阵并展平epochs = 100
batch_size = 32for epoch in range(epochs):# 训练判别器noise = tf.random.normal(shape=(batch_size, node_features_dim))generated_adj = generator(noise)real_labels = tf.ones((batch_size, 1))fake_labels = tf.zeros((batch_size, 1))d_loss_real = discriminator.train_on_batch(real_adj_matrix_flattened, real_labels)d_loss_fake = discriminator.train_on_batch(generated_adj, fake_labels)d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)# 训练生成器noise = tf.random.normal(shape=(batch_size, node_features_dim))valid_y = tf.ones((batch_size, 1))g_loss = discriminator.train_on_batch(generator(noise), valid_y)print(f"Epoch {epoch}, D Loss: {d_loss[0]}, G Loss: {g_loss}")print("Training completed.")

  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述


http://www.ppmy.cn/embedded/125004.html

相关文章

[Algorithm][贪心][整数替换][俄罗斯套娃信封问题]详细讲解

目录 1.整数替换1.题目链接2.算法原理详解1.解法一2.解法二 3.代码实现1.代码一2.代码二 2.俄罗斯套娃信封问题1.题目链接2.算法原理详解1.解法一2.解法二 3.代码实现1.代码一2.代码二 1.整数替换 1.题目链接 整数替换 2.算法原理详解 1.解法一 思路:模拟(递归 …

攻防世界----->Replace

前言:做题笔记。 下载 查壳。 upx32脱壳。 32ida打开。 先运行看看: 没有任何反应? 猜测又是 地址随机化(ASLR)---遇见过。 操作参考: 攻防世界---->Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客 然后…

【Spring】@RequestMapping、@RestController和Postman

文章目录 1.RequestMapping 注解介绍2. RequestMapping 使用3. RequestMapping 是 GET 还是 POST 请求?GET 请求POST 请求指定 GET/POST 方法类型 2. Postman 介绍1. 创建请求2. 传参介绍1. 普通传参2. form-data3. x-www-form-urlencoded4. raw 1.RequestMapping 注…

mysql学习教程,从入门到精通,SQL 创建索引(CREATE INDEX 语句)(35)

1、SQL 创建索引(CREATE INDEX 语句) 在SQL中,创建索引(CREATE INDEX)是一种用于提高数据库查询性能的方法。索引类似于书的目录,通过它可以更快地定位到表中的特定行。以下是一个创建索引的示例,以及对其各部分的解释…

【数据结构】【顺序表算法】 删除特定范围内的元素

题目&#xff1a;从顺序表中删除其值在给定值s和t之间&#xff08;s<t&#xff09;的所有元素&#xff0c;若s或t不合理或顺序表为空&#xff0c;则显示错误信息并退出运行 bool Del_s_t(SqList &L,ElemType s,ElemType t){int i,k0;if(L.length0||s>t){return fals…

【Java】—— 数据结构与集合源码:数据结构概述与线性表、二叉树

1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 战术和策略&#xff1a;数据结构 上…

C++——string类

目录 前言&#xff1a; 一、C语言中字符串的缺陷 二、string常见接口极其调用 1.构造及遍历 2.、、[]、<<、>>运算符重载 3.string自身属性接口 4.增删查改接口 三、模拟实现 前言&#xff1a; 严格来说&#xff0c;string类并不属于STL中的一部分&#xf…

Linux 线程

目录 一.线程的概念 1.什么是线程&#xff1f; 2.Linux 系统对线程的实现 线程比进程要更轻量化体现在什么方面&#xff1f;&#xff1f; 线程切换较进程切换效率高的原因&#xff1f;&#xff1f; ①cache缓存&#xff08;主要原因&#xff09; ②寄存器的刷新&#xff…