
每年到这个节点总能看到一批跟“图像修复”相关的毕业设计题目。今年又有人拿来一个标题基于深度学习的图像修复算法 DCGAN。说实话第一次看到这个标题我是有点存疑的——DCGAN的本职工作是图像生成怎么跟修复扯上关系了但顺着这个方向把这个课题完整做下来之后我必须承认这确实是个值得好好打磨的毕设题目关键在于你打算把它做成“跑通代码交差”还是做成“真正能讲清楚原理和取舍”的完整项目。这篇文章我就以这个课题为线索从选题逻辑、网络结构、数据准备、训练稳定策略到常见问题排查完整拆一遍这个毕设项目到底应该怎么做。既说怎么做也说为什么这么做适合准备开题、正在做中期或者临近答辩但还没把原理彻底捋清楚的同学参考。内容偏实操看完你应该能直接照着搭建一个可运行的修复系统并且回答“为什么选DCGAN”“生成器为什么长这样”“训练为什么会崩”这类答辩必问的问题。1. 课题定位与选题思路拆解1.1 为什么用DCGAN做图像修复选题逻辑先说清楚先把这个课题的底层逻辑捋顺。DCGANDeep Convolutional GAN本质上是把卷积神经网络引入生成对抗网络框架的一种经典结构它解决的是“从随机噪声生成逼真图像”的问题。而图像修复Image Inpainting解决的是“在图像缺失区域填入合理内容”的问题。这两个任务之间有一条天然的桥梁修复缺失区域本质上就是“给定已知上下文生成缺失内容”。所以你可以把修复理解为一种条件生成——网络不是凭空生成一张图而是看着周围的信息把洞补上。用DCGAN做修复的基本思路是让生成器学习从“带缺失区域的图像 掩码”到“完整图像”的映射。为了生成更真实的内容引入判别器来区分“生成结果”和“真实完整图像”。这个思路在17、18年前后非常流行后来很多顶会论文的修复模型也都保留了类似的框架生成器负责重建判别器负责提升感知质量。所以这个题目不是生搬硬套而是确实有技术传承在里面的。提示如果答辩老师问“为什么不用传统的PatchMatch或基于扩散的修复方法”你要能回答DCGAN结构简单、可控性强、计算资源要求适中适合作为本科毕设来完整复现并在此基础上做改进。传统方法擅长纹理延拓但缺乏语义理解扩散模型效果好但训练代价大。DCGAN是性价比和毕设工作量之间的平衡点。1.2 图像修复任务到底在修复什么图像修复任务有两种典型场景你得先明确自己做的是哪一种。第一种是随机缺失块修复通常模拟照片上的划痕、污渍或者被遮挡的部分缺失区域可能是任意形状也可能只是一个规则矩形。第二种是中心区域补全比如一张人像照片中间一块被挖掉了要求算法补出一个自然的完整图像。这两种场景对应的数据准备方式不一样评价难点也不一样。我做这个项目时选择了“矩形区域缺失 随机不规则遮挡混合”的方案。矩形缺失最容易构造和可视化答辩时可以很直观地展示“输入带洞的图 → 输出补全的图”随机不规则遮挡则更贴近真实应用比如旧照片上的折痕、霉斑就是不规则形状。你可以在生成掩码时按概率切换既保证实验可控又有一定的实际意义。图像修复的难点在于缺失区域往往是不确定的、面积较大的网络不能只是把周围像素“抄”过来而是要理解图像语义知道缺失的部分“应该长什么样”。比如人脸的半张脸没了你不仅要补出肤色纹理还要让补出来的眼睛鼻子形态自然。这个“语义理解”能力恰恰是生成对抗网络通过对抗训练获得的强项。1.3 这个毕设课题能做到什么程度我的建议是把这个课题分成三个递进层次你可以根据自己的时间和能力选择做到哪一层。第一层是纯DCGAN修复基线搭建生成器和判别器把带掩码的图输入进去输出修复结果。这个过程大概两到三周就能跑通能出图、能算指标。第二层是结构优化把原始的DCGAN生成器换成带跳跃连接的U-Net结构引入PatchGAN判别器损失函数加入L1或感知损失。这一层修复质量会有肉眼可见的提升同时工作量适中是大多数优秀毕设应该达到的水平。第三层是对比和改进额外实现一个传统修复方法如基于扩散的Telea算法和另一个深度学习修复模型如Partial Convolution作为对比说明DCGAN变体在哪些指标上更有优势哪些场景下反而会失败。这一层能让论文的“工作量”和“创新性”都上一个台阶。2. 环境、数据与预处理开工前先把地基打好2.1 硬件与框架选型先说一个很多人一开始不在意、后来被坑惨的事环境没搭好后面全是泪。如果你有一张显存不低于6GB的显卡比如常见的GTX 1660 Super、RTX 3050及以上这个项目完全可以本地跑。显存至少6GB建议8GB以上因为生成器和判别器同时训练中间还要存放多张图像和梯度显存不够就只能缩小图像尺寸或batch size很影响效果。如果实验室有GPU服务器当然更好但要注意远程跑实验时务必要把数据、代码、输出目录的组织结构提前设计好否则后期整理实验结果时会非常痛苦。我的做法是建立统一的项目目录结构这样无论是本机调试还是迁移到服务器都基本零成本。整体项目目录建议这样组织dcgan_inpainting/ ├── configs/ # 配置文件保存所有超参数 ├── data/ # 数据集存放目录 ├── datasets/ # 数据加载与mask生成代码 ├── models/ # 生成器、判别器、损失函数定义 ├── train.py # 训练主脚本 ├── test.py # 测试推理脚本 ├── utils/ # 指标计算、可视化工具 └── results/ # 训练日志、模型权重、修复效果图框架上建议直接用PyTorch原因是代码简洁、调试方便而且很多经典的GAN实现都是PyTorch写的遇到问题容易找到参考。TensorFlow也能做但如果你不是对静态图特别熟悉我不建议在毕设阶段浪费时间跟框架的图模式纠缠。PyTorch的动态图机制对调试网络结构的细节更友好特别是你想打印中间层输出或者临时改一下网络结构的时候改完就能跑不用重新建图。2.2 数据集怎么选、怎么用数据集的选择直接决定你修复效果的上限。DCGAN诞生时使用的是LSUN卧室数据集和CelebA人脸数据集。毕设做修复我强烈推荐从CelebA入手原因有三CelebrA大约有20万张人脸图片数量充足足够训练一个稳定的GAN模型。人脸结构性强语义清晰修复效果好不好一眼就能看出来放在答辩PPT里非常直观。预处理简单下载完对齐裁剪后可以直接用不需要做复杂的标注。我还试过用场景类数据集比如Places365的一部分做补充实验但对毕设来说意义不大——场景图的语义变化太复杂修复难度陡增你很难在有限时间里把效果调好反而容易把自己搞崩溃。如果你手头有人脸之外的数据需求另一个可选方案是FFHQ但它的下载和处理流程复杂一些后续版本还要申请授权不太适合作为唯一数据集。数据规模上CelebA全部20万张训练也可以但实测下来你会发现不需要全部数据。随机取6到8万张作为一个子集训练效果差别不大但每轮迭代时间能缩短一半以上。我最后用了8万张batch size设64训练25个epoch左右整体时间控制在一台单卡机器三到五天内能跑完。2.3 掩码Mask生成策略掩码是修复任务里最容易被忽视但实际影响极大的设计。掩码的生成方式和大小比例直接决定了训练时网络“见过”什么样的缺失场景。我在项目中实现了三种掩码生成方式中心方形掩码在图像中心生成一个固定大小的矩形黑块例如128×128的图像上挖去一个64×64的方块。这是最简单的方案适合做demo和演示能最直观地展示修复效果但缺点是太单一网络很容易过拟合到“中心位置缺了一块”这一种情况。随机矩形掩码矩形的位置、大小都随机生成位置覆盖整个图像大小比例在10%到40%之间浮动。这种方案增加了多样性网络必须学会在不同位置和不同大小缺失下都能修复。不规则掩码用随机绘制线段、多边形的方式生成类似划痕和污渍的形状。这种方案最贴近真实场景但实现稍复杂需要维护一个掩码生成工具集。我的建议是主线实验用“随机矩形 不定比例”这样格点搜索和对比实验时指标稳定附加实验用不不规则掩码展示模型的泛化能力。这样做既保证了实验可复现又展示了你的工作量。掩码生成的一个关键细节是掩码一定要和图像同步处理。在PyTorch的Dataset类里每次取到一张图之后动态生成掩码不要把掩码预先固化保存。动态生成可以让网络在每个epoch看到不同的缺失模式相当于免费的数据增强能明显提升模型的泛化能力。2.4 预处理流程与数据管线CelebA原始图片是178×218的彩色图需要经过预处理才能送入网络。常规流程如下首先是中心裁剪与缩放。先把图的短边裁剪到接近正方形然后缩放到模型输入尺寸。输入尺寸怎么定我实验下来128×128是性价比最高的选择比64×64细节丰富得多比256×256显存消耗小很多。如果你的卡显存不足可以先降到96×96做调通实验最后再上128跑正式实验。然后是归一化。图像像素范围通常是0到255我的做法是归一化到-1到1的区间。为什么这么干因为DCGAN生成器的最后一层通常使用Tanh激活函数输出范围就是-1到1如果把输入归一化到0到1输入输出范围不匹配会让判别器很容易发现“输入分布不对劲”从而干扰训练稳定性。归一化的具体实现transform transforms.Compose([ transforms.CenterCrop(160), # 先裁到接近正方形 transforms.Resize((128, 128)), # 缩放到模型输入尺寸 transforms.ToTensor(), # 转Tensor像素缩放到0~1 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 线性映射到-1~1 ])还有一个很多初学者容易漏掉的细节数据加载要用DataLoader不要每轮自己手动循环读图。用DataLoader设置num_workers本机建议4到8开启pin_memory训练时数据读取速度才不会成为瓶颈。另外训练过程中要固定一个随机种子保证每次实验的掩码分布一致否则不同实验之间结果差异到底是由模型变化还是掩码随机性引起的都说不清楚。3. 网络结构与损失函数DCGAN怎么改造成修复网络3.1 生成器设计从全卷积到带跳跃连接原始的DCGAN生成器接收一个100维的随机噪声向量通过一系列转置卷积逐步放大最终生成一张完整图像。但修复任务完全不同——输入不是噪声而是“带洞的图像”。这就需要对生成器做改造。最基础的改造方式把输入从“纯噪声”改为“掩码后的图像”网络内部还是用卷积和转置卷积完成特征提取和图像重建。这种方式结构简单但有一个致命缺陷每一层卷积的 receptive field 有限网络很难同时兼顾“远距离的上下文语义”和“局部的纹理细节”导致修复出来的区域边界模糊、内容不自然。我在项目中采用的是U-Net结构的生成器这也是修复任务最常用的结构。U-Net的核心思想是编码器-解码器 跳跃连接编码器部分通过卷积和下采样逐步提取语义特征把图像从128×128压缩到低分辨率的高维特征。解码器部分通过转置卷积还原分辨率逐步生成完整图像。跳跃连接把编码器中间层的特征直接接到解码器的对应层。为什么跳跃连接对修复任务特别重要因为修复需要同时利用“全局语义信息”比如这是人脸应该补出另一只眼睛和“局部像素信息”比如这个区域的肤色纹理是怎样。如果没有跳跃连接解码器就只能从压缩后的特征里恢复细节容易丢失高频纹理有了跳跃连接解码器可以直接从编码器对应层拿到更接近原始图像的特征重建出更清晰的纹理。生成器的典型结构如下以128×128输入为例输入拼接后的 [带洞图像(3通道) 掩码(1通道)] - 4通道 编码器 卷积 4x4 stride2 - 64通道 卷积 4x4 stride2 - 128通道 卷积 4x4 stride2 - 256通道 卷积 4x4 stride2 - 512通道 解码器 转置卷积 4x4 stride2 - 256通道拼接编码器对应层特征 转置卷积 4x4 stride2 - 128通道拼接编码器对应层特征 转置卷积 4x4 stride2 - 64通道 转置卷积 4x4 stride2 - 3通道 最后一层 Tanh这里有一个细节输入为什么要拼接掩码通道因为如果只输入带洞图像网络并不知道“哪些区域是缺失的”它只能靠猜测来判断哪里需要修复。把掩码作为一个额外的通道喂给网络相当于告诉它“这个区域是洞别的地方都是参考信息”能降低学习难度加速收敛。3.2 判别器设计全局二分类还是PatchGAN判别器的角色是判断输入图像“是真是假”。原始DCGAN判别器接收整张图像输出一个0到1之间的标量真/假。这个全局判别器用来做生成任务没问题但用在整个图像修复时有个明显短板它只能关注图像的全局统计特征对局部纹理细节是否真实不敏感。生成器可能把洞补得轮廓大体合理但局部的接缝处模糊、纹理不自然全局判别器却给它打了高分因为总体上看“像一张人脸”。解决办法是使用PatchGAN判别器。PatchGAN不输出单个标量而是输出一个N×N的特征图比如16×16每个位置对应原图的一个局部区域对每个小区域分别判断真假。这样做的好处是局部细节的真实性被单独监督生成器不能靠“整体像”蒙混过关必须把每块区域的纹理都补到位。PatchGAN在实现上其实非常简单把普通判别器最后的全连接改成多层卷积即可只输出一个二维预测图。这种设计本质上就是让判别器关注“局部感受野”而生成器为了骗过它就会去优化局部细节。实测下来PatchGAN对修复边缘区域的自然度提升非常明显。3.3 损失函数组合GAN Loss 重建Loss只靠对抗损失训练修复模型一个典型的失败表现是生成器发现“把洞涂成噪声或模糊色块”有时候也能骗过判别器因为判别器也分不清这块区域到底该长什么样。这就导致修复结果出现奇怪的伪影。解决办法是给生成器加一个重建损失。重建损失直接比较生成结果和真实完整图像之间的像素差异。最常用的是L1损失和L2损失。我的经验是优先选L1损失。原因是L2损失对异常像素的惩罚呈平方增长会让生成器倾向于输出“平均化”的模糊结果来降低极端误差这在图像生成任务里是个经典问题。L1损失的梯度更平稳输出结果更清晰。完整生成器损失可以写成L_total lambda_adv * L_gan lambda_rec * L_l1其中L_gan是二分类对抗损失判别器对生成结果的打分L_l1是L1重建损失。lambda_adv和lambda_rec是权衡系数。我在项目中用lambda_adv1lambda_rec10即重建损失权重远大于对抗损失。这个比例非常关键如果对抗损失权重太大训练不稳定且容易出伪影如果重建损失权重太大图像会平滑到没有细节修复区域缺乏真实感。在此基础上还可以引入感知损失Perceptual Loss。感知损失不直接比较像素而是分别把生成图和真实图送入预训练好的VGG16网络比较某些中间层的特征差异。因为深层特征编码的是“语义内容”而不是具体像素感知损失能让修复结果在视觉上更接近真实图像而不是像素层面上的平均。实测下来加入感知损失后修复出的人脸五官更自然边缘轮廓更清晰。感知损失在PyTorch里可以通过加载预训练VGG然后截取中间层输出实现only几十行代码。注意感知损失不是必须项但它往往是区分“基础完成任务”和“优秀效果展示”的关键。答辩时如果面试老师问“你是怎么让补出来的五官看起来自然的”你就可以解释仅用像素级损失会倾向于平均模糊而感知损失约束网络在高层语义上更接近原图分布其实这正是GAN之外的另一个重要组件。4. 训练实操与稳定策略4.1 训练参数设置训练GAN的第一要务是照抄论文参数不是万能的但离论文参数太远是找死。DCGAN论文里给出了一套经过大量实验验证的稳定训练配置我的建议是先按这套配置来跑通了再做调整参数本次项目建议值说明优化器Adam生成器和判别器分别用独立优化器学习率0.0002生成器和判别器保持一致Beta10.5比默认的0.9更小让梯度方向变化更快防止震荡Beta20.999保持默认Batch Size64显存不足就降到32不要低于16Epochs20~30按损失和可视化效果决定是否早停输入图像尺寸128×128兼顾细节与显存掩码缺失比例10%~40%随机随机矩形方案解释一下Beta10.5这个点。Adam默认的Beta10.9会使得梯度一阶矩估计更新较慢这在分类任务里没问题但GAN训练中梯度变化剧烈一阶矩更新太慢容易导致优化轨迹抖动。DCGAN论文里使用Beta10.5是经过验证的稳定配置这一点新手经常忽略直接把默认的0.9拿来用结果训着训着loss就开始发散。学习率0.0002同样是个经验值。调高一点比如0.001训练前期收敛加速但后期很容易出现判别器loss降到接近0、生成器loss突然飞升的情况。我建议主线实验固定学习率只在消融实验里验证学习率的影响。4.2 让GAN训练稳定的几个关键技巧GAN训练的不稳定性是出了名的幸运的是这个项目里有一套成熟的组合拳可以用下面这四点基本能解决九成的不稳定问题。技巧一标签平滑Label Smoothing。真实图像的标签不要用1.0而是用0.8到0.95之间的值生成图像的标签用0.0到0.2之间的值。为什么要平滑因为如果判别器被训练到完美区分真假的极端状态它的梯度信号会非常尖锐几乎不给生成器任何有效反馈。标签平滑等于给判别器的输出留出缓冲空间避免判别器过度自信从而让生成器始终能拿到有价值的梯度。技巧二给判别器的真实输入加少量噪声。在把真实图像送入判别器之前加一个标准差为0.01左右的高斯噪声。这是因为真实图像和生成图像在像素分布上存在明显差异加入噪声可以平滑这种差异避免判别器仅凭“输入是否干净”就能分类强迫它学习更本质的图像特征。注意给生成图像不要加噪声否则会引入新的分布偏移。技巧三判别器更新频率调整。遇到“判别器loss一直下降、生成器loss不断上升”的情况可以把判别器每更新两次、生成器才更新一次反过来说叫“生成器更新更多”。但从算法角度理解关键是不要让判别器过于强势。我的做法是训练过程中监控生成器和判别器loss的比例如果生成器loss持续增大就让生成器多更新如果判别器loss持续不下降可能生成器太弱了就稍微提高生成器的学习率。技巧四不要用BatchNorm处理判别器输入层。这是DCGAN论文里明确提到的注意事项。判别器输入层的BatchNorm会把真实图像和生成图像拉向同一个分布反而削弱了判别能力。正确做法是判别器除了第一层不使用BatchNorm外其他层正常使用。实现时注意手动控制第一层的归一化操作。4.3 训练过程的观察点训练GAN不能只盯着loss曲线看因为loss的绝对值高低并不等价于生成质量。我在每次epoch结束后固定保存一组可视化结果选择同一批测试图像展示它们的“原图、带洞图、修复图”并排对比。可视化结果可以直观体现模型是否正常收敛。训练前期的典型表现是前几个epoch修复区域是一片模糊色块边缘有明显的接缝痕迹判别器可以轻松区分真假生成器loss缓慢下降。训练中期的标志是修复区域出现基本的形状轮廓颜色过渡自然但五官细节仍然模糊边缘接缝变得轻微可见。训练后期的表现是修复区域越来越接近真实图像局部纹理开始出现判别器已经比较难以区分真假。一个重要的观察点是生成器的重建loss应该稳定下降对抗loss可以有波动但只要不太发散就问题不大。如果重建loss下降说明网络确实在学习“怎么补像素”如果重建loss降到一定程度就停滞不降了可能已经收敛到局部最优可以尝试降低学习率微调或者调整lambda_rec比例。我还会在训练过程中记录PSNR和SSIM指标每5个epoch在验证集上算一次。这比只看loss曲线更可靠因为PSNR和SSIM衡量的是实际修复质量与肉眼感知相关性更高。但要注意这两项指标在小缺失比例下通常表现很好而大缺失比例下降幅明显评实验时要分开分析。5. 评测指标与结果分析5.1 图像质量客观指标毕设不能只有效果图还必须给出客观指标。修复任务常用的指标有三个我分别说下它们的计算方式和适用范围。PSNR峰值信噪比衡量修复图与原图之间的像素误差单位是dB。数值越高表示像素层面的重建越接近原图。计算公式是PSNR 10 * log10(MAX^2 / MSE)MAX是像素最大值如果图像范围是-1到1则MAX2如果0到255则MAX255MSE是均方误差。正常修复结果的PSNR通常在20到35dB之间。需要特别说明的是PSNR对像素级误差敏感但人眼主观感受不一定与之线性对应。有时候PSNR提升了0.5dB肉眼根本看不出差别而结构性的错位哪怕导致PSNR只降了0.2dB肉眼却能明显感觉到不对劲因此它适合作为基本参考不能完全依赖它评估。SSIM结构相似性指数从亮度、对比度、结构三个维度比较两张图像的相似性取值范围从-1到1越接近1越好。实现方式是用一个高斯窗口对图像逐区域计算最终取平均。SSIM比PSNR更接近人的感知是毕设论文中必须给出的指标之一。LPIPS感知相似度用预训练网络提取图像特征在特征空间计算距离值越低越好取值范围通常在0到0.5之间。LPIPS是目前学术界公认的与主观视觉最接近的指标。但需要注意它的计算需要加载预训练的网络模型会增加代码复杂度而且不同预训练模型得到的数值不能直接横向比较。毕设中如果用了LPIPS最好和另外两个指标一主两辅让论文指标体系更全面。5.2 对照实验怎么设计要让课题在答辩中站得住脚光有一组结果是不够的必须要有对照组。我的建议是至少设置以下三组对照第一组不同输入方案。对比“只输入带洞图像”和“输入带洞图像掩码”的效果差异。这个对照组能够说明“告诉网络缺失位置”是必要的也顺带验证了你的数据处理阶段是否合理。第二组不同损失权重。保持网络结构不变调节lambda_rec取值比如1、10、50对比修复效果和指标。这组实验最能体现你对模型的理解深度答辩时能够清楚解释为什么取10而不用更大的值。第三组不同缺失比例。固定模型测试不同掩码缺失比例如10%、20%、30%、40%下的性能表现。这组实验能直观展现你的模型在不同难度下的退化趋势说明模型的边界能力在哪里。设计对照实验有一个原则一次只改变一个变量。否则两个因素混在一起实验结果无法归因答辩时很容易被问倒。每组实验都要保持同样的随机种子确保掩码分布一致否则对比失去意义。5.3 结果呈现毕设论文和答辩怎么展示修复任务结果展示有一个常见误区只放一张“看起来成功”的图片避而不谈失败案例。正确的做法是同时展示修复成功和失败的样本。成功案例代表算法的上限能力失败案例代表模型的局限性既展示了工作量也展示了诚实态度答辩时主动说“我们的方法在缺失比例过大时会失效”往往比被老师问出来了再承认要主动得多。可视化的标准布局是三列对比第一列原图、第二列带洞图、第三列修复图。如果做了消融实验可以再加第四列“对比模型输出”。我强烈建议你在训练过程中持续保存固定样本的可视化结果最后做成一个gif动图或逐epoch对比图这张图放在答辩PPT里比任何指标表格都有说服力因为老师看到的是网络从一团模糊到逐渐清晰的进化过程这是整个毕设工作量的最直观证明。指标表建议按“缺失比例”进行分组分别列出PSNR、SSIM、LPIPS三项数值。表头不要只写“指标名称”要写明具体缺失比例这样指标就得清楚。6. 常见问题与排查技巧实录6.1 问题速查表我把实际项目中遇到的典型问题整理成一张速查表每个问题都给出了现象、原因和解决路径。下表把高频问题集中呈现现象常见原因解决路径修复区域是纯色/模糊块重建损失权重太低或训练不充分调大lambda_rec延长训练时间生成器loss持续上升判别器过于强势使用标签平滑给真实图像加噪声降低判别器学习率判别器loss接近0生成器太弱或判别器记忆了数据适当提高生成器学习率检查生成器结构有无维度错误生成图出现大量重复纹理模式坍缩降低学习率调整隐层维度加入重建损失约束PSNR高但视觉有明显伪影像素指标不能反映感知质量增加对抗损失或感知损失权重检查掩码边界有无输入通道错误训练前期正常后期loss暴增学习率过高导致优化震荡使用学习率衰减或手动降低学习率边缘接缝非常明显判别器感受野不够或重建损失权重不足改用PatchGAN调大lambda_rec加深生成器跳跃连接层特征融合训练耗时太长数据集全量读取、num_workers过小使用子数据集增大num_workers使用pin_memory6.2 我实际踩过的坑有几个坑是常规文档里不会写但实际非常常见的我说得直白一些。第一个坑是归一化范围不匹配。我曾把输入图像归一化到0到1但生成器输出用Tanh范围-1到1判别器收到“真实图像范围0~1、生成图像范围-1~1”这种不匹配的输入一开始训练就没有稳定过。排查很久才发现问题。这里我再强调一遍输入图像归一化到-1到1生成器输出层用Tanh二者必须严格一致。第二个坑是掩码通道的数值不小心写成了0到255。掩码作为额外输入通道如果不小心在ToTensor之后还能残留255像素值相比归一化到-1到1的图像通道这一个通道会直接主导网络初期的梯度方向训练几十分钟后效果依然很差。掩码通道也务必归一化到和图像通道一致的范围。第三个坑是看不到修复趋势就开始调参。训练初期loss有波动是正常的不要一个epoch看起来不好就下结论疯狂调参。我建议最基本的操作是固定一组大概率可用的参数比如上述论文配置先跑10个epoch看可视化结果有没有“从模糊到轮廓出现”的趋势有趋势再继续优化没有趋势再检查结构和数据不要一上来就动权重比例。第四个坑是测试时忘记使用与训练一致的掩码生成逻辑。如果你的训练数据用的是“随机矩形掩码”测试时却用固定大小的中心掩码指标波动会非常大并且这种波动不代表模型真实能力。测试阶段务必复用训练时的掩码生成函数同时固定随机种子。第五个关于显存不足的坑我直接给结论如果你的卡只有6GB显存又非要用128×128输入那么batch size从64降到16实测仍然能完成训练只是每一轮迭代时间明显增加。如果进一步降到8GB以内可以使用混合精度训练半精度浮点数能显著减少显存占用而且网络结构相对简单不会引入严重的精度损失。修复结果验收标准这件事我从自己的经验出发多说一句给你自己定一条“验收线”非常关键。线以下的实验不查看可视化结果只看PSNR是否达标可以节省大量精力线以上的实验比如换了损失函数、换了网络结构要专门腾出时间认真看修复效果图甚至可以手动放大细节区域。因为修复任务的最终目标是“看起来自然”而这个目标在指标上体现得不充分你必须为自己创造足够的“人眼观察时间”。我当时在验证集上固定了20张图每次实验结束后必看这20张图养成了稳定的评估习惯。到这个项目跑完当我重新审视“基于深度学习的图像修复算法 DCGAN”这个课题时我的真实感受是它不像某些纯理论课题那么吃力也不像纯调库课题那么没有区分度它给了你足够大的探索空间只要你愿意围绕它你可以涉及图像生成、条件生成、自适应损失设计、数据增强策略、指标评估体系等多个子话题。这些子话题延伸出来就是毕业论文里扎实的“相关工作”章节也是答辩时从容回答各种问题的知识储备。如果你手头正在处理一个类似课题我的核心建议只有一条不要等到训练彻底收敛了才回头看可视化要从第一个epoch就开始盯结果、记笔记每一次训练之后记录下“这次改动是什么、效果变化是什么”这个过程的积累会给你的毕设带来远超预期的影响。