当前位置: 首页 > news >正文

手机网站制作系统WordPress手机横屏显示

手机网站制作系统,WordPress手机横屏显示,中国十大网站建设企业,排名优化哪家好Diffusers StableDdiffusion 参考: Stable Diffusion原理详解#xff08;附代码实现) Latent Diffusion 自编码器#xff08;Variational Autoencoder, VAE#xff09;#xff1a; 自编码器是一种无监督学习的神经网络#xff0c;用于学习数据的有效表示或编码。在稳定扩… Diffusers StableDdiffusion 参考: Stable Diffusion原理详解附代码实现) Latent Diffusion 自编码器Variational Autoencoder, VAE 自编码器是一种无监督学习的神经网络用于学习数据的有效表示或编码。在稳定扩散模型中VAE用于将高维的图像数据编码到一个低维的潜在空间中这个空间的维度远小于原始图像空间。VAE由两部分组成编码器Encoder和解码器Decoder。编码器将输入图像压缩成一个潜在空间的向量解码器则将这个向量重构回图像空间。在潜在扩散训练过程中编码器用于获取图像的潜在表示latent用于向前扩散过程中逐步增加噪音。在推断过程中通过反向扩散过程生成的去噪潜在表示将使用VAE解码器转换回图像。在推断过程中我们只需要VAE解码器。 U-Net https://blog.csdn.net/hwjokcq/article/details/140413174 https://blog.csdn.net/Rocky6688/article/details/132390798 https://blog.csdn.net/xd_wjc/article/details/134441396 U-Net具有对称的U形结构包括一个收缩编码路径和一个对称的扩展解码路径。两者都由ResNet块组成。编码器将图像表示压缩为低分辨率图像表示解码器将低分辨率图像表示解码回原始更高分辨率图像表示为防止U-Net在降采样过程中丢失重要信息通常在编码器的降采样ResNet和解码器的升采样ResNet之间添加快捷连接(short-cut connections)。稳定扩散U-Net能够通过交叉注意力层将输出条件化为文本嵌入。交叉注意力层通常添加在U-Net的编码器和解码器部分之间通常在ResNet块之间。U-Net主要在“扩散”循环中对高斯噪声矩阵进行迭代降噪并且每次预测的噪声都由文本和timesteps进行引导将预测的噪声在随机高斯噪声矩阵上去除最终将随机高斯噪声矩阵转换成图片的隐特征。 Stable Diffusion中的U-Net在Encoder-Decoder结构的基础上增加了Time Embedding模块Spatial Transformer(Cross Attention)模块和self-attention模块。 Time Embeddings模块 Encoder模块中原本的卷积层组成了一个Residual Block结构。它包含两个卷积层一个Time Embedding和一个skip Connection。而这里的全连接层将Time Embedding变换为和Latent Feature一样的维度。最后通过两者的加和完成time的编码。 Spatial Transformer(Cross Attention)模块 U-Net在Stable Diffusion中的完整结构 文本编码器Text-encoder 文本编码器是用于处理文本数据的组件它可以将自然语言描述转换成模型可以理解的向量形式。在稳定扩散模型中文本编码器通常使用预训练的语言模型如BERT或GPT来捕捉文本的语义信息。现在多用CLIP模型这些编码的文本向量随后可以与潜在空间中的图像表示相结合以生成与文本描述相匹配的图像。 STEPS https://blog.csdn.net/qq_45752541/article/details/129082742 训练过程: (1)使用预训练的CLIP模型对需要训练的图像数据生成对应的描述词语。 (2)使用预训练的通用VAE先用Encoder将输入图片降维到 latent space通常降采样倍数4-16 (3) 将latent space输入diffusion model进行扩散正向采样一步步生成噪声在这个过程中通过权重 β 控制每步生成噪声的强度直到生成纯噪声并记录每步生成噪声的数据作为GT (4)利用cross attention 将 latent space的特征与另一模态序列的特征融合并添加到diffusion model的逆向过程通过Unet逆向预测每一步需要减少的噪音通过GT噪音与预测噪音的损失函数计算梯度。 推理过程 step1:输入稳定扩散模型接受两个输入 一个是潜在种子latent seed用来生成64×64大小的随机潜在图像表示。另一个是文本提示text prompt文本提示通过CLIP的文本编码器转换为77×768大小的文本嵌入用于指导图像的生成。 step2:去噪denoiseU-Net在被条件化于文本嵌入的情况下逐步去噪随机潜在图像表示U-Net的输出是噪声残差用于通过调度算法计算去噪随机潜在图像表示。 调度scheduler算法去噪后的输出噪声残差用于通过调度算法计算去噪后的潜在图像表示。有多种调度算法可供选择每种算法都有其优缺点。对于Stable Diffusion推荐使用以下之一 PNDM调度器默认使用K-LMS调度器Heun离散调度器DPM Solver多步调度器这种调度器能够在较少的步骤中实现高质量可以尝试使用25步代替默认的50步。 去噪过程去噪过程大约重复50次逐步检索更好的潜在图像表示。 step3:解码完成去噪后潜在图像表示由变分自编码器的解码器部分解码生成最终的图像。 Code Stable Diffusion原理详解附代码实现 Stable Diffusion原理代码 HuggingFaceDiffusionPipeline 官网教程 https://huggingface.co/docs/diffusers/main/zh/quicktour https://huggingface.co/docs/diffusers/main/zh/api/pipelines/overview#diffusers-summary https://blog.bot-flow.com/diffusers-quicktour/ #先使用from_pretrained()方法加载模型from diffusers import DiffusionPipeline # 这里会下载模型由于模型一般比较大默认下载目录为~/.cache/huggingface可通过export HF_HOME指定目录最好写入~/.bashrc持久化 pipeline DiffusionPipeline.from_pretrained(runwayml/stable-diffusion-v1-5, use_safetensorsTrue)#DiffusionPipeline下载并缓存所有model、tokenization、scheduling组件。 pipeline # StableDiffusionPipeline { # _class_name: StableDiffusionPipeline, # _diffusers_version: 0.21.4, # ..., # scheduler: [ # diffusers, # PNDMScheduler # ], # ..., # unet: [ # diffusers, # UNet2DConditionModel # ], # vae: [ # diffusers, # AutoencoderKL # ] # }现在可以在pipeline中输入文本提示生成图像 image pipeline(An image of a squirrel in Picasso style).images[0] image.save(image_of_squirrel_painting.png)#保存图像自定义shceduler() from diffusers import EulerDiscreteSchedulerpipeline DiffusionPipeline.from_pretrained(runwayml/stable-diffusion-v1-5, use_safetensorsTrue) pipeline.scheduler EulerDiscreteScheduler.from_config(pipeline.scheduler.config)MODEL 大多数模型采用噪声样本并在每个时间步预测噪声残差。您可以混合搭配模型来创建其他扩散系统。模型是使用from_pretrained()方法启动的该方法还会在本地缓存模型权重因此下次加载模型时速度会更快。 #加载 UNet2DModel这是一个基本的无条件图像生成模型 from diffusers import UNet2DModelrepo_id google/ddpm-cat-256 model UNet2DModel.from_pretrained(repo_id, use_safetensorsTrue)model.config#访问模型参数模型配置(cinfig)是一个冻结字典这意味着这些参数在模型创建后无法更改。这是有意为之并确保一开始用于定义模型架构的参数保持不变而其他参数仍然可以在推理过程中进行调整 sample_size输入样本的高度和宽度尺寸。in_channels输入样本的输入通道数。down_block_types和up_block_types用于创建 UNet 架构的下采样和上采样模块的类型。block_out_channels下采样块的输出通道数也以相反的顺序用于上采样块的输入通道的数量。layers_per_block每个 UNet 块中存在的 ResNet 块的数量。 如需使用推理(inferrence)首先需要使用随机高斯噪声创建图像(在计算机视觉领域图像往往通过一个复杂的多维张量表示不同的维度代表不同的含义)具体来说这里张量的shape是batch * channel * width * height。 batch一个批次想生成的图片张数channel一般为3RGB色彩空间width: 图像宽height: 图像高 import torchtorch.manual_seed(0) noisy_sample torch.randn(1, model.config.in_channels, model.config.sample_size, model.config.sample_size) #randn函数生成服从标准正态分布均值为0方差为1的随机数noisy_sample.shape#输出形状对于推理将噪声图像(noisy_sample)和时间步长(timestep)传递给模型。时间步长表示输入图像的噪声程度开始时噪声多结束时噪声少。这有助于模型确定其在扩散过程中的位置是更接近起点还是更接近终点。使用样例方法得到模型输出: with torch.no_grad():noisy_residual model(samplenoisy_sample, timestep2).sample#noisy_residual 对应调度给定模型输出调度程序管理从噪声样本到噪声较小的样本调度程序:与model不同调度程序没有可训练的权重并且是无参数的 #使用其DDPMScheduler的from_config() from diffusers import DDPMSchedulerscheduler DDPMScheduler.from_pretrained(repo_id) schedulernum_train_timesteps去噪过程的长度或者换句话说将随机高斯噪声处理为数据样本所需的时间步数。beta_schedule用于推理和训练的噪声计划类型。beta_start和beta_end噪声表的开始和结束噪声值。 要预测噪声稍低的图像需要传入模型输出(noisy residual)、步长(timestep) 和 当前样本(noisy sample)。 less_noisy_sample scheduler.step(model_outputnoisy_residual, timestep2, samplenoisy_sample).prev_sample less_noisy_sample.shapeimport PIL.Image import numpy as np#首先创建一个函数对去噪图像进行后处理并将其显示为PIL.Imagedef display_sample(sample, i):image_processed sample.cpu().permute(0, 2, 3, 1)#匹配PIL的格式image_processed (image_processed 1.0) * 127.5image_processed image_processed.numpy().astype(np.uint8)image_pil PIL.Image.fromarray(image_processed[0])display(fImage at step {i})display(image_pil)#为了加速去噪过程请将输入和模型移至 GPUmodel.to(cuda) noisy_sample noisy_sample.to(cuda) 现在创建一个去噪循环来预测噪声较小的样本的残差并使用调度程序计算噪声较小的样本 # 导入必要的库 import torch import tqdm# 假设noisy_sample是之前定义的噪声样本张量 sample noisy_sample# 使用tqdm库来显示进度条遍历调度器scheduler中的所有时间步 for i, t in enumerate(tqdm.tqdm(scheduler.timesteps)):# 1. 预测噪声残差# 使用torch.no_grad()上下文管理器来禁用梯度计算这通常在推理或评估阶段使用with torch.no_grad():# 调用模型的sample方法来获取噪声残差# 这里model(sample, t)可能代表模型根据当前样本和时间步预测噪声residual model(sample, t).sample# 2. 计算更少噪声的图像并更新样本为上一个时间步的值# scheduler.step方法根据残差、时间步和当前样本来更新样本# prev_sample属性保存了更新后的样本sample scheduler.step(residual, t, sample).prev_sample# 3. 可选地查看图像# 每隔50步检查一次图像以可视化生成过程# 这里display_sample是一个假设的函数用于显示或保存图像if (i 1) % 50 0:display_sample(sample, i 1) 论文https://arxiv.org/abs/1505.04597 Unet code (only complete unet) 代码 https://github.com/yassouali/pytorch-segmentation/blob/master/models/unet.py # 导入基础模块和PyTorch相关模块 from base import BaseModel import torch import torch.nn as nn import torch.nn.functional as F from itertools import chain from base import BaseModel # 这里重复导入了BaseModel可能是一个错误 from utils.helpers import initialize_weights, set_trainable # 导入初始化权重和设置参数可训练性的函数 from itertools import chain # 再次导入chain这里也是多余的 from models import resnet # 导入resnet模型用于UNetResnet变体# 定义一个函数x2conv用于创建一个卷积块包含两个卷积层和BN层 def x2conv(in_channels, out_channels, inner_channelsNone):# 如果没有指定inner_channels则将其设置为out_channels的一半inner_channels out_channels // 2 if inner_channels is None else inner_channels# 创建一个包含两个卷积层和BN层的序列模块down_conv nn.Sequential(nn.Conv2d(in_channels, inner_channels, kernel_size3, padding1, biasFalse), # 第一个卷积层通道数不变面积收缩nn.BatchNorm2d(inner_channels), # 第一个BN层nn.ReLU(inplaceTrue), # ReLU激活函数nn.Conv2d(inner_channels, out_channels, kernel_size3, padding1, biasFalse), # 第二个卷积层对通道数进行扩张nn.BatchNorm2d(out_channels), # 第二个BN层nn.ReLU(inplaceTrue) # ReLU激活函数)return down_conv# 定义编码器模块用于下采样 class encoder(nn.Module):def __init__(self, in_channels, out_channels):super(encoder, self).__init__() # 调用父类的构造函数self.down_conv x2conv(in_channels, out_channels) # 使用x2conv函数创建卷积块self.pool nn.MaxPool2d(kernel_size2, ceil_modeTrue) # 创建最大池化层ceil_modeTrue确保输出尺寸为整数def forward(self, x):x self.down_conv(x) # 通过卷积块x self.pool(x) # 通过池化层return x # 返回结果# 定义解码器模块用于上采样 class decoder(nn.Module):def __init__(self, in_channels, out_channels):super(decoder, self).__init__() # 调用父类的构造函数self.up nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size2, stride2) # 创建上采样卷积层self.up_conv x2conv(in_channels, out_channels) # 使用x2conv函数创建卷积块def forward(self, x_copy, x, interpolateTrue):x self.up(x) # 通过上采样卷积层# 检查尺寸是否一致如果不一致则进行插值或填充if (x.size(2) ! x_copy.size(2)) or (x.size(3) ! x_copy.size(3)):if interpolate:x F.interpolate(x, size(x_copy.size(2), x_copy.size(3)), modebilinear, align_cornersTrue)else:# 计算需要填充的尺寸diffY x_copy.size()[2] - x.size()[2]diffX x_copy.size()[3] - x.size()[3]# 进行填充x F.pad(x, (diffX // 2, diffX - diffX // 2, diffY // 2, diffY - diffY // 2))# 将上采样的特征图与编码器的特征图进行拼接x torch.cat([x_copy, x], dim1)x self.up_conv(x) # 通过卷积块return x # 返回结果# 定义UNet模型 class UNet(BaseModel):def __init__(self, num_classes, in_channels3, freeze_bnFalse, **_):super(UNet, self).__init__() # 调用父类的构造函数# 定义模型的各个部分#4个下采样模块self.start_conv x2conv(in_channels, 64) # 初始卷积层self.down1 encoder(64, 128) # 第一层编码器self.down2 encoder(128, 256) # 第二层编码器self.down3 encoder(256, 512) # 第三层编码器self.down4 encoder(512, 1024) # 第四层编码器#中间卷积self.middle_conv x2conv(1024, 1024) # 中间卷积层#上采样self.up1 decoder(1024, 512) # 第一层解码器self.up2 decoder(512, 256) # 第二层解码器self.up3 decoder(256, 128) # 第三层解码器self.up4 decoder(128, 64) # 第四层解码器#分类self.final_conv nn.Conv2d(64, num_classes, kernel_size1) # 最终的分类卷积层self._initialize_weights() # 初始化权重if freeze_bn:self.freeze_bn() # 如果需要冻结BN层def _initialize_weights(self):# 权重初始化函数for module in self.modules():if isinstance(module, nn.Conv2d) or isinstance(module, nn.Linear):nn.init.kaiming_normal_(module.weight)if module.bias is not None:module.bias.data.zero_()elif isinstance(module, nn.BatchNorm2d):module.weight.data.fill_(1)module.bias.data.zero_()def forward(self, x):# 前向传播函数x1 self.start_conv(x)x2 self.down1(x1)x3 self.down2(x2)x4 self.down3(x3)x self.middle_conv(self.down4(x4))x self.up1(x4, x)x self.up2(x3, x)x self.up3(x2, x)x self.up4(x1, x)x self.final_conv(x)return xdef get_backbone_params(self):# 返回模型参数对于UNet没有预训练的骨干网络所以返回空列表return []def get_decoder_params(self):# 返回解码器的参数return self.parameters()def freeze_bn(self):# 冻结BN层for module in self.modules():if isinstance(module, nn.BatchNorm2d):module.eval() # 定义一个带有ResNet骨干网络的UNet变体 class UNetResnet(BaseModel):def __init__(self, num_classes, in_channels3, backboneresnet50, pretrainedTrue, freeze_bnFalse, freeze_backboneFalse, **_):super(UNetResnet, self).__init__() # 调用父类的构造函数# 根据指定的backbone创建ResNet模型如果pretrained为True则加载预训练权重model getattr(resnet, backbone)(pretrained, norm_layernn.BatchNorm2d)# 提取ResNet模型的前四个部分作为初始层self.initial list(model.children())[:4]# 如果输入通道数不是3则替换第一个卷积层以匹配输入通道数if in_channels ! 3:self.initial[0] nn.Conv2d(in_channels, 64, kernel_size7, stride2, padding3, biasFalse)# 将初始层转换为Sequential模块self.initial nn.Sequential(*self.initial)# 将ResNet模型的层1到层4作为编码器的一部分self.layer1 model.layer1self.layer2 model.layer2self.layer3 model.layer3self.layer4 model.layer4# 定义解码器的卷积层和上采样卷积层self.conv1 nn.Conv2d(2048, 192, kernel_size3, stride1, padding1)self.upconv1 nn.ConvTranspose2d(192, 128, 4, 2, 1, biasFalse)self.conv2 nn.Conv2d(1152, 128, kernel_size3, stride1, padding1)self.upconv2 nn.ConvTranspose2d(128, 96, 4, 2, 1, biasFalse)self.conv3 nn.Conv2d(608, 96, kernel_size3, stride1, padding1)self.upconv3 nn.ConvTranspose2d(96, 64, 4, 2, 1, biasFalse)self.conv4 nn.Conv2d(320, 64, kernel_size3, stride1, padding1)self.upconv4 nn.ConvTranspose2d(64, 48, 4, 2, 1, biasFalse)self.conv5 nn.Conv2d(48, 48, kernel_size3, stride1, padding1)self.upconv5 nn.ConvTranspose2d(48, 32, 4, 2, 1, biasFalse)self.conv6 nn.Conv2d(32, 32, kernel_size3, stride1, padding1)self.conv7 nn.Conv2d(32, num_classes, kernel_size1, biasFalse)# 初始化权重initialize_weights(self)# 如果需要冻结BN层if freeze_bn:self.freeze_bn()# 如果需要冻结ResNet骨干网络的参数if freeze_backbone: set_trainable([self.initial, self.layer1, self.layer2, self.layer3, self.layer4], False)def forward(self, x):# 前向传播函数H, W x.size(2), x.size(3) # 保存输入的高度和宽度# 通过ResNet的初始层和层1到层4获取编码器的特征图x1 self.layer1(self.initial(x))x2 self.layer2(x1)x3 self.layer3(x2)x4 self.layer4(x3)# 通过解码器的卷积层和上采样卷积层逐步上采样并合并特征图x self.upconv1(self.conv1(x4))x F.interpolate(x, size(x3.size(2), x3.size(3)), modebilinear, align_cornersTrue)x torch.cat([x, x3], dim1)x self.upconv2(self.conv2(x))x F.interpolate(x, size(x2.size(2), x2.size(3)), modebilinear, align_cornersTrue)x torch.cat([x, x2], dim1)x self.upconv3(self.conv3(x))x F.interpolate(x, size(x1.size(2), x1.size(3)), modebilinear, align_cornersTrue)x torch.cat([x, x1], dim1)x self.upconv4(self.conv4(x))x self.upconv5(self.conv5(x))# 如果上采样后的特征图尺寸与输入不一致则进行插值以匹配输入尺寸if x.size(2) ! H or x.size(3) ! W:x F.interpolate(x, size(H, W), modebilinear, align_cornersTrue)# 通过最后的卷积层得到最终的输出x self.conv7(self.conv6(x))return xdef get_backbone_params(self):# 返回ResNet骨干网络的参数return chain(self.initial.parameters(), self.layer1.parameters(), self.layer2.parameters(), self.layer3.parameters(), self.layer4.parameters())def get_decoder_params(self):# 返回解码器的参数return chain(self.conv1.parameters(), self.upconv1.parameters(), self.conv2.parameters(), self.upconv2.parameters(),self.conv3.parameters(), self.upconv3.parameters(), self.conv4.parameters(), self.upconv4.parameters(),self.conv5.parameters(), self.upconv5.parameters(), self.conv6.parameters(), self.conv7.parameters())def freeze_bn(self):# 冻结BN层for module in self.modules():if isinstance(module, nn.BatchNorm2d):module.eval()
http://www.yayakq.cn/news/5082/

相关文章:

  • 熟练做网站需要了解什么黑龙江网站设计
  • 赣州福泰龙网站建设东莞地铁线路图
  • 企业网站建设的请示可以自己做漫画的软件
  • 织梦做的网站 xampp成都网站建设 四川冠辰
  • 郑州那个公司做网站好wordpress菜单下拉菜单
  • 微信分销小程序开发新乡百度网站优化排名
  • 还是网站好备案空壳网站
  • 融资网站建设wordpress 合同
  • 武平县天恒建设投资集团公司网站星际网络泰安网络公司
  • 广州专业做网站公司有哪些电脑优化是什么意思
  • 四川建设网站公司wordpress是不是做网页
  • 项目网站建设业务分析企业管理官网登录入口
  • 国外网站建设素材库上海做网站的公司有哪些
  • 办公室装修设计招商seo优化专员编辑
  • 招聘门户网站开发人员做做网站下载2023
  • 什么样的网站快速盈利做网页设计需要学什么
  • 安庆网站关键词优化天津网站设计公司
  • wordpress 下载站模板在网站设计公司上班好吗
  • 怎么让自己做的网站别人可以访问网站定制首页费用
  • 花生壳内网穿透网站如何做seo优化学校网站建设工作领导小组
  • 网站设计结构图用什么做青岛煜鹏网站建设公司
  • 宁津县建设局网站wordpress邮件发送
  • 软件技术跟网站开发有关系吗中企建设网站
  • 网站推广的主要方法天津城乡住房建设厅网站首页
  • 自己的网站是什么样子的东莞有哪些公司
  • 南阳网站建设报价怎么做网站适配
  • 邵阳建设网站公司电子业网站建设
  • 电商网站页面布局河田镇建设局网站
  • 女生自己做网站wordpress公众号采集
  • 企业网站建完后没人重庆网站关键词优化推广