【人工智能】--生成对抗网络

2a20c54b85e042bfa2440367ae4807e9.gif

https://blog.csdn.net/2302_76516899?spm=1000.2115.3001.5343

个人主页:欢迎来到 Papicatch的博客

 课设专栏 :学生成绩管理系统

专业知识专栏: 专业知识 

文章目录

🍉引言

🍉GAN 的基本原理

🍈生成器(Generator) 

🍈判别器(Discriminator)

🍈两者的对抗过程 

🍉GAN 的训练过程

🍈初始化

🍈生成器生成假数据

🍈判别器判断数据来源

🍈计算损失函数

🍈反向传播与参数更新

🍈重复训练 

🍈小结

🍉GAN 的应用领域

🍈图像生成

🍈视频生成 

🍈语音和音频生成

🍈自然语言处理

🍈医学领域

🍈数据增强

🍈工业设计

🍈金融领域

🍉GAN 的优点和挑战

🍈优点

🍈挑战 

🍉未来展望

🍈技术进步

🍈应用领域扩大

🍈产业影响加深

🍈与其他技术融合

🍈伦理和社会问题凸显

🍉示例

🍈示例流程

🍍定义模型

🍍超参数设置和数据准备

🍍初始化模型和优化器

🍍定义损失函数

🍍训练循环

🍍生成并展示图像

🍈代码实现

🍈代码解析

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉引言

        在当今的人工智能领域,生成对抗网络(GAN)无疑是一项引人注目的技术突破。它为我们提供了一种全新的方式来生成逼真的数据,从图像到音频,从文本到视频,GAN 的应用范围极其广泛。 

🍉GAN 的基本原理

        生成对抗网络(Generative Adversarial Network,GAN)的基本原理基于博弈论中的零和博弈思想。

🍈生成器(Generator) 

        生成器的作用是从随机噪声(通常是一个随机向量)出发,尝试生成与真实数据分布相似的数据。它就像是一个“造假者”,努力学习真实数据的特征和模式,以便能够生成足以以假乱真的样本。

        例如,在图像生成任务中,生成器可能由多层神经网络构成。输入的随机噪声经过一系列的卷积、反卷积、池化和激活函数等操作,逐渐生成具有一定结构和细节的图像。

        生成器的目标是使它生成的数据在判别器那里被误判为真实数据的概率尽可能高。为了实现这个目标,生成器不断调整自身的参数,优化生成结果。

🍈判别器(Discriminator)

        判别器则像是一个“警察”,负责判断输入的数据是来自真实数据分布还是由生成器生成的。它同样由神经网络构成,接收输入的数据,并输出一个概率值,表示该数据为真实数据的可能性。

        判别器通过学习真实数据的特征,来区分真实数据和生成器生成的假数据。它的目标是尽可能准确地判断数据的来源,从而给生成器提供反馈。

🍈两者的对抗过程 

        在训练过程中,生成器和判别器相互竞争、相互对抗。

        初始阶段,生成器生成的样本质量较差,判别器很容易将其与真实数据区分开。但随着训练的进行,生成器逐渐从判别器的反馈中学习,不断改进生成的样本,使其越来越接近真实数据的特征。

        同时,判别器也在不断提升自己的判别能力,以应对生成器生成的越来越逼真的样本。

        这种对抗过程不断持续,直到达到一种平衡状态,即判别器无法准确区分真实数据和生成数据。此时,生成器就已经学习到了真实数据的分布规律,可以生成与真实数据非常相似的新样本。

        举个简单的例子来说明这个过程。假设我们要生成手写数字的图像,生成器一开始可能生成一些模糊、扭曲的数字图像。判别器很容易判断出这些是假的。然后生成器根据判别器的反馈,调整参数,比如改变线条的粗细、数字的形状等,再次生成图像。判别器再次进行判断,如此反复,最终生成器能够生成逼真的手写数字图像。

        总之,GAN 的基本原理就是通过生成器和判别器之间的不断对抗和优化,使得生成器能够学习到真实数据的分布,从而实现数据的生成。

🍉GAN 的训练过程

        生成对抗网络(GAN)的训练是一个复杂但有趣的过程,它主要包括以下几个关键步骤:

🍈初始化

  • 首先,需要分别初始化生成器(Generator)和判别器(Discriminator)的参数。这些参数通常是随机初始化的。

🍈生成器生成假数据

  • 生成器接收随机噪声作为输入,并通过其内部的神经网络结构生成假的数据样本。例如,如果是图像生成任务,生成器可能输出一个看起来像是图像的矩阵。

🍈判别器判断数据来源

  • 判别器同时接收真实数据样本和生成器生成的假数据样本。它会对每个样本进行判断,输出一个表示该样本为真实数据的概率值。

🍈计算损失函数

  • 对于判别器,损失函数通常基于它对真实数据判断为真的概率和对假数据判断为假的概率来计算。目标是让判别器对真实数据判断为真的概率接近 1,对假数据判断为假的概率接近 1。
  • 对于生成器,其损失函数基于判别器对其生成数据判断为真的概率。生成器的目标是让判别器将其生成的数据判断为真的概率接近 1。

🍈反向传播与参数更新

  • 根据计算出的损失函数,通过反向传播算法来计算参数的梯度。
  • 对于判别器,根据梯度更新其参数,以提高判别能力。
  • 对于生成器,根据其损失函数的梯度更新参数,以改进生成数据的质量。

🍈重复训练 

  • 不断重复上述步骤,生成器和判别器在相互对抗中不断优化自己的性能。
  • 例如,在训练初期,生成器可能生成一些非常模糊、毫无规律的图像。判别器很容易判断出这些是假的,并给予较低的概率值。随着训练的进行,生成器逐渐学习到真实图像的一些特征,生成稍微清晰一些的假图像。判别器也随之变得更加敏锐,能够识别出更细微的差异。如此反复,直到生成器生成的图像能够让判别器难以区分真假。

🍈小结

  • 在训练过程中,还需要注意一些问题,比如训练的稳定性、模式崩溃(生成器总是生成相似的样本)等。为了缓解这些问题,研究者们提出了许多改进的 GAN 架构和训练技巧,如 WGAN(Wasserstein GAN)、DCGAN(Deep Convolutional GAN)等。
  • 总的来说,GAN 的训练是一个动态的、不断优化的过程,通过生成器和判别器的相互博弈,最终实现生成逼真数据的目标。

🍉GAN 的应用领域

        生成对抗网络(GAN)由于其强大的生成能力,在众多领域都有广泛且深入的应用。

🍈图像生成

        GAN 在图像生成方面表现出色。它可以生成逼真的人物肖像、风景图像、艺术作品等。例如:

  • 人脸生成:能够创建出具有各种表情、特征和肤色的虚拟人脸,这在虚拟现实、游戏角色设计等方面有很大的应用价值。
  • 风格迁移:将一张图像的风格应用到另一张图像上,创造出独特的艺术效果。
  • 图像修复:对于受损或缺失部分的图像进行修复和补充。

🍈视频生成 

        能够生成连贯的视频序列。比如:

  • 合成自然场景的视频,如森林中的动态景色、城市街道的交通状况等。
  • 为电影和动画制作提供创意素材,生成虚拟的角色动作和场景。

🍈语音和音频生成

  • 合成自然流畅的语音,包括不同的口音、语调。这在语音助手、有声读物制作等方面有应用。
  • 创作音乐,如生成新的旋律、节奏等。

🍈自然语言处理

  • 文本生成,例如生成文章、故事、诗歌等。
  • 对话生成,构建智能聊天机器人,使其能够生成自然而连贯的对话回复。

🍈医学领域

  • 医学图像生成,帮助生成模拟的 X 光、CT 扫描、MRI 等图像,用于辅助医疗培训和研究。
  • 药物研发,通过生成新的分子结构来探索潜在的药物化合物。

🍈数据增强

  • 在数据量有限的情况下,GAN 可以生成新的数据样本用于扩充数据集,从而提高机器学习模型的性能和泛化能力。

🍈工业设计

  • 生成产品的设计概念,如汽车外观、家具款式等。
  • 为 3D 打印提供创意模型。

🍈金融领域

  • 预测金融市场的走势和模式。
  • 生成模拟的交易数据用于风险评估和策略测试。

🍉GAN 的优点和挑战

🍈优点

  • 无监督学习:GAN 可以在无标签数据的情况下进行训练,降低了数据标注的成本。
  • 高质量的生成结果:GAN 可以生成逼真的图像、文本等数据,具有较高的商业价值。
  • 可扩展性:GAN 可以通过调整网络结构和损失函数来适应不同的任务和数据集。

🍈挑战 

  • 训练不稳定:生成器和判别器的训练过程容易出现梯度消失、模式崩溃等问题。
  • 评估困难:由于生成结果的多样性,缺乏统一的评价指标来衡量 GAN 的性能。
  • 计算资源消耗大:GAN 的训练过程通常需要大量的计算资源,如 GPU、TPU 等。

🍉未来展望

🍈技术进步

        随着计算能力的提升和算法的不断创新,未来 GAN 模型将变得更加高效和精准,能够生成更加逼真的图像、视频和三维模型。同时,稳定性和多样性也将得到提升,更好地避免训练过程中的模式崩溃问题。

🍈应用领域扩大

        GAN 在数据增强和分析、个性化内容创造、模拟和预测等领域的应用将不断拓展。它可以为用户定制个性化的娱乐内容,在科学研究和工业设计中进行模拟和预测。

🍈产业影响加深

        GAN 的发展将对娱乐、广告、教育和培训等产业产生深远影响。例如,在电影、游戏和虚拟现实中创建逼真的虚拟角色和环境,为广告创造出吸引眼球的视觉内容,以及在教育领域生成教学材料等。

🍈与其他技术融合

        GAN 可能与其他技术如物联网、边缘计算和量子计算等融合,创造出更多新的应用和解决方案。

🍈伦理和社会问题凸显

        随着 GAN 技术的发展,如深度伪造等应用可能引发更多的伦理和社会问题,需要社会各界共同努力来解决。

🍉示例

        以下是一个使用 DCGAN(Deep Convolutional Generative Adversarial Network,深度卷积生成对抗网络)生成图像的示例。

🍈示例流程

🍍定义模型

  • Generator类:构建生成器网络,通过一系列全连接层和激活函数将输入的潜在向量(latent_dim)逐步映射为具有指定图像形状(img_shape)的输出。
  • Discriminator类:构建判别器网络,通过一系列全连接层和激活函数对输入图像进行判断,输出一个表示其为真实图像的概率值。

🍍超参数设置和数据准备

  • 选择设备(cuda如果可用,否则cpu)。
  • 设定潜在向量维度、批大小、训练轮数、学习率和图像形状等超参数。
  • 对 MNIST 数据集进行预处理,包括调整大小、转换为张量和归一化,并使用数据加载器加载数据。

🍍初始化模型和优化器

  • 将生成器和判别器模型移动到选定的设备上。
  • 为生成器和判别器分别定义优化器(Adam)。

🍍定义损失函数

  • 使用二进制交叉熵损失函数(BCELoss)来计算判别器和生成器的损失。

🍍训练循环

  • 在每个训练轮次中,遍历数据加载器中的批次。
  • 对于判别器训练:
    • 为真实图像标记为1real_labels),为生成的假图像标记为0fake_labels)。
    • 通过判别器对真实图像进行判断,计算真实图像的损失(d_real_loss)。
    • 生成假图像,通过判别器对假图像进行判断,计算假图像的损失(d_fake_loss)。
    • 综合真实图像和假图像的损失,得到判别器的总损失(d_loss)。
    • 清零判别器的梯度,反向传播损失,更新判别器的参数。
  • 对于生成器训练:
    • 生成新的假图像。
    • 通过判别器对假图像进行判断,计算生成器的损失(g_loss)。
    • 清零生成器的梯度,反向传播损失,更新生成器的参数。

🍍生成并展示图像

  • 在训练结束后,使用随机的潜在向量生成一批图像。
  • 使用make_grid函数将生成的图像组合成一个网格。
  • 使用plt.imshow展示生成的图像网格。

🍈代码实现

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torchvision.utils import make_grid
from matplotlib import pyplot as plt# 定义生成器
class Generator(nn.Module):def __init__(self, latent_dim, img_shape):super(Generator, self).__init__()self.img_shape = img_shapeself.latent_dim = latent_dimdef block(in_feat, out_feat, normalize=True):layers = [nn.Linear(in_feat, out_feat)]if normalize:layers.append(nn.BatchNorm1d(out_feat, 0.8))layers.append(nn.LeakyReLU(0.2, inplace=True))return layersself.model = nn.Sequential(*block(latent_dim, 128, normalize=False),*block(128, 256),*block(256, 512),*block(512, 1024),nn.Linear(1024, int(torch.prod(torch.tensor(img_shape))))nn.Tanh())def forward(self, z):img = self.model(z)img = img.view(img.size(0), *self.img_shape)return img# 定义判别器
class Discriminator(nn.Module):def __init__(self, img_shape):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(int(torch.prod(torch.tensor(img_shape))), 512),nn.LeakyReLU(0.2, inplace=True),nn.Linear(512, 256),nn.LeakyReLU(0.2, inplace=True),nn.Linear(256, 1),nn.Sigmoid())def forward(self, img):img_flat = img.view(img.size(0), -1)validity = self.model(img_flat)return validity# 超参数设置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
latent_dim = 100
batch_size = 64
num_epochs = 200
lr = 0.0002
img_shape = (1, 28, 28)  # 假设生成 28x28 的单通道图像# 加载 MNIST 数据集
transform = transforms.Compose([transforms.Resize(28),transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])dataset = datasets.MNIST(root='../data/', train=True, transform=transform, download=True)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)# 初始化生成器和判别器
generator = Generator(latent_dim, img_shape).to(device)
discriminator = Discriminator(img_shape).to(device)# 优化器
optimizer_G = optim.Adam(generator.parameters(), lr=lr, betas=(0.5, 0.999))
optimizer_D = optim.Adam(discriminator.parameters(), lr=lr, betas=(0.5, 0.999))# 损失函数
adversarial_loss = nn.BCELoss()# 训练循环
for epoch in range(num_epochs):for i, (imgs, _) in enumerate(dataloader):imgs = imgs.to(device)# 训练判别器real_labels = torch.ones(imgs.size(0), 1).to(device)fake_labels = torch.zeros(imgs.size(0), 1).to(device)# 真实图像判别real_validity = discriminator(imgs)d_real_loss = adversarial_loss(real_validity, real_labels)# 生成假图像z = torch.randn(imgs.size(0), latent_dim).to(device)fake_imgs = generator(z)# 假图像判别fake_validity = discriminator(fake_imgs.detach())d_fake_loss = adversarial_loss(fake_validity, fake_labels)# 总判别器损失d_loss = (d_real_loss + d_fake_loss) / 2discriminator.zero_grad()d_loss.backward()optimizer_D.step()# 训练生成器z = torch.randn(imgs.size(0), latent_dim).to(device)fake_imgs = generator(z)validity = discriminator(fake_imgs)g_loss = adversarial_loss(validity, real_labels)generator.zero_grad()g_loss.backward()optimizer_G.step()if epoch % 10 == 0:print(f"Epoch [{epoch}/{num_epochs}], D Loss: {d_loss.item()}, G Loss: {g_loss.item()}")# 生成并展示图像
with torch.no_grad():z = torch.randn(64, latent_dim).to(device)generated_imgs = generator(z)grid = make_grid(generated_imgs, nrow=8, normalize=True)plt.imshow(grid.permute(1, 2, 0))plt.show()

🍈代码解析

  • 首先,定义了生成器 Generator 和判别器 Discriminator 类。生成器将随机的潜在向量映射为图像,判别器则判断输入的图像是真实的还是生成的。
  • 超参数设置部分指定了设备(GPU 或 CPU)、潜在向量维度、批大小、训练轮数、学习率和图像形状等。
  • 数据加载部分使用 torchvision 加载 MNIST 数据集,并进行预处理。
  • 初始化生成器和判别器,并定义优化器和损失函数。
  • 在训练循环中,交替训练判别器和生成器。判别器通过对真实图像和生成的假图像进行判断来更新参数,生成器则通过生成让判别器认为是真实的图像来更新参数。
  • 最后,生成一些图像并展示。

🍉总结

        生成对抗网络(GAN)是一种创新的深度学习架构,由生成器和判别器两个核心部分组成。

        生成器负责生成看似真实的数据,试图欺骗判别器;判别器则努力区分真实数据和生成器生成的数据。两者在不断的对抗训练中逐渐优化自身能力。

        GAN 在多个领域展现出强大的应用潜力,如生成逼真的图像、实现图像到图像的转换、用于数据增强、语音合成、自然语言处理等。然而,GAN 的训练过程存在不稳定、模式崩溃等挑战,需要不断改进和优化技术来解决。

        尽管面临一些困难,GAN 仍然为人工智能的发展带来了新的思路和方法,其未来的发展有望进一步推动各领域的创新和进步。

2a20c54b85e042bfa2440367ae4807e9.gif

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

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

相关文章

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示DS3231 RTC时间

LCD ST7735显示DS3231 RTC时间 文章目录 LCD ST7735显示DS3231 RTC时间1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板 (ESP-12E) 和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印(带…

llm学习-4(llm和langchain)

langchain说明文档:langchain 0.2.6 — 🦜🔗 langChain 0.2.6https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.chat_models 1:模型 (1)自定义模型导入&#x…

c语言回顾-内存操作函数

目录 前言 1.memcpy 函数 1.1函数介绍 1.2与strcpy的区别 1.3memcpy的模拟 2.memmove 函数 2.1函数介绍和使用 2.2函数的模拟 3.memset函数 3.1函数介绍 3.2函数的模拟 4.memcmp函数 4.1函数的使用 4.2函数的模拟 结束语 前言 在动态内存的章节中小编详细讲解了动…

7.基于SpringBoot的SSMP整合案例-表现层开发

目录 1.基于Restfu1进行表现层接口开发 1.1创建功能类 1.2基于Restful制作表现层接口 2.接收参数 2使用Apifox测试表现层接口功能 保存接口: 分页接口: 3.表现层一致性处理 3.1先创建一个工具类,用作后端返回格式统一类:…

【人工智能学习之图像操作(一)】

【人工智能学习之图像操作(一)】 图像读写创建图片并保存视频读取色彩空间与转换色彩空间的转换通道分离理解HSV基本图形绘制 阀值操作OTSU二值化简单阀值自适应阀值 图像读写 图像的读取、显示与保存 import cv2 img cv2.imread(r"1.jpg")…

Unity休闲手机游戏开发课程

课程介绍 Unity休闲手机游戏开发课程将教您如何利用Unity游戏引擎创建令人愉快的休闲手机游戏。从基础的游戏开发知识到高级的游戏制作技巧,您将学习到创建各种类型的休闲游戏所需的关键技能和工具。无论您是初学者还是有一定经验的开发者,本课程都能帮助…

协程调度模块

什么是协程和协程调度? 基本概念 协程 协程是一种比线程更轻量级的并发编程结构,它允许在函数执行过程中暂停和恢复执行状态,从而实现非阻塞式编程。协程又被称为用户级线程,这是由于协程包括上下文切换在内的全部执行逻辑都是…

[linux]sed命令基础入门详解

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这…

上位机GUI 第三弹

😊 😊 😊 从协议层面讲,地质单元相当重要,调试模式,我只能义命令发送的索引码作为,每个设备的区分方式,调试的情况,不在设备上设置任何东西,开机访问地址和端口就能用 因为懒,直接将…

股票分析-20240628

今日关注: 20240626 六日涨幅最大: ------1--------300386--------- 飞天诚信 五日涨幅最大: ------1--------300386--------- 飞天诚信 四日涨幅最大: ------1--------300386--------- 飞天诚信 三日涨幅最大: ------1--------300386--------- 飞天诚信 二日涨幅最…

Spring AI 1.0.0 新变化,从 0.8.1 如何升级

Spring AI 1.0.0-M1 版本已经发布,距离 1.0.0 正式版又更近了一步。同时这也意味着,Spring AI 1.0.0 的 API 已经基本确定,不会发生大的改动。这里介绍一下,相对于上一个发布版本 0.8.1,Spring AI 1.0.0 的一些重要的变…

MySQL高级-SQL优化-insert优化-批量插入-手动提交事务-主键顺序插入

文章目录 1、批量插入1.1、大批量插入数据1.2、启动Linux中的mysql服务1.3、客户端连接到mysql数据库,加上参数 --local-infile1.4、查询当前会话中 local_infile 系统变量的值。1.5、开启从本地文件加载数据到服务器的功能1.6、创建表 tb_user 结构1.7、上传文件到…

HarmonyOS APP应用开发项目- MCA助手(Day01持续更新中~)

简言: gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头,实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点(AP)工作模式–Arduino程序,当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

前后端分离:四种开发模式与实践指南

前后端分离:四种开发模式与实践指南 什么是前后端分离 当业务变得越来越复杂或产品线越来越多时,原有的开发模式就无法满足业务需求了。 产品越来越多,展现层的变化越来越快、越来越多,此时应该进行前后端分离的分层抽象&#…

2024攻防演练:亚信安全推出MSS/SaaS短期定制服务

随着2024年攻防演练周期延长的消息不断传出,各参与方将面临前所未有的挑战。面对强大的攻击队伍和日益严格的监管压力,防守单位必须提前进行全面而周密的准备和部署。为应对这一形势,亚信安全特别推出了为期三个月的MSS/SaaS短期订阅方案。该…

【Android面试八股文】Android性能优化面试题:怎样检测函数执行是否卡顿?

文章目录 卡顿一、可重现的卡顿二、不可重现的卡顿第一种方案: 基于 Looper 的监控方法第二种方案:基于 Choreographer 的监控方法第三种方案:字节码插桩方式第四种方案: 使用 JVMTI 监听函数进入与退出总结相关大厂的方案ArgusAPMBlockCanaryQQ空间卡慢组件Matrix微信广研参…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

文章目录 什么是 AOP ?.Net Core 中 有哪些 AOP 框架?基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP ? AOP(Aspect-Oriented Programming,面向切面编程&a…

TCP、UDP详解

目录 1.区别 1.1 概括 1.2 详解 2.TCP 2.1 内容 2.2 可靠传输 2.2.1 确认应答 2.2.2 超时重传 2.2.3 连接管理 三次握手 四次挥手 2.2.4 滑动窗口 2.2.5 流量控制 2.2.6 拥塞控制 2.2.7 延时应答 2.2.8 捎带应答 2.2.9 面向字节流 2.2.10 异常情况的处理 1.…

IDEA 编译单个Java文件

文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件,点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…