一、有条件去噪控制
很简单的一个模型,整体来说就是将“内容(图像)” + “图像所对应的标签” + “每个噪声表征对应的时间步Timestap”分别输入进线性层Layer,然后将他们的表征相加(+)即可
执行步骤是:
x的维度是(bz,512,1,1)
1、将带有噪声的表征经过Linear Projection,得到x
x = self.input_proj(x)
2、将x输入进Layer得到h
h = self.in_layers(x)
3、将条件context输入Layer得到context_out
context_out = self.context_layers(context)
4、将每个噪声图像对应的timestep 的嵌入emb输入进Layer得到emb_out
emb_out = self.emb_layers(emb)
5、将它们三个自个的embedding相加+
h = h + emb_out + context_out
6、将它们的输出经过输出层Layer映射
h = self.out_layers(h)
7、将经过linear的x与输出映射h进行残差相加+
return x + h
8、最后再经过一个输出Layer就可以了
最后得到的输出的维度和输入是一样的,是(bz,512,1,1)
return self.out(x).unsqueeze(-1).unsqueeze(-1)
先执行步骤1一次,步骤2-7重复N次,然后再执行步骤8
整体的代码逻辑:
def block(self, x, emb, context):# 1、将带有噪声的rep x输入h = self.in_layers(x)# 2、将timestep embedding emb输入emb_out = self.emb_layers(emb)# 3、将条件context输入if self.use_context:context_out = self.context_layers(context)# 4、将它们三个自个的embedding相加h = h + emb_out + context_outelse:h = h + emb_out# 5、将它们的输出经过输出层映射h = self.out_layers(h)# 6、将经过linear的x与输出映射h相加return x + hx = self.input_proj(x)for block in self.res_blocks:x = block(x, emb, context)output = self.out(x).unsqueeze(-1).unsqueeze(-1)
二、无条件去噪控制
与条件去噪控制 唯一不同的是,未加入(+)条件context的Embedding而已
if self.use_context:context_out = self.context_layers(context)# 4、将它们三个自个的embedding相加h = h + emb_out + context_outelse:# 未加入条件h = h + emb_out