版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IV目录1绪论 11.1选题目的 11.2选题意义 11.3研究现状及发展趋势 11.4研究方法及应用领域 21.5论文组织结构 42开发环境和相关技术栈 52.1生成对抗网络(GAN)原理综述 52.1.1生成器工作原理 52.1.2判别器工作原理 62.1.3生成对抗网络(GAN)工作原理 72.2卷积神经网络原理 72.3激活函数原理 82.4损失函数原理 82.5优化器原理 92.6本系统生成对抗网络(GAN)模型的选用 92.7本系统深度学习框架的选用 102.8本系统Web开发框架的选用 113需求分析与系统设计 123.1功能需求分析 123.2功能实现方案 133.2.1Pytorch深度学习框架设计生成对抗网络 133.2.2Flaskweb开发框架设计前端页面 143.3系统使用的流程 144测试与试验分析 164.1数据载入与数据预处理 164.2生成器模型架构代码实现 174.3判别器模型架构代码实现 184.4训练模型代码实现 194.5模型生成图片代码实现 214.6本系统选用DCGAN模型与传统GAN模型的性能对比 225基于Flask框架的网站开发设计与效果展示 245.1网页界面设计 245.2系统功能结构 245.3系统功能实现 245.3.1导航栏切换页面代码实现 255.3.2数据集查阅代码实现 265.3.3图片生成代码实现 265.4效果展示 285.4.1数据集管理功能展示 285.4.2图片生成功能展示 296总结 30参考文献 31致谢 32PAGEPAGE7绪论本章综述选题的目的、研究意义、研究现状及发展趋势、研究方法及应用领域,并且介绍本文的内容与组织结构。1.1选题目的基于生成对抗网络(GAN)强大的图片生成能力,可以生成可用性很高的图像,同时不用假设很多数学条件,实践过程中也不用知道真实数据的特征分布,很多工程和学术领域可以应用生成对抗网络(GAN)的图片生成能力,对实验中数据量不充足的样本集进行数量上的补充,然后将混合样本集作为其他视觉任务的数据集,从而达到增强模型学习效果的目的(史丹青,2018)。笔者将基于对生成对抗网络(GAN)的学习,实现一个根据已有图片生成新图片的图片生成系统。1.2选题意义机器能够从海量的数据和知识中进行学习,通过研究数据分析它们的特征寻找相关规律,并根据得到的规律建构模型,模型可以对未出现过的数据进行预测,从而在一定程度上具备了人的能力(陈海红,2017)。在目前的深度学习任务中,大量的数据和机器计算能力的提升帮助深度学习模型提升了在相关任务中的表现,但是仍然有许多项目难以得到充足的数据。研究者们希望确保任务的完成,但面临数据不足的问题。传统方法通过颜色和几何变换扩充数据,但数据量实质上未增加。使用GAN的生成方法为解决这一问题提供了有效思路。生成对抗网络(GAN)是深度学习在人工智能方向上的又一大的进步。1.3研究现状及发展趋势近年来,通过数据量的积累、计算机性能的提高和科研者在神经网络的探索,深度学习的发展非常迅速。GAN吸引了众多研究者,成为研究的焦点。受博弈论启发,通过对抗训练生成高质量样本,具有强大的特征表达和学习能力,比传统机器学习更强大。在计算机视觉领域,GAN取得了显著的成功。每年都有大量与GAN相关的论文问世,涉及到GAN模型的改进、应用场景探索以及理论方面的深入研究。这些研究不仅推动了GAN技术的发展,也为相关领域的创新注入了活力,使得GAN在学术界和工业界都备受关注,并为未来的研究和应用奠定了坚实的基础。虽然GAN有许多优点,但也存在明显的缺陷,在训练中模型参数振荡、不稳定的情况。网络难以收敛,反复出现训练崩塌的情况。生成的样本会遇到缺乏多样性,生成样本之间有着高度相似性的情况。针对这些问题,研究人员发明了很多GAN的变形模型(梁俊杰,2020),如下:WGAN模型:Arjovsky等人发明了WGAN(WassersteinGenerativeAdversarialNetworks)模型,通过引入Wasserstein间距,解决了经典GAN模型中存在的训练不稳定、梯度消失的问题,其稳定的训练过程和更高质量的生成样本受到了广泛的关注,为生成对抗网络(GAN)领域带来了重要的进展。MGAN模型:Hoang等人发明了MGAN(Multi-GeneratorAdversarialNetworks)模型,其最主要的特点是在GAN中构建多个生成器缓解模式丢失的问题,MGAN最直接的理论是构建更多的生成器,以生成种类更多的样本。MGAN的引入使得GAN模型更好地适应多模态数据的生成任务,扩展了GAN在数据生成领域的应用范围,它为处理多模态数据供应了新的解决方法。CGAN模型:Mirza等人提出了CGAN(ConditionalGenerativeAdversarialNetworks)模型,把额外条件加入到生成器和判别器,用于指导生成样本,广大研究者证明CGAN非常有效,并将它广泛应用到相关研究。CGAN的引入使得GAN模型具有了更强大的灵活性和可控性,能够更好地适应各种需求和适应各种应用场景,它为生成对抗网络处理条件生成任务提供了一种有效的方法。DCGAN模型:卷积神经网络CNN(ConvolutionalNeuralNetworks)是处理网格数据的模型。它在有监督学习中的各项研究中都发挥着重要的作用,但它在无监督学习的领域中的表现却不尽人意。DCGAN(DeepConvolutionGenerativeAdversarialNetworks)模型将CNN和GAN结合到一起,它利用CNN实现生成器和判别器的网络模型,通过使用卷积神经网络的结构和对抗训练机制,能够生成高质量的图片样本,现已被广泛应用于图像合成、图像增强和图像编辑等诸多领域,它已成为生成图片领域重要的里程碑之一。1.4研究方法及应用领域生成对抗网络的研究方法涉及到多个方面,包括网络架构的设计、训练过程的优化、应用领域的探索等。在设计网络架构时选择适当的网络结构作为生成器和判别器的基础,使用深层结构或残差连接来增加网络的深度,有助于更好地捕捉数据的复杂特征。生成对抗网络的焦点是对抗损失,确保生成器生成的样本越来越难被判别器判别为假。使用稳定的优化算法可以提高训练的稳定性。使用批次归一化、权重正则化等技术来防止训练过程中的模式崩溃或梯度爆炸问题。GAN的最基本应用是生成一张近乎真实的图片,后续可以根据生成器的特性应用到更多领域(程显毅,2019),具体应用如下:图像超分辨率:目标旨在将低分辨率图片转换为高分辨率图片,通过学习图片的细节和纹理,激励生成器生成更细致和真实的图像,从而提高图片的可用性并提高图片的质量。艺术风格迁移:该应用能够将一幅图片的内容与另一幅图片的风格相结合,生成具有新风格的图片。这个领域的核心思想是使用上次都看完了训练一个生成器,使得其能够生成具有指定风格的图片,同时保留原始图片的内容。通过这种方法,生成对抗网络可以实现艺术风格迁移,生成具有指定艺术风格的图片,该方法在艺术创作、图片编辑和设计等领域有非常广泛的应用前景。通过文本描述生成图片:这种技术可以通过对文本描述的学习与相关图片建立关系,使得模型能够根据输入的文本描述生成与描述相符的图片,这项应用是很有前景。医学图像分析:通过训练生成对抗网络模型,可以将低质量的医学图像转换为高质量的图像,提高图像的可视化质量和提高医生诊断的准确性。生成对抗网络可以用于合成具有特定病变、结构或特征的医学图像,以扩充医学图像的数据集,帮助提高医学图像分析模型的鲁棒性和泛化能力,尤其在数据稀缺或难以获取的情况下尤为重要。生成对抗网络对医学影像有着非常重要的推动作用。随着技术的不停发展,生成对抗网络在医学图像分析中的应用十分广阔。本系统GAN的构建使用Pytorch深度学习开发框架,前端使用Flaskweb开发框架。本系统向用户提供了两项主要的功能:基于已训练好的模型生成新图片,这个功能可以用于许多应用,如图像编辑、艺术创作等。用户可以通过简单的操作就能够生成具有特定特征或风格的图像。;用户上传训练集调用本系统已搭建好的模型训练框架用来训练用户期望的生成模型,通过这个功能,用户可以训练出符合自己需求的图像生成模型,满足特定的任务或应用需求。在前端开发方面,系统需要实现网页页面的设计与展示,以及与用户的人机交互功能。这包括了设计用户友好的界面、实现用户输入数据的传递与处理、接收用户的操作指令并向后端发送相应请求等。在后端开发方面,系统需要处理训练集图像的预处理工作,包括图像的读取、格式转换、数据增强等。然后,系统需要构建生成对抗网络(GAN)等模型,并利用用户提供的训练数据进行模型的训练。训练好的模型需要进行存储,以备后续的应用和使用。最后,系统需要提供接口或服务,接收前端传递的用户请求,并根据用户需求生成新的图像,并将生成的图像返回给前端展示给用户。1.5论文组织结构第一章:综述选题的目的、研究意义,研究现状及发展趋势、研究方法及应用领域,并且介绍本文的内容与组织结构。第二章:综述本系统的开发环境和相关技术栈。第三章:综述本系统的需求分析和系统设计。第四章:综述本系统所使用的生成器的详细设计和代码实现。第五章:综述本系统所使用的Flask框架并展示系统效果。第六章:对本系统进行总结。开发环境和相关技术栈本章综述本系统使用的开发环境和相关技术栈包括如下:生成对抗网络(GAN)原理综述、生成器工作原理、判别器工作原理、生成对抗网络(GAN)工作原理、卷积神经网络原理、激活函数原理、损失函数原理、优化器原理、生成对抗网络(GAN)模型的选用、深度学习框架的选用、Web开发框架的选用。2.1生成对抗网络(GAN)原理综述生成对抗网络(GAN)是一种深度学习模型,该模型由lanGoodfellow等人于2014年提出,是近年来在庞大分布上无监督学习最具前景的方式之一(lanGoodfellow,2014)。核心思想是博弈论的纳什均衡,通过两个模块:生成器和判别器,生成器致力于生成逼真样本。判别器致力于准确地区分样本的真假,随着时间推移,判别器更善于辨别样本,生成器逐渐提高生成质量。大致的GAN架构,如图2.1所示:图2.1GAN架构2.1.1生成器工作原理生成器接收一个随机向量作为输入,这个输入通常是从一个预定于的潜在空间中得到的,这个潜在空间可以是任意维度的向量空间,使得生成器可以从中学习到数据的分布特征。输入的随机向量经过生成器的多层神经网络结构,逐步被转换成更高维度的表示。在这个过程中,向量在生成器中通过一系列的线性变换、非线性激活函数以及批量归一化等操作,被映射了到一个高维空间中。经过多层神经网络结构的转换,最终生成器会输出一个与真实数据样本相似的伪造数据样本。在本系统中高维向量指的是一个四维数组(batch_size,channels,height,width)其中‘batch_size’代表批量的大小、‘channels’代表图片的通道数、‘height’和‘width’代表图片的高度和宽度。本系统构造的图片均采取RGB图片格式,所以该高维向量对应的每个像素都有三个通道的取值在[0,1]之间(将0-255的int取值规范到0-1的float取值),生成器生成的高维向量作为彩色图片被展示出来。生成器的工作原理是通过一个随机的低维度输入向量映射到一个高纬度的数据样本空间,生成器可以学习到真实图片的特征分布,并生成具有一定可信度的假图片。大致的生成器架构,如图2.2所示:图2.2生成器架构2.1.2判别器工作原理判别器作为GAN的重要组件,负责判断样本的真实性。在训练中,样本来源于生成的样本或真实样本。样本通过一系列的卷积操作、池化操作和激活函数等操作,这些操作提取样本中关键的特征,这些特征包括图片的纹理、边缘、形状等。特征提取后,判别器将提取的特征信息输入分类器中进行分类,分类器通常是一个全连接层,它将提取到的特征映射到一个单一的数值范围内,通常是[0,1]之间,代表样本被判断是真实样本的概率。如果输入的样本是真实的样本,则该概率值应该接近于1;如果输入的样本是生成器生成的样本,则该概率值应该接近于0。在训练的过程中,判别器的目标是最大化真实样本的概率值,并最小化生成样本的概率值。通过上述步骤,判别器对样本进行分类的能力得到增强,进而生成器生成近乎真实样本的能力也得到增强。随着网络训练的不断进行,生成器所生成的样本质量会不断得到提高,生成样本的可用性提高后,样本能够被研究者们所使用。大致的判别器架构,如图2.3所示:图2.3判别器架构2.1.3生成对抗网络(GAN)工作原理生成对抗网络的数学公式如下:其中,代表生成器,代表判别器,代表噪声,代表的是熵(Entropy)。公式右侧第一项表示:真实样本经过判别器D后得到的熵。右侧第二项表示:噪声空间中的生成器数据分布经过判别器后得到的熵。左侧的式子表示:判别器对真实和生成样本学习。目标是使真实样本输出概率接近1,生成样本输出概率接近0。生成器致力于生成接近真实的样本,让判别器误以为是真实样本。即生成器希望其生成的样本能够以高置信度被判别器接受为真实样本。这种对抗性训练促使生成器不断调整生成的样本,以使其更逼真、更接近真实数据。生成器和判别器在网络训练过程中彼此竞争和相互促进。2.2卷积神经网络原理卷积神经网络是一种深度学习模型,广泛应用于图像识别、目标检测、图像分割等领域,取得了巨大成功,已成为计算机视觉中的主流模型之一。模型的主要组成部分如下:卷积层:卷积核是层中主要的参数,应用在样本的局部区域,计算区域与卷积核的点积,结果存储到特征图对应位置。小卷积核能捕获更多细节特征,大卷积核则能涵盖更广范围的特征。卷积操作具有参数共享和稀疏交互特性,可显著减少参数量和计算负载。池化层:该层可以分成最大池化、均匀池化和最小池化层。最大池化层:矩阵范围内选择最大元素进行保留。平均池化层:矩阵范围内的数求平均值进行保留。最小池化层:从输入的矩阵中的某一范围内选择最小的元素进行保留。该层能够大大降低特征的维度,减少计算量同时可以避免过拟合的问题。激活层:该层引入非线性变换,能增进模型的非线性拟合和表达能力。神经网络能学习和捕获数据中复杂的特征。全连接层:经过前面的操作后,该层把提取的特征扁平化为一维向量。在该层中,每个神经元都与前一层的每个神经元连接,因此它将前一层的所有特征作为输入,使得能够捕获到输入数据中的更复杂的模式和关联能够将提取到的高维特征映射到输出空间上,并通过梯度下降算法进行参数优化,以使模型能够学习到输入数据的复杂特征和规律。输出层:根据任务需求输出相应的结果。2.3激活函数原理引入了非线性变换,用来增进模型的非线性拟合和表达能力。神经网络可以学习和捕获数据中复杂的特征。具体工作原理如下:引入非线性:没有使用激活函数,整个网络用线性变换表示,限制了网络的表达能力。引入非线性使得神经网络能够学习到非线性模式和复杂关系,进而更好地拟合复杂的数据分布。提升神经网络的表达能力和稳定性:通过堆叠多个激活函数逼近各种复杂函数,增强非线性特性,提升网络稳定性和收敛速度,实现对复杂问题的建模。在实际应用中,应根据问题和网络结构选择适当的激活函数。2.4损失函数原理其是深度学习模型中重要的组成部分,用于衡量模型的预测值和真实值之间的差异。其提供了一个反馈信号,指示模型在哪个方向上需要调整参数,从而改善预测性能。在训练过程中,每个样本的损失函数值都会被计算,并且在整个训练集上进行平均或加权平均。采用二分类交叉熵损失函数BCELoss(BinaryCrossEntropyLoss)的作为本系统的损失函数。BCELoss的计算公式如下:其中:是模型的预测概率,表示样本属于正类别的概率。是真实标签,表示样本的真实类别。BCELoss度量预测概率与真实标签的差距。一致时值小,表示准确;不一致时值大,表示不准确。2.5优化器原理优化器首先计算参数的梯度,通常通过反向传播算法实现,然后利用这些梯度信息来更新参数,以减小损失函数的值。常见的参数更新规则是:新参数值=原参数值-学习率×梯度。本系统采用的优化器是Adam(AdaptiveMomentEstimation)是一种流行的自适应学习率算法,结合了动量加速梯度下降。动量项积累了过去梯度的加权平均,使得梯度更新具有惯性,能更快地在参数空间中前进。动量项有助于减少参数更新的方差,尤其是在具有高曲率的方向上,可以更快地收敛到局部最优解。Adam还维护每个参数的自适应学习率,利用梯度的平方指数加权平均估计参数的二阶矩,动态调整参数的学习率。自适应学习率使得参数更新更加一致,避免手动调整学习率。Adam有两个主要的超参数:学习率和指数衰减率。学习率控制每次参数更新步长的大小,而指数衰减率控制了动量项和自适应学习率的参数的指数加权平均的速度。通常情况下,Adam使用默认的超参数值,但在某些情况下可能需要调整以获得更好的性能。2.6本系统生成对抗网络(GAN)模型的选用本系统使用的模型是GAN与CNN结合的DCGAN模型,网络架构如下文所述。生成器的架构,如下:输入数据:随机产生一个噪声向量,维度是噪声维度。这个噪声向量可以被视为一个1×1×噪声维度的特征图。网络结构:其共有5层网络。每层的第一层是转置卷积层,将输入的随机噪声向量转换成特征图。随后都包括了批归一化层和ReLU激活函数。转置卷积层通过反向卷积操作将特征图尺寸逐步放大,通道数逐步减小。在每个转置卷积层后面都接了批归一化层,加速模型收敛并提高稳定性。ReLU激活函数引入非线性,增强网络表达能力。输出数据:生成器的最后一层是转置卷积层,将特征图映射为图像。输出通道数为3,代表RGB三个颜色通道。输出图像的像素范围在[-1,1],因此最后一层使用了Tanh激活函数把像素值进行缩放。输入尺寸为1×1,通过一系列转置卷积层逐步放大,最终输出图像的尺寸为96×96。判别器的架构,如下:输入数据:判别器被输入生成的样本或真实样本。网络结构:其共有5层网络。每层的第一层是卷积层和LeakyReLU激活函数,用于引入非线性。随后的每层都包括了卷积层、批归一化层和LeakyReLU激活函数。判别器通过一系列卷积层将输入样本压缩和细化,最终输出一个数值表示输入样本是真实样本的概率。输出数据:输出层是卷积层和Sigmoid激活函数,将数值映射到[0,1],表示输入样本是真实样本的概率。2.7本系统深度学习框架的选用随着深度学习的不断发展,越来越多的人工智能应用进入人们的视线当中,如人脸检测、自动驾驶、AI换脸等。这些应用诞生的背后是各种各样的深度学习框架,它们帮助算法工程师更加快速、准确地建构深度学习模型(唐晓彬,2023),选择PyTorch作为本系统搭建生成对抗网络的深度学习框架的原因如下:易用:框架由Facebook研究团队开发和维护,提供了丰富功能和灵活接口,使得深度学习任务变得简单。其设计最易用,用户学习成本较低,很便于调试代码,让用户可以专注于实现自己的想法,无需担心框架的限制。简洁:设计分为三个抽象层次:Tensor表示高维数组,autograd表示自动求导,nn.Module表示神经网络。这样设计的好处是更少的抽象和更直观,使得源代码易读易懂。高效:提供动态图计算的功能,可以在运行时即时构建计算图,这样的特性使得模型的定义和调试更加灵活。同时也支持静态图计算,通过TorchScript将动态图转换为静态图,可以提升模型的性能和部署效率。开发者可以使用CUDA加速计算,以提高深度学习模型的训练速度。利用GPU进行充分的加速计算,提升了高效的并行计算能力。PyTorch的动态图计算和自动求导机制使得数据在GPU上进行并行计算变得非常简单和高效。生态和拓展:拥有丰富的开源模型和扩展库,研究者可以轻松地找到相关的源码进行学习,帮助开发者快速构建和训练深度学习模型。该框架还拥有优秀的社区服务,研究者之间可以随时且方便地进行交流和分享经验。2.8本系统Web开发框架的选用Web开发指的是实现基于互联网的应用程序开发,以满足用户的各种需求并向用户提供各种系统相关的功能。当前主流的Web开发框架通常会根据不同的编程语言和应用场景而有所不同。本文选用Flaskweb开发框架,Flask框架非常简单易用,它不强制开发者使用特定的项目结构或是依赖关系,而是提供了一种自由灵活的开发方式(田胜男,2023)。Flask的核心是其简洁但是非常强大的Web服务网关结构WSGI(WebServerGatewayInterface),开发者可以仅用几行代码就创建一个简单的Web应用。Flask利用装饰器来定义URL路由和视图函数,简化了路由的编写和管理,把URL与特定的视图函数关联到一起开发者使用‘@app.route()’装饰器能够实现这样的功能,实现用户访问URL时调用对应的视图函数进行处理。Flask使用Jinja2模板引擎来生成动态HTML内容,使得在Web应用中嵌入Python代码变得非常方便。Jinja2模板语言简单易懂,支持变量替换、控制结构(如循环、条件)和模板继承等功能,使得实现复杂的页面也变得很简单。Flask使用‘Werkzeug’作为底层的WSGI工具库,向开发者提供了HTTP请求和响应对象、URL路由、中间件等功能。综上所述,Flask是一个简洁、灵活且易于学习的Web开发框架,开发者能够通过其简洁的设计和丰富的扩展插件快速构建出高质量的Web应用程序,其适用于各种规模的项目和应用场景。需求分析与系统设计本章综述本系统的功能需求分析、功能实现方案和系统使用的流程。3.1功能需求分析本系统提供两项主要功能:一是基于已训练好的生成对抗网络的图片生成器,用户在前端页面输入生成图片的相关参数传递给后台应用调用图片方法,系统将生成好的图片展示到前端页面供用户查看;二是用户上传训练集,调用后台的模型训练框架进行图片生成模型的训练。本系统旨在为广大生成对抗网络初学者和对计算机生成图片感兴趣的用户提供开放式的使用体验。用户可以通过访问前端页面,无需登录,即可使用系统。此系统省去了繁琐的训练环境配置、硬件选择、数据预处理、模型选用、模型训练、参数优化、保存模型等步骤,使用户能够轻松地实现图片生成的应用。本系统向用户提供的主要功能如下:图片生成器:本系统向用户提供已经训练好的图片生成模型。用户在前端页面选择所需的图片生成器,并输入相关参数以指导选用的模型生成图片。后台会调用模型生成图片的方法,并将生成的图片通过弹窗的方式展示到前端页面供用户查看。数据集管理:本系统向用户提供展示已有数据集列表和上传新数据集的功能。用户在前端页面选择数据集管理的功能,用户可以上传新的数据集到系统中,并可以查看所有数据集的名称以及每个数据集对应的图片数量。模型库查阅:本系统向用户提供查阅已训练好的图片生成模型的功能。用户在前端页面选择模型库查阅功能,系统调用文件路径的查询方法,把相关文件展示到前端页面,用户可以查阅到已经训练好的图片生成模型。模型训练:本系统向用户提供生成对抗网络的模型训练功能。用户在前端页面选择模型训练,用户可以调用本系统的生成对抗网络训练框架训练新的图片生成模型,训练得到的新图片生成模型可以用于后续的相关应用。3.2功能实现方案本系统的功能实现方案基于FlaskWeb开发框架和PyTorch深度学习开发框架。3.2.1Pytorch深度学习框架设计生成对抗网络神经网络的通用训练步骤如下:定义网络结构、加载数据集、进行前向传播计算损失(即网络预测结果与正确结果之间的差距)、反向传播更新参数、保存和应用模型。本系统设计的生成对抗网络的训练流程,如图3.1所示:图3.1生成对抗网络训练流程图本系统在训练生成器模型时使用的随机噪声是随机生成的高斯噪声。高斯噪声是常见的随机信号,特点是服从正态分布的随机变量序列,这种正态分布的特性使得高斯噪声在数学和统计分析中都具有很好的性质,便于开发者进行建模和分析。高斯噪声的数据样本之间通常是相互独立的,数据样本根据相同的概率分布独立生成。在深度学习中,高斯噪声常被用作一种正则化手段,帮助模型更好地泛化和抵抗过拟合。本系统中的生成器模型和判别器模型是使用‘torch.nn’模块构建的。训练方法包括以下步骤:首先计算损失函数的值,接着根据得到的值计算模型参数的梯度,最后根据梯度更新优化器的参数。本系统的损失函数是通过‘torch.nn.loss’模块实现的。选用的损失函数是二分类交叉熵损失函数(BCELoss,BinaryCrossEntropyLoss)用于处理二分类问题,其中样本属于两个类别其中之一,模型输出该样本类别概率值。该损失函数在概率接近0或1时仍有较小的梯度,帮助开发者可以减轻生成对抗网络模型在训练过程中的梯度消失问题。本系统使用‘torch.optim’模块实现优化器功能。在本系统中,采用Adam优化器。该优化器能根据参数的梯度大小自适应调整学习率,以加快模型的收敛速度。3.2.2Flaskweb开发框架设计前端页面在Flaskweb开发框架中:Urls模块用于定义系统页面的定向,用户访问本系统时会显示已设计好的前端页面。Views模块则负责构建Python代码,当用户访问系统时,会收到对应的HTTP响应,并将其反馈到用户访问的前端页面上。Model模块内定义了系统静态文件和相关文件的路径,使用户可以使用系统中的相关查阅功能查看已保存的数据集文件、已训练好的模型文件和用户自发上传新的数据集文件。Template模块内定义了系统的HTML文件,用户可以通过访问不同功能的前端页面来进行交互。Flask框架设计网页的架构如下图3.2所示:图3.2Flask框架设计前端页面结构图3.3系统使用的流程本系统包含5个前端页面,用户可以通过访问这些页面来调用系统的功能。详细的系统使用流程图,如图3.3所示:图3.3本系统使用流程图用户通过访问本系统的首页,可以查阅到本系统的相关功能介绍,通过导航栏切换到相对应的功能页面,系统调用不同的后台方法向用户提供所选择的功能,并且用户选择的功能会在导航栏高亮显示,方便用户进行识别。用户通过访问本系统的图片生成器页面,用户选择的功能会在导航栏高亮显示,方便用户进行识别。用户可以在该前端页面输入相关图片生成的参数传递给已训练好的图片生成模型,调用后台的图片生成方法生成图片,并通过弹窗的方式展示生成的新图片到前端页面给用户查看。用户通过访问本系统的数据集管理页面,用户选择的功能会在导航栏高亮显示,方便用户进行识别。用户可以在该前端页面查阅到本系统已经保存好的数据集名称、数据集中的文件数量和用户可以自发上传数据集以供系统后续的相关使用。用户通过访问本系统的模型库查阅页面,用户选择的功能会在导航栏高亮显示,方便用户进行识别。用户可以在该前端页面查询已经训练好的模型文件以便系统后续的相关使用。用户通过访问本系统的模型训练页面,用户选择的功能会在导航栏高亮显示,方便用户进行识别。用户可以在该前端页面调用后台已构建好的模型训练方法用来训练用户期望的图片生成模型以便系统后续的相关使用,模型训练功能在后台执行不影响本系统其他功能的使用。图片生成器的设计与实现本章综述本系统所使用的卷积生成对抗网络(DCGAN)的详细架构,包括数据载入与数据预处理、生成器架构代码实现、判别器架构代码实现、模型训练代码实现、模型生成图片代码实现并且对比传统生成对抗网络(GAN)架构的性能差异。4.1数据载入与数据预处理本系统处理数据集的代码如下所示:将数据集中的非图片数据删除:#读取所有的文件forfileinos.listdir("data/faces"):filename="data/faces/%s"%filetry:Image.open(filename)except:os.remove(filename)print("%s错误"%filename)数据预处理并加载数据集到网络中:#构建一个图形变换库,这里是对图片进行处理transforms=tv.transforms.Compose([tv.transforms.Resize(opt.image_size),tv.transforms.CenterCrop(opt.image_size),tv.transforms.ToTensor(),tv.transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])#这里传入了前面的图片路径和变换库,经过这一步操作获取到了数据集dataset=tv.datasets.ImageFolder(opt.data_path,transform=transforms)#调用数据加载器,加载数据集dataloader=DataLoader(dataset,batch_size=opt.batch_size,shuffle=True,num_workers=opt.num_workers,drop_last=True)‘transforms’是一个‘torchvision.transforms.Compose’对象,用于定义图片的预处理操作序列。通过调用Resize方法将图片大小调整为指定的大小,用CenterCrop方法将图片进行中心裁剪,保留图片中心区域,用ToTensor方法将图片数据转换为Tensor格式,同时将像素值缩放到[0,1]范围之间,用Normalize方法将图片数据进行标准化。使用‘torchvision.datasets.ImageFolder’加载数据集,该数据集所有文件按文件夹保存,每个文件夹下存储同一类别的图片,文件夹的名字为分类的名字,同时传入了预处理操作‘transforms’。使用‘DataLoader(dataset,batch_size,shuffle,num_workers,drop_last)’创建数据加载器,用于批量加载数据。在这段代码中,'dataset'是之前创建的数据集,'batch_size'表示每个批次中样本的数量,'shuffle'用于确定是否打乱数据顺序,'num_workers'用于指定数据加载的线程数。参数'drop_last'表示是否丢弃最后一个不完整的批次。通过以上步骤,本系统实现了对图片数据的预处理和数据加载,为后续的图片处理任务提供了数据基础,方便用户进行后续系统的使用。4.2生成器架构代码实现本系统的生成器架构代码如下所示:classNetG(nn.Module):def__init__(self,ngf,nz):super(NetG,self).__init__()#这里定义神经网络模块self.main=nn.Sequential(#输入一个nz维度的噪声是一个1*1*nz的featuremapnn.ConvTranspose2d(nz,ngf*8,4,1,0,bias=False),nn.BatchNorm2d(ngf*8),nn.ReLU(True),#上一步的输出形状:(ngf*8)x4x4nn.ConvTranspose2d(ngf*8,ngf*4,4,2,1,bias=False),nn.BatchNorm2d(ngf*4),nn.ReLU(True),#上一步的输出形状:(ngf*4)x8x8nn.ConvTranspose2d(ngf*4,ngf*2,4,2,1,bias=False),nn.BatchNorm2d(ngf*2),nn.ReLU(True),#上一步的输出形状:(ngf*2)x16x16nn.ConvTranspose2d(ngf*2,ngf,4,2,1,bias=False),nn.BatchNorm2d(ngf),nn.ReLU(True),nn.ConvTranspose2d(ngf,4,6,2,1,bias=False),nn.Tanh()#输出形状:3x96x96)defforward(self,input):returnself.main(input)‘self.main=nn.Sequential()’定义了生成器的主体结构,采用了序列容器‘nn.Sequential’,其中包含一系列的卷积层、批量归一化层和激活函数,这些层的组合构成了整个生成器的前向传播流程。‘nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride,padding,bias=False)’定义了转置卷积层,用于将输入特征图进行上采样,这里连续使用了四个转置卷积层,每一层都会将特征图的尺寸进行放大,并通过批量归一化层和ReLU激活函数进行处理。‘nn.BatchNorm2d(num_features)’定义了二维批量归一化层,用于对输入进行标准化处理,加速网络训练和提高模型的稳定性。‘nn.ReLU(True)’定义了带有参数True的ReLU激活函数,表示对输入进行修改,即直接在原始张量上进行操作。‘nn.Tanh()’定义了Tanh激活函数,将生成器的输出限制在[-1,1]的范围内,符合图片的像素值范围。‘defforward(self,input)’定义了前向传播方法,用于定义模型的计算流程。‘returnself.main(input)’将输入input经过生成器的主体结构‘self.main’进行前向传播,并返回生成的图像。这一段代码实现了本系统的生成器架构,将其用于把随机输入的噪声最终逐步转换成逼真的图片,其定义了一系列堆叠转置卷积层和批量归一化层,使生成器能够逐渐将随机输入的噪声转换为与训练集数据特征分布相似的图片,方便用户进行后续系统的使用。4.3判别器架构代码实现本系统的判别器架构代码如下所示:classNetD(nn.Module):def__init__(self,ndf):super(NetD,self).__init__()self.main=nn.Sequential(#输入3x96x96nn.Conv2d(3,ndf,7,9,1,bias=False),nn.leakyrelu(0.6,inplace=True),nn.BatchNorm2d(ndf*2),nn.LeakyReLU(0.7,inplace=True),nn.Conv2d(ndf*3,ndf*2,5,9,1,bias=False),nn.BatchNorm2d(ndf*5),nn.LeakyReLU(0.1,inplace=True),#输出ndf*4x8x8nn.Conv2d(ndf*3,ndf*9,6,4,1,bias=False),nn.BatchNorm2d(ndf*8),nn.LeakyReLU(0.2,inplace=True),#输出ndf*8x4x4nn.Conv2d(ndf*8,1,4,1,0,bias=False),nn.Sigmoid())defforward(self,input):returnself.main(input).view(-1)‘self.main=nn.Sequential()’定义了判别器的主体结构,采用了序列化容器‘nn.Sequential’,其中包含一系列的卷积层、批量归一化层和LeakyReLU激活函数,这些层的组合构成了整个判别器的前向传播流程。‘nn.Conv2d(in_channels,out_channels,kernel_size,stride,padding,bias=False)’定义了卷积层,用于提取输入图像的特征,连续使用了四个卷积层,每一层都会将特征图的尺寸进行缩小,并通过批量归一化层和LeakyReLU激活函数进行处理。‘nn.BatchNorm2d(num_features)’定义了二维批量归一化层,用于对输入进行标准化处理。‘nn.LeakyReLU(0.2,inplace=True)’定义了带有参数0.2的LeakyReLU激活函数,用于引入少量的负斜率,以防止梯度消失。‘nn.Sigmoid()’定义了Sigmoid激活函数,用于将判别器的输出压缩到[0,1]的范围之间,表示输入图片是真实的概率。‘defforward(self,input)’定义了前向传播方法,用于定义模型的计算流程。‘returnself.main(input).view(-1)’将输入‘input’经过判别器的主体结构‘self.main’进行前向传播,并通过‘view(-1)’操作将输出结果展平成一维张量,以便后续计算损失函数。这一段代码实现了本系统的判别器网络架构,将其用于判断输入到判别器中的图片进行真假的判断,其定义了一系列堆叠的卷积层和批量归一化层,用于提取输入图片的特征,最终通过‘Sigmoid’函数输出图片是真实的概率,方便用户进行后续系统的使用。4.4模型训练代码实现本系统的模型训练代码如下所示:#加载网络#分别传入一个featuremap和噪声维度,判别器不需要传入gnet,dnet=GNet(opt.ngf,opt.nz),DNet(opt.ndf)#在预训练模型上进行迭代,默认不进行迭代,如果需要可以去掉下面的注释#map_location=lambdastorage,loc:storage#dnet.load_state_dict(t.load(d_path,map_location=map_location))#gnet.load_state_dict(t.load(g_path,map_location=map_location))#把网络移动到CUDA设备上去dnet.to(device)gnet.to(device)#定义优化器和损失函数#第一个参数是模型的所有参数,然后第二个是学习率,第三个betas表示用于计算梯度的平均和平方的系数optimizer_g=t.optim.Adam(gnet.parameters(),opt.lr1,betas=(opt.beta1,0.999))optimizer_d=t.optim.Adam(dnet.parameters(),opt.lr2,betas=(opt.beta1,0.999))criterion=t.nn.BCELoss().to(device)#这里定义了真图片和假图片的标签,t.ones表示生成一个全为1的张量#真图片label为1,假图片label为0true_labels=t.ones(opt.batch_size).to(device)fake_labels=t.zeros(opt.batch_size).to(device)#生成随机数张量,这里的噪声维度为100维,然后每一维都是1*1大小的矩阵fix_noises=t.randn(opt.batch_size,opt.nz,1,1).to(device)noises=t.randn(opt.batch_size,opt.nz,1,1).to(device)#初始化统计量的均值errord_meter=AverageValueMeter()errorg_meter=AverageValueMeter()#下面开始进行迭代epochs=range(opt.max_epoch)forepochiniter(epochs):#这里加载数据集,tqdm.tqdm在迭代时会显示一个进度条forii,(img,_)intqdm.tqdm(enumerate(dataloader)):#img表示图片,ii表示当前为第几次batchreal_img=img.to(device)#这里训练判别器ifii%opt.d_every==0:#首先进行梯度下降,把模型的梯度参数初始化为0optimizer_d.zero_grad()#首先把真的图片的参数传递进去,然后获取损失值#尽可能的把真图片判别为正确output=netd(real_img)error_d_real=criterion(output,true_labels)#进行权重更新error_d_real.backward()#尽可能把假图片判别为错误#这里生成随机噪声noises.data.copy_(t.randn(opt.batch_size,opt.nz,1,1))#根据前面的噪声,生成一张假图片fake_img=netg(noises).detach()#这里使用判别器来判断生成的假图片output=netd(fake_img)error_d_fake=criterion(output,fake_labels)error_d_fake.backward()optimizer_d.step()#这里把损失值放入error_d=error_d_fake+error_d_realerrord_meter.add(error_d.item())#这里训练生成器ifjj%opt.g_every==0:#判断optimizer_g.zero_grad()noises.data.copy_(t.randn(opt.batch_size,opt.nz,1,1))fake_img=gnet(noises)output=dnet(fake_img)error_g=criterion(output,true_labels)error_g.backward()optimizer_g.step()errorg_meter.add(error_g.item())这一段代码实现了本系统中生成对抗网络的训练过程:首先,创建了生成器'gnet'和判别器'dnet',并传入了噪声维度、生成器特征图数量和判别器特征图数量。然后,将网络移动到指定的CUDA设备上。使用Adam优化器优化生成器和判别器的参数,使用二元交叉熵损失函数衡量生成器和判别器的性能。使用随机数生成器‘t.ones’和‘t.zeros’函数创建真实图片和虚假图片的标签,分别设置为1和0。使用随机数生成器‘t.randn’创建固定大小的噪声张量用于生成虚假图片。使用‘AverageValueMeter’类初始化用于统计损失值的均值。使用嵌套循环来迭代训练模型,外层循环遍历每个epoch,内层循环遍历每个batch。判别器训练包括计算真假图片损失值进行优化。生成器训练是将随机噪声输出成图片,计算判别器对生成图片损失值,并进行优化。每次优化后,使用'derror_meter'和'gerror_meter'记录损失值,方便用户进行后续系统的使用。4.5模型生成图片代码实现本系统使用已有模型生成图片代码如下所示:defgenerate(gen_search_num:int=512,gen_num:int=64,gen_mean:int=0,gen_std:int=1,):device=t.device('cuda')#加载模型,netg,netd=NetG(ngf,nz).eval(),NetD(ndf).eval()map_location=lambdastorage,loc:storagenetd.load_state_dict(t.load(netd_path,map_location=map_location))netg.load_state_dict(t.load(netg_path,map_location=map_location))netd.to(device)netg.to(device)#设置噪声信息,根据设置的总生成数来设置随机值noises=t.randn(gen_search_num,nz,1,1).normal_(gen_mean,gen_std)noises=noises.to(device)#生成图片,并计算图片在判别器的分数fake_img=netg(noises)scores=netd(fake_img).detach()#对图片进行排序,选择较好图片indexs=scores.topk(gen_num)[1]result=[]foriiinindexs:result.append(fake_img.data[ii])#保存图片tv.utils.save_image(t.stack(result),gen_img,normalize=True,range=(-1,1))这一段代码实现了本系统随机生成图片的功能,并根据生成的图片在判别器中的得分选取较好的图片进行保存。函数‘generate()’的参数包括生成的图片数量、最终选取的图片数量、噪声均值和噪声方差。首先创建生成器和判别器,并加载预训练的模型参数,然后将模型移动到指定的CUDA设备上。接着使用‘t.randn()’函数生成随机噪声,噪声的形状为(总生成图片数,噪声维度,1,1),并使用用户给定的均值和方差进行初始化。随后,使用生成器对随机噪声进行前向传播生成虚假图片,再利用判别器对生成的图片进行评分。通过‘detach()’方法分离梯度信息,以避免对生成器的反向传播产生影响。最后,对生成的图片在判别器中的得分进行排序,并选取得分高的图片进行保存,方便用户进行后续系统的使用。4.6本系统选用DCGAN模型与传统GAN模型的性能对比传统的GAN模型主要由全连接层组成,而DCGAN模型引入了卷积神经网络作为生成器和判别器的主体结构,提高了图像生成的质量和稳定性,使得模型能够更好地捕捉图片中的特征和层次结构,相比于传统的GAN模型,DAGAN模型更容易训练和收敛,生成的图片质量更高,同时能够生成更多样的图片。DCGAN模型中的生成器使用反卷积操作将随机噪声转换为图片而不是简单地使用全连接层。传统GAN模型生成的图片可能缺乏细节和结构,生成的图片质量较低,并且传统GAN模型的训练过程训练不稳定,容易出现模式崩溃等问题。如下展示本系统选用的DCGAN模型和传统GAN模型在相同的训练集上进行了200次训练后生成的图片质量。具体展示每训练50次后生成的图片,如图4.1至图4.5所示:图4.1训练1次的生成图片质量(右为DCGAN)图4.2训练50次的生成图片质量(右为DCGAN)图4.3训练100次的生成图片质量(右为DCGAN)图4.4训练150次的生成图片质量(右为DCGAN)图4.5训练200次的生成图片质量(右为DCGAN)经过一次训练后,传统GAN模型生成的图片仍然呈现的是噪点,而DCGAN模型生成的图片已经具有一些人物面部的轮廓。经过50次训练后,传统GAN模型生成的图片才开始显示一些人物面部的轮廓,而DCGAN模型生成的图片已经展现出了人物细节的面部特征。经过100次训练后,传统GAN模型生成的图片才逐渐呈现人物细节的面部特征,而DCGAN模型生成的图片已经逐渐接近真实的图片。在随后的训练中,可以明显观察到由DCGAN模型生成的图片质量明显大幅度高于传统GAN模型生成的图片。在经过相关的实验后,决定使用生成图片质量较高的DCGAN模型作为本系统的图片生成模型,方便用户进行后续系统的使用。基于Flask框架的网站开发设计与效果展示本章综述本系统使用的Flask框架的网页界面设计、网页功能结构和系统功能实现。5.1网页界面设计本系统的页面设计包括一个位于页面顶部的系统功能切换导航栏,用户可以通过点击导航栏上的不同功能的名称快速切换到对应的功能页面。用户当前所使用的功能会在导航栏中高亮显示,以方便用户进行辨识。页面的下方则是具体的功能页面,包括功能的具体内容和操作选项。两者使用不同的颜色以区分,方便用户进行识别。页面模板的结构示意如图5.1所示:图5.1首页界面模版展示5.2系统功能结构本系统在Flask框架下渲染网页的结构如图5.2所示:图5.2Flask框架渲染网页的结构图在FlaskWeb开发框架下,templates目录用于存放系统的静态文件,包括了HTML文件和系统相关的模板文件。而主要的网页功能实现结构则体现在View.py和Urls.py文件之中。View.py文件主要负责构建Python代码,处理用户请求并生成相应的HTTP响应。Urls.py文件则用于定义系统页面的路由和URL映射规则,以确定用户请求应该由哪个视图函数来处理,方便用户进行后续系统的使用。5.3系统功能实现本系统的Flask框架的网页功能通过<script>标签嵌入JavaScript代码和Views.py的试图函数实现。5.3.1使用导航栏切换页面代码实现使用导航栏切换页面功能的代码如下所示:<ulclass="navnav-pills"><lirole="presentation"class="active"><ahref="#">首页</a></li><lirole="presentation"><ahref="/content">图片生成器</a></li><lirole="presentation"><ahref="/data">数据集管理</a></li><lirole="presentation"><ahref="/model">模型库查询</a></li><lirole="presentation"><ahref="/train">模型训练</a></li></ul>@app.route('/',methods=['GET'])defindex():returnrender_template('index.html',page_title="图片生成网站")@app.route('/data',methods=['GET','POST'])returnrender_template('data.html',page_title="数据集管理",folder_info=subfolder_info)@app.route('/model',methods=['GET','POST'])defget_model():returnrender_template('model.html',page_title="模型库查询")@app.route('/train',methods=['GET','POST'])deftrain():returnrender_template('train.html',page_title="模型训练")@app.route('/content',methods=['GET','POST'])defcontent():returnrender_template('content.html',page_title="图片生成器")这一段代码实现了本系统的导航栏切换功能页面功能。‘/’路由对应的视图函数‘index()’返回渲染index.html模板,并传递页面标题参数"图片生成网站"。‘/data’路由对应的视图函数‘data()’处理‘GET’和‘POST’请求,并返回渲染data.html模板,传递页面标题参数"数据集管理"和文件夹信息参数‘subfolder_info’。‘/model’路由对应的视图函数‘get_model()’返回渲染model.html模板,并传递页面标题参数"模型库查询"。‘/train’路由对应的视图函数‘train()’回渲染train.html模板,并传递页面标题参数"模型训练"。‘/content’路由对应的视图函数‘content()’返回渲染content.html模板,并传递页面标题参数"图片生成器",方便用户进行后续系统的使用。5.3.2数据集查阅代码实现数据集查阅功能的代码如下所示:<fieldsetclass="layui-elem-field"><legend>生成结果</legend><divclass="layui-field-box"><imgid="gan_res"alt=""src=""></div></fieldset>defget_data():folder_path='D:/bishetest/bisheshiyong/bisheshiyong/data/'#文件夹路径subfolder_info=[]for_,dirnames,_inos.walk(folder_path):#使用匿名变量_来表示不需要的返回值fordirnameindirnames:dirpath=os.path.join(folder_path,dirname)files_count=len(os.listdir(dirpath))subfolder_info.append({'folder_name':dirname,'files_count':files_count})break#只获取顶层文件夹的数据,避免遍历子文件夹这一段代码实现了本系统的数据集查阅功能。在函数内部,首先定义了‘folder_path’变量,指定了数据文件夹的路径。然后创建了一个空列表‘subfolder_info’,用于存储文件夹信息。利用‘os.walk(folder_path)’函数,可以遍历文件夹并获取其中的信息。在循环中,对每个子文件夹的信息进行处理。通过内层的for循环遍历‘dirnames’列表,获取每个子文件夹的名称‘dirname’。使用‘os.path.join(folder_path,dirname)’构建子文件夹的完整路径‘dirpath’。使用‘os.listdir(dirpath)’获取子文件夹下的文件列表,并使用‘len()’函数获取文件数量,将子文件夹的名称和文件数量构建为字典,添加到‘subfolder_info’列表中。由于只需要获取顶层文件夹的数据,因此使用了break语句来跳出循环,避免遍历子文件夹,方便用户进行后续系统的使用。5.3.3图片生成代码实现图片生成功能的代码如下所示:#项目启动自动加载模型device=t.device('cuda')#如果是使用CPU那么就把下面这个注释掉#device=t.device('cpu')#加载我们的模型,netg,netd=NetG(ngf,nz).eval(),NetD(ndf).eval()map_location=lambdastorage,loc:storagenetd.load_state_dict(t.load(netd_path,map_location=map_location))netg.load_state_dict(t.load(netg_path,map_location=map_location))netd.to(device)netg.to(device)#设置噪声信息,根据我们设置的总生成数来设置随机值noises=t.randn(gen_search_num,nz,1,1).normal_(gen_mean,gen_std)noises=noises.to(device)#生成图片,并计算图片在判别器的分数fake_img=netg(noises)scores=netd(fake_img).detach()#对我们的图片进行排序,选择较好图片indexs=scores.topk(gen_num)[1]result=[]foriiinindexs:result.append(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆市巫溪县2026年中考押题物理预测卷含解析
- 湖南长沙市雅礼洋湖实验中学2026届中考物理四模试卷含解析
- 2026年聿怀实验学校市级名校中考物理最后一模试卷含解析
- 2026年黑龙江哈尔滨道外区中考三模物理试题含解析
- 护理用药管理:确保用药安全
- 早产儿红臀护理与预防
- 中医护理腹泻的常见问题解答
- 常德市临澧县2025届三年级数学第二学期期中监测模拟试题含答案解析
- 浙江省宁波市四校2026届中考试题猜想物理试卷含解析
- 巴楚县2025届四年级数学第二学期期中考试试题(含答案解析)
- 《土木工程智能施工》课件 第4章 基础工程-浅基础工程
- 2024-2025学年陕西省渭南市蒲城县七年级(下)期末历史试卷(含答案)
- 2025年国家能源投资集团有限责任公司校园招聘笔试备考题库含答案详解(新)
- 中华护理学会学术会汇报
- 医疗结构化面试经典100题及答案
- 七一党课:传承红色基因勇担时代使命2025年建党104周年“七一”专题党课
- 带量采购培训课件
- 初三化学最后一课-主题班会【课件】
- 环境噪声技师试题及答案
- 广东省深圳市2025年七年级下学期期末数学模拟试题五套附答案
- QC岗前培训内容
评论
0/150
提交评论