5.11组会衍生总结:train/eval/BN、CNN与特征图、极大似然与EM、方差n与n-1(有偏估计/无偏估计)

本文探讨了模型在训练和评估模式下的区别,特别是在批标准化(batchnorm)的使用上,以及在训练GAN时的优化策略。同时,详细解释了CNN的特征图概念和计算过程,以及极大似然估计和EM算法在参数估计中的应用。此外,还讨论了方差的n与n-1的区别,以及在样本方差估计中的作用。

❓组会问题:

  1. gan在训练g时要固定d吗:不用,optim中指定的有参数,先计算g和d分别的loss,再通过↓分别对g和d进行训练
opt.zero_grad()
loss.backward()
opt.step()
  1. 什么是对比学习(明天看一下),参考博客:对比学习(contrastive learning)这个和看的第一篇论文的loss差不多,都用到了向量夹角(内积?)和交叉熵损失函数
  2. bert、blip
  3. 不同网络的encoder和decoder
  4. retrieval
  5. bn做了什么,数据发生了什么变化,激励函数包括什么,scale和shift是什么,数据发生了什么变化,对多维数据如何bn:下文有说,其中bn的处理单位是通道
  6. 特征图是什么,ground truth是什么:特征图=通道,在下文讲了; ground truth是real的东西,应该是现实中已经有的例子,在pix2pixHD和dance论文中都有说,可能一般用于图片生成/风格迁移的GAN网络?
  7. (衍生问题)map是什么: feature map指每一层网络的通道;pix2pixHD中的semantic label maps是指下图
    在这里插入图片描述
  8. (衍生问题)总结各论文中用到的loss
  9. (衍生问题)先验概率和后验概率:对于NCR中的高斯混合模型,某一正态分布下loss取某指定值的概率为先验概率,容易求,通过正态分布公式求;某一指定loss,求其为哪个正态分布的概率为后验概率,比如属于clean正态分布的概率。
  10. (衍生问题)后验概率相加为1吗

1.关于模型的train/eval与batchnorm

1-1.理论

model.train()

  • 启用 BatchNormalization 和 Dropout

model.eval()

  • 不启用 BatchNormalization 和 Dropout.
  • 框架会自动把 BN 和 DropOut 固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大!
  • 如果不加model.eval(),有输入数据,即使不训练,它也会改变权值。这是model中含有batch normalization层所带来的的性质(虽然看源码没看出来)。

BN详解

  • BN是将每个通道进行标准化(变为标准正态分布),单位为一个batch批次的一个通道,例如若数据大小为(batch, C, W, H)则求平均后的大小为©;然后可以进行affine,即对标准化的数据进行* weight和+ bias。参考与代码:深入理解Pytorch的BatchNorm操作(含部分源码)
  • 为什么要进行BN:BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布,经过BN后,大部分Activation的值落入非线性激励函数(如tanh)的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。参考:整理学习之Batch Normalization(批标准化)
  • 为什么有scale和shift操作(对应* weight和+ bias):BN使得数据集中分布在了激活函数的线性部分,需要再用一个反操作来在一定程度下抵消这个线性化。参考:整理学习之Batch Normalization(批标准化)

1-2.实际运用(包含loss反向传播)

模型进行train的步骤(以毕设中face_enhance为例):

  • model.train()将BN和droupout激活,好像不一定要用,而且模型中不一定有BN
  • 设置G和D的optim,包含了训练的参数,分别为G和D的参数
  • model计算各种loss,并将loss分为G和D的loss
  • 对G训练
g_opt.zero_grad()
gen_loss.backward()
g_opt.step()
  • 对D训练和上面一样

模型进行eval的步骤

  • model.eval(),好像不一定要用
  • torch.no_grad()
  • 没咋看了

2.CNN详解,特征图是什么

CNN处理过程

  • 输入为7×7×3(意思是(7×7)×3),最后一维3表示图像颜色通道
  • Filter为3×3×3(意思是(3×3)×3),那么这里的卷积核大小为3×3
  • 需要注意的是输入的最后一维(3)要和Filter的最后一维(3)保持一致
  • 计算方式为: 每一个对应位置相乘,最终结果相加,最后不要忘记加上偏置项
  • 所以,如果前面层特征图数量为3,则每个卷积有3层,即大小为(n*n)*3
    在这里插入图片描述
    上图来源

特征图(也叫通道)(num_features)

  • 每个层中矩阵(n*n)的个数
  • 比如图上输入有3个特征图,由于有2个filter所以输出为2个特征图
  • 所以有多少filter就有多少特征图,比如以下VGG网络
    在这里插入图片描述
    上图来源

总结(包含CNN图片的规律分析):

  • 特征图即为通道,特征图数 = 通道数 = 每一层矩阵数 = 前一层filter数,特征图数一般写在每层输出大小的第3维(如上vgg图左 224 * 224 * 64),写在convx-的后面(如图上vgg图右conv3-64),写在 @的前面(如图下8@28*28)在这里插入图片描述
    上图来源
  • 一般图中,写的都是输出的维度,而不是filter(如vgg图左224 * 224 * 64),有可能写在开头(如上图6@28*28);一般表中,写的都是filter(如vgg图右conv3-64)。这可能是因为,图是具体例子,而表是网络结构
  • pool层如果没有参数则不算在总层数内(如vgg-16中不算pool)而conv和fc有可训练参数所以算在层数内(如vgg-16中仅conv+fc有16层)
  • 一个filter的参数数 = 输入/前一层特征图数 * 一个filter的大小(即n*n)+ 1个bias = 输入特征数 * (n * n) + 1;一层conv的所有filter的参数总数 = 一个filter的参数数 * 该层总filter数

3.极大似然估计与EM最大期望

  • 极大似然估计是已知数据和数据分布模型,求模型参数使模型最可能出现已有结果的问题。对于不同问题使用的求参数方法不同,比如对于参数少的,只有p的模型,可以直接求导;参数多的显然不能直接求导,还有EM最大期望等方法。
  • EM是迭代使用极大似然估计的方法,比如求混合高斯模型的参数时,看参考链接的方法

4.方差的n与n-1(有偏估计与无偏估计)

  • n组独立同分布数据Xi相加后方差为原方差n倍,即 V a r ( ∑ X i ) = ∑ ( V a r ( X i ) ) = n σ 2 Var(∑X_i)=∑(Var(X_i))=nσ² Var(Xi)=(Var(Xi))=nσ2在下面橙色的公式中用到,参考链接:独立同分布相加的方差
  • 为何样本方差的无偏估计的分母为n-1,参考链接:彻底理解样本方差为何除以n-1
    在这里插入图片描述

在这里插入图片描述

<think>好的,我现在需要帮助用户解决他们在创建多架构镜像时遇到的错误。用户提供的报错信息是: ``` [root@hmn0001 ycj]# 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0 \ > --amend 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-x86_64 \ > --amend 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-arm64v8 -bash: 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0: No such file or directory ``` 首先,我需要分析这个错误的原因。用户是在执行什么命令的时候遇到这个问题的呢?看起来用户输入的命令行开始是直接输入了镜像地址,而没有命令本身。根据之前的对话历史,用户之前是在创建manifest清单,所以可能用户漏掉了`docker manifest create`这个命令,直接输入了镜像地址,导致shell将镜像地址当作可执行文件来执行,从而报错找不到文件或目录。 接下来,我需要确认用户的步骤是否正确。根据之前的指导,正确的步骤应该是使用`docker manifest create`命令来创建清单,然后添加各个架构的镜像。用户可能是在输入命令时遗漏了前面的`docker manifest create`部分,直接输入了镜像地址和`--amend`参数,导致shell无法识别。 另外,还需要检查用户的镜像标签是否正确。用户现在使用的是v1.0.0版本,而之前的示例中可能用的是latest标签,需要确认用户是否已经正确标记并推送了带有v1.0.0标签的不同架构镜像。例如,用户是否执行了类似`docker tag`命令来为x86和arm架构的镜像打上相应的标签,如v1.0.0-x86_64和v1.0.0-arm64v8,并推送到镜像仓库。 此外,用户可能没有启用Docker的实验性功能,导致无法使用`docker manifest`命令。需要提醒用户通过设置环境变量`export DOCKER_CLI_EXPERIMENTAL=enabled`来启用实验性功能,或者在Docker的配置文件中进行相应的设置。 还要考虑用户是否登录到了镜像仓库,如果没有登录,可能会导致权限问题,无法推送或创建manifest。需要建议用户运行`docker login 172.25.26.250:5000`进行登录。 最后,需要验证用户使用的Docker版本是否支持manifest命令,尤其是旧版本的Docker可能需要安装buildx插件。如果用户的Docker版本较旧,可能需要升级或安装buildx来支持多架构镜像的创建。 总结用户的错误原因可能是: 1. 在创建manifest清单时遗漏了`docker manifest create`命令,直接输入了镜像地址。 2. 镜像标签或命名不正确,导致无法找到对应的镜像。 3. 未启用Docker的实验性功能。 4. 未登录到镜像仓库,导致权限问题。 5. Docker版本过旧,不支持manifest命令。 接下来需要逐步指导用户纠正这些错误,确保他们正确使用`docker manifest create`命令,检查镜像标签是否正确,启用实验性功能,登录仓库,并验证Docker版本。同时,给出具体的正确命令示例,帮助用户正确执行操作。</think>根据您提供的错误信息,主要原因是命令语法格式错误。以下是问题分析和解决方案: 🔍 错误分析: 错误提示`No such file or directory`的直接原因是: ```bash # 错误示范(缺少docker manifest create命令) 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0 \ --amend ... # 被系统误认为要执行名为"172.25.26.250:5000..."的可执行文件 ``` ✅ 正确操作步骤: 请按以下流程修正命令: 1️⃣ 启用Docker实验性功能 ```bash export DOCKER_CLI_EXPERIMENTAL=enabled ``` 2️⃣ 创建manifest清单(关键修正点) ```bash docker manifest create 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0 \ --amend 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-x86_64 \ --amend 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-arm64v8 ``` 3️⃣ 验证前置条件(重要检查项): ```bash # 确认镜像已正确推送(需看到两个架构的镜像) curl -X GET http://172.25.26.250:5000/v2/c1oudnative/multi-arch-eval/tags/list # 确认Docker版本支持manifest(需19.03+) docker --version ``` 💡 常见问题排查: 1. 如果出现`manifest unknown`错误: ```bash # 登录镜像仓库(需要认证权限) docker login 172.25.26.250:5000 # 强制覆盖现有manifest docker manifest create --insecure 172.25.26.250:5000/... #(添加--insecure参数) ``` 2. 架构描述符建议使用标准格式: ```bash # 推荐标签格式(更规范) v1.0.0-amd64 # 替代x86_64 v1.0.0-arm64 # 替代arm64v8 ``` 3. 完整工作流示例: ```bash # 标记镜像 docker tag src_image:tag 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-amd64 docker tag src_image:tag 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-arm64 # 推送单架构镜像 docker push 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-amd64 docker push 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-arm64 # 创建并推送manifest docker manifest create 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0 \ --amend 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-amd64 \ --amend 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0-arm64 docker manifest push 172.25.26.250:5000/c1oudnative/multi-arch-eval:v1.0.0 ``` 📌 注意事项: 1. 所有带`-amd64`/`-arm64`后缀的镜像必须已推送到仓库 2. 仓库地址中的`c1oudnative`包含数字`1`而非字母`l`(需特别注意拼写) 3. 如果使用自签名证书,需要添加`--insecure`参数 请按上述修正方案操作后,如果仍然遇到问题,可以提供完整的命令执行日志以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值