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

php 网站开发平台商业网站开发需求

php 网站开发平台,商业网站开发需求,wordpress 最大上传,建设商务网站的经济可行性分析生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络#xff0c;高级生成对抗网络 I#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II… 生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer ITransformer II [3] 变分自编码器 [4] 生成对抗网络高级生成对抗网络 I高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 引言 2021 年 1 月OpenAI 宣布了两种新模型DALL-E 和 CLIP这两种模型都是以某种方式连接文本和图像的多模态模型。在本文中我们将在PyTorch中从零开始实现 CLIP 模型。OpenAI 开源了一些与 CLIP 模型相关的代码但我发现它令人生畏而且并不简洁。 CLIP 有什么作用为什么有趣 在《Learning Transferable Visual Models From Natural Language Supervision》论文中OpenAI 介绍了他们的新模型称为CLIP用于Contrastive Language-Image Pre-training。简而言之该模型学习整个句子与其描述的图像之间的关系从某种意义上说当训练模型时给定一个输入句子它将能够检索与该句子相对应的最相关的图像。这里重要的是它是在完整的句子上进行训练而不是像car、dog等单一类别一样。直觉上当在整个句子上进行训练时模型可以学习更多的东西并找到图像和文本之间的一些模式。 他们还表明当该模型在巨大的图像数据集及其相应文本上进行训练时它也可以充当分类器。我鼓励你研究论文原文以更多地了解这个令人兴奋的模型及其在基准数据集上的惊人结果。仅举一例使用此策略训练的 CLIP 模型对 ImageNet 的分类效果比在 ImageNet 本身上训练的 SOTA 模型更好该 SOTA 模型专门针对单一分类任务进行了优化 先跳过过程让我们看看我们将在本文中从头开始构建的最终模型能够实现什么功能给出诸如“一个男孩用滑板跳跃”或“一个女孩从秋千上跳跃”这样的查询模型将检索最相关的图像 开始 让我们直接看它的 PyTorch 实现。首先我们需要一个包含图像和一些描述它们的文本的数据集。坦率地说网上有很多可用的。我们将使用Flickr 8k 数据集您可以使用更大的 30k 版本最终模型的性能会更好该数据集主要用于图像字幕任务。但是, 我们也可以用它来训练 CLIP 模型。 以下代码将下载 8k如果取消注释最后几行则下载 30k并解压缩它们。Kaggle数据集之下载可参考前文。 !pip install kaggle --upgrade import os os.environ[KAGGLE_USERNAME] XXXXXX os.environ[KAGGLE_KEY] XXXXXXXXXXXXXXXXXXXXXX # Enter your Kaggle key here# For Flickr 8k !kaggle datasets download -d adityajn105/flickr8k !unzip flickr8k.zip dataset 8k# For Flickr 30k # !kaggle datasets download -d hsankesara/flickr-image-dataset # !unzip flickr-image-dataset.zip # dataset 30k关于此数据集需要注意的一件事是: 每张图像都有 5 个标题。后面写损失函数的时候再讲这个 数据集 正如您在本文的标题图片中看到的我们需要对图像及其描述文本进行编码。因此数据集需要返回图像和文本。当然我们不会将原始文本提供给我们的文本编码器我们将使用HuggingFace库中的DistilBERT模型它比 BERT 小但性能几乎与 BERT 一样作为我们的文本编码器因此我们需要使用 DistilBERT 分词器对句子标题进行分词然后将分词 id (input_ids) 和注意力掩码提供给 DistilBERT。因此数据集也需要处理标记化。您可以在下面看到数据集的代码。下面我将解释代码中发生的最重要的事情。 关于配置和CFG的说明我用 python 脚本编写了代码然后将其转换为 Jupyter Notebook。因此对于 python 脚本config 是一个普通的 python 文件我在其中放置所有超参数对于 Jupyter Notebook它是在笔记本开头定义的一个类用于保留所有超参数。查看GitHub 存储库或笔记本以查看所有超参数。 import os import cv2 import torch import albumentations as Aimport config as CFGclass CLIPDataset(torch.utils.data.Dataset):def __init__(self, image_filenames, captions, tokenizer, transforms):image_filenames and cpations must have the same length; so, if there aremultiple captions for each image, the image_filenames must have repetitivefile names self.image_filenames image_filenamesself.captions list(captions)self.encoded_captions tokenizer(list(captions), paddingTrue, truncationTrue, max_lengthCFG.max_length)self.transforms transformsdef __getitem__(self, idx):item {key: torch.tensor(values[idx])for key, values in self.encoded_captions.items()}image cv2.imread(f{CFG.image_path}/{self.image_filenames[idx]})image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image self.transforms(imageimage)[image]item[image] torch.tensor(image).permute(2, 0, 1).float()item[caption] self.captions[idx]return itemdef __len__(self):return len(self.captions)def get_transforms(modetrain):if mode train:return A.Compose([A.Resize(CFG.size, CFG.size, always_applyTrue),A.Normalize(max_pixel_value255.0, always_applyTrue),])else:return A.Compose([A.Resize(CFG.size, CFG.size, always_applyTrue),A.Normalize(max_pixel_value255.0, always_applyTrue),])在 init 中我们收到一个 tokenizer 对象它实际上是一个 HuggingFace tokinzer运行模型时将加载此标记生成器。我们将字幕填充并截断为指定的 max_length。在 getitem 中我们将首先加载一个编码的标题它是一个带有 input_ids 和 Attention_mask 键的字典根据其值创建张量然后我们将加载相应的图像对其进行变换和增强如果有的话然后我们将其设为张量并将其放入以“image”为键的字典中。最后我们将带有“caption”键的标题的原始文本放入字典中仅用于可视化目的。 我没有使用额外的数据增强但如果您想提高模型的性能可以添加它们。 图像编码器 图像编码器代码很简单。我在这里使用 PyTorch 图像模型库 (timm)它提供了从 ResNets 到 EfficientNets 等许多不同的图像模型。这里我们将使用ResNet50作为我们的图像编码器。如果您不想安装新的库您可以轻松地使用 torchvision 库来使用 ResNets。 class ImageEncoder(nn.Module):Encode images to a fixed size vectordef __init__(self, model_nameCFG.model_name, pretrainedCFG.pretrained, trainableCFG.trainable):super().__init__()self.model timm.create_model(model_name, pretrained, num_classes0, global_poolavg)for p in self.model.parameters():p.requires_grad trainabledef forward(self, x):return self.model(x)该代码将每个图像编码为固定大小的向量其大小与模型输出通道的大小相同在 ResNet50 的情况下向量大小将为2048。这是 nn.AdaptiveAvgPool2d() 层之后的输出。 文本编码器 正如我之前提到的我将使用 DistilBERT 作为文本编码器。与它的大哥 BERT 一样两个特殊的标记将被添加到实际的输入标记中CLS和SEP它们标记句子的开始和结束。为了获取句子的完整表示正如相关的 BERT 和 DistilBERT 论文所指出的那样我们使用 CLS 标记的最终表示并且我们希望该表示能够捕获句子标题的整体含义。这样想的话就类似于我们对图像的处理将其转换为固定大小的向量。 from transformers import DistilBertModel, DistilBertConfigclass TextEncoder(nn.Module):def __init__(self, model_nameCFG.text_encoder_model, pretrainedCFG.pretrained, trainableCFG.trainable):super().__init__()if pretrained:self.model DistilBertModel.from_pretrained(model_name)else:self.model DistilBertModel(configDistilBertConfig())for p in self.model.parameters():p.requires_grad trainable# we are using the CLS token hidden representation as the sentences embeddingself.target_token_idx 0def forward(self, input_ids, attention_mask):output self.model(input_idsinput_ids, attention_maskattention_mask)last_hidden_state output.last_hidden_statereturn last_hidden_state[:, self.target_token_idx, :]对于 DistilBERT以及 BERT每个标记的输出隐藏表示是一个大小为768的向量。因此整个标题将被编码为大小为 768 的 CLS 令牌表示形式。 Projection Head 我使用Keras 代码示例实现在 PyTorch 中编写了以下内容。 现在我们已经将图像和文本编码为固定大小的向量图像为 2048文本为 768我们需要将它们带投影到一个图像和文本具有相似尺寸的新世界以便能够对它们进行比较将不相关的图像和文本分开并将匹配的图像和文本放在一起。因此以下代码将把 2048 和 768 维向量带入 256 (projection_dim) 维世界我们可以在其中比较它们 import torch from torch import nnclass ProjectionHead(nn.Module):def __init__(self,embedding_dim,projection_dimCFG.projection_dim,dropoutCFG.dropout):super().__init__()self.projection nn.Linear(embedding_dim, projection_dim)self.gelu nn.GELU()self.fc nn.Linear(projection_dim, projection_dim)self.dropout nn.Dropout(dropout)self.layer_norm nn.LayerNorm(projection_dim)def forward(self, x):projected self.projection(x)x self.gelu(projected)x self.fc(x)x self.dropout(x)x x projectedx self.layer_norm(x)return x“embedding_dim”是输入向量的大小图像为 2048文本为 768“projection_dim”是输出向量的大小在我们的例子中为 256。要了解这部分的详细信息您可以参考CLIP 论文。 CLIP模型 这部分是最有趣的这里我还要讲一下损失函数。我将Keras 代码示例中的一些代码翻译成 PyTorch 来编写这部分。查看代码然后阅读该代码块下面的说明。 import torch from torch import nn import torch.nn.functional as Fimport config as CFG from modules import ImageEncoder, TextEncoder, ProjectionHeadclass CLIPModel(nn.Module):def __init__(self,temperatureCFG.temperature,image_embeddingCFG.image_embedding,text_embeddingCFG.text_embedding,):super().__init__()self.image_encoder ImageEncoder()self.text_encoder TextEncoder()self.image_projection ProjectionHead(embedding_dimimage_embedding)self.text_projection ProjectionHead(embedding_dimtext_embedding)self.temperature temperaturedef forward(self, batch):# Getting Image and Text Featuresimage_features self.image_encoder(batch[image])text_features self.text_encoder(input_idsbatch[input_ids], attention_maskbatch[attention_mask])# Getting Image and Text Embeddings (with same dimension)image_embeddings self.image_projection(image_features)text_embeddings self.text_projection(text_features)# Calculating the Losslogits (text_embeddings image_embeddings.T) / self.temperatureimages_similarity image_embeddings image_embeddings.Ttexts_similarity text_embeddings text_embeddings.Ttargets F.softmax((images_similarity texts_similarity) / 2 * self.temperature, dim-1)texts_loss cross_entropy(logits, targets, reductionnone)images_loss cross_entropy(logits.T, targets.T, reductionnone)loss (images_loss texts_loss) / 2.0 # shape: (batch_size)return loss.mean()def cross_entropy(preds, targets, reductionnone):log_softmax nn.LogSoftmax(dim-1)loss (-targets * log_softmax(preds)).sum(1)if reduction none:return losselif reduction mean:return loss.mean()在这里我们将使用之前构建的模块来实现主模型。init 函数是不言自明的。在前向函数中我们首先将图像和文本分别编码为固定大小的向量具有不同的维度。之后使用单独的投影模块我们将它们投影到我之前谈到的共享世界空间。这里的编码将变得相似的形状在我们的例子中是 256。之后我们将计算损失。我再次建议阅读 CLIP 论文以使其更好但我会尽力解释这部分。 在线性代数中衡量两个向量是否具有相似特征它们彼此相似的一种常见方法是计算它们的点积将匹配项相乘并取它们的总和如果最终的数字很大那么它们是相似的如果最后的数字很小那么它们就不相似相对而言 好的我刚才所说的是理解这个损失函数需要牢记的最重要的事情。我们继续吧。我们讨论了两个向量但是我们这里有什么我们有 image_embeddings形状为 (batch_size, 256) 的矩阵和形状为 (batch_size, 256) 的 text_embeddings。够简单的这意味着我们有两组向量而不是两个单个向量。我们如何测量两组向量两个矩阵彼此的相似程度同样使用点积在这种情况下PyTorch 中的 运算符执行点积或矩阵乘法。为了能够将这两个矩阵相乘我们转置第二个矩阵。好的我们得到一个形状为 (batch_size, batch_size) 的矩阵我们将其称为logits。在我们的例子中温度等于 1.0因此它没有什么区别。您可以使用它看看它会产生什么差异。另请参阅论文了解它为什么在这里。 我希望你还在我身边如果不是也没关系只需检查代码并检查它们的形状即可。现在我们有了逻辑我们需要目标。我需要说的是有一种更直接的方法来获取目标但我必须为我们的案例这样做我将在下一段中讨论原因。 让我们考虑一下我们希望这个模型学习什么我们希望它学习给定图像和描述它的标题的“相似表示向量”。这意味着我们要么给它一个图像要么给它描述它的文本我们希望它为两者生成相同的 256 大小的向量。 因此在最好的情况下text_embeddings 和 image_embedding 矩阵应该相同因为它们描述的是相似的事物。现在我们想一下如果发生这种情况logits 矩阵会是什么样子让我们看一个简单的例子 import torch from torch import nn import torch.nn.functional as F import matplotlib.pyplot as pltbatch_size 4 dim 256 embeddings torch.randn(batch_size, dim) out embeddings embeddings.T print(F.softmax(out, dim-1))----------- # tensor([[1., 0., 0., 0.], # [0., 1., 0., 0.], # [0., 0., 1., 0.], # [0., 0., 0., 1.]])因此在最好的情况下logits 将是一个矩阵如果我们采用其 softmax对角线中将有 1.0一个用奇特的词来称呼它的单位矩阵。由于损失函数的作用是使模型的预测与目标相似至少在大多数情况下因此我们希望这样的矩阵作为我们的目标。这就是我们在上面的代码块中计算 images_similarity 和 texts_similarity 矩阵的原因。 现在我们已经有了目标矩阵我们将使用简单的交叉熵来计算实际损失。我已经将交叉熵的完整矩阵形式编写为函数您可以在代码块的底部看到。好的我们完了是不是很简单好吧你可以忽略下一段但如果你好奇的话里面有一个重要的注释。 这就是为什么我没有使用更简单的方法我需要承认在 PyTorch 中有一种更简单的方法来计算这种损失通过这样做nn.CrossEntropyLoss()(logits, torch.arange(batch_size))。为什么我这里没有使用它有两个原因。1- 我们使用的数据集对单个图像有多个标题因此批次中可能存在两个具有相似标题的相同图像这种情况很少见但可能会发生。使用这种更简单的方法获取损失将忽略这种可能性并且模型学会分离实际上相同的两个表示假设它们不同。显然我们不希望这种情况发生因此我以照顾这些边缘情况的方式计算了整个目标矩阵。2-按照我的方式做让我更好地理解了这个损失函数中发生的事情所以我认为这也会给你更好的直觉 训练 这是一个训练模型的函数。这里没有发生太多事情只需加载批次将它们输入模型并步进优化器和 lr_scheduler。 def train_epoch(model, train_loader, optimizer, lr_scheduler, step):loss_meter AvgMeter()tqdm_object tqdm(train_loader, totallen(train_loader))for batch in tqdm_object:batch {k: v.to(CFG.device) for k, v in batch.items() if k ! caption}loss model(batch)optimizer.zero_grad()loss.backward()optimizer.step()if step batch:lr_scheduler.step()count batch[image].size(0)loss_meter.update(loss.item(), count)tqdm_object.set_postfix(train_lossloss_meter.avg, lrget_lr(optimizer))return loss_meter好的我们已经完成了模型的训练。现在我们需要进行推理在我们的例子中将给模型一段文本并希望它从看不见的验证或测试集中检索最相关的图像。 获取图像嵌入 在此函数中我们加载训练后保存的模型向其提供验证集中的图像并返回形状为 (valid_set_size, 256) 的 image_embeddings 和模型本身。 def get_image_embeddings(valid_df, model_path):tokenizer DistilBertTokenizer.from_pretrained(CFG.text_tokenizer)valid_loader build_loaders(valid_df, tokenizer, modevalid)model CLIPModel().to(CFG.device)model.load_state_dict(torch.load(model_path, map_locationCFG.device))model.eval()valid_image_embeddings []with torch.no_grad():for batch in tqdm(valid_loader):image_features model.image_encoder(batch[image].to(CFG.device))image_embeddings model.image_projection(image_features)valid_image_embeddings.append(image_embeddings)return model, torch.cat(valid_image_embeddings)寻找匹配项 该函数执行我们希望模型能够完成的最终任务它获取模型、image_embeddings 和文本查询。它将显示验证集中最相关的图像是不是很神奇呢让我们看看它到底表现如何 def find_matches(model, image_embeddings, query, image_filenames, n9):tokenizer DistilBertTokenizer.from_pretrained(CFG.text_tokenizer)encoded_query tokenizer([query])batch {key: torch.tensor(values).to(CFG.device)for key, values in encoded_query.items()}with torch.no_grad():text_features model.text_encoder(input_idsbatch[input_ids], attention_maskbatch[attention_mask])text_embeddings model.text_projection(text_features)image_embeddings_n F.normalize(image_embeddings, p2, dim-1)text_embeddings_n F.normalize(text_embeddings, p2, dim-1)dot_similarity text_embeddings_n image_embeddings_n.T# multiplying by 5 to consider that there are 5 captions for a single image# so in indices, the first 5 indices point to a single image, the second 5 indices# to another one and so on.values, indices torch.topk(dot_similarity.squeeze(0), n * 5)matches [image_filenames[idx] for idx in indices[::5]]_, axes plt.subplots(math.sqrt(n), math.sqrt(n), figsize(10, 10))for match, ax in zip(matches, axes.flatten()):image cv2.imread(f{CFG.image_path}/{match})image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)ax.imshow(image)ax.axis(off)plt.show()让我们看一些例子此时当我看到输出时我高兴地尖叫起来并惊讶于该模型实际上正在学习图像和文本之间的这种关系这种感觉简直难以置信。 find_matches(model, image_embeddings,queryone dog sitting on the grass,image_filenamesvalid_df[image].values,n9)这就是我们使用这个函数的方式。结果如下 我当时就想哇这个模型知道一些东西当然它并不完美因为有些图片中有两只狗但考虑到训练集小和训练时间短我认为这很棒 让我们看看其他一些输出。Quert写在每个图像的顶部。 看它还可以算数将此与上一个进行比较。该模型知道“两个”的含义并提供了有两只狗的图像与之前的查询形成鲜明对比这一刻我第二次震惊得尖叫起来 文章开头的输出 对于下面的示例模型犯了一些错误但总的来说它显然对文本和图像都有很好的理解。 资源 本文对应的Github代码库 本博文译自Moein Shariatnia的博客
http://www.dnsts.com.cn/news/30393.html

相关文章:

  • 利用表单大师做网站网站怎么设计好看的图片
  • 网站头部样式企业网络规划设计
  • 美工网站模板推荐坪地网站建设
  • 连城县建设局网站个人公众号做电影网站吗
  • 江苏齐力建设集团网站用html5做手机网站
  • 旅游网站建设怎么做wordpress文章自动发布功能
  • 如何在vps上建设网站江西网站设计欣赏
  • 什么是a站在局域网内访问本机的asp网站
  • 网站初期缺点网站开发与建设会计分录
  • 个人网站备案材料填写沛县建设工程交易网
  • 昆明做网站费用wordpress网站数据库备份
  • 电子商务网站分类网站建设佰首选金手指十六
  • 白酒网站设计石家庄在线制作网站
  • 做网站网站推广赚佣金网站开发实习总结
  • 中国建设银行安徽省 招聘信息网站软件开发培训班哪个好
  • 可以免费秒玩游戏的网站沈阳网站建设三好街
  • 贵阳网站页面设计沂源网站建设
  • 厦门市建设局网站规划标准服务平台型网站
  • 青岛网站建设代理加盟郑州有做彩票网站的吗
  • 简述从网站规划的角度常见的网站模式成都市新津县建设局官方网站
  • 安徽元鼎建设工程网站没人注意的暴利行业
  • vue可以做网站吗网站死链怎么删除
  • 国基建设集团有限公司网站做企业网站需要购什么
  • 网站做sem对优化有影响吗石家庄网页设计招聘
  • 宜兴市建设局网站高端企业网站建设制作
  • 建一个网站大约需要花费多少钱广州网站设计公司排名
  • 网站外链哪里做关于动漫网站建设规划表
  • 免费影视剧网站wordpress首页打开要10几秒
  • 网站如何做数据储存的建设部颁发的证书网站
  • 如何丰富网站内容网站建设与管理综合实践