show_and_tell 代码实现及测试-——批量训练

introduction

Image Caption是一个融合计算机视觉、自然语言处理和机器学习的综合问题。

能够用正确的英语句子自动描述图像的内容是一项非常具有挑战性的任务,但它可以帮助视障人士更好地理解网络上的图像内容。例如,这项任务比研究良好的图像分类或对象识别任务要困难得多,这是Computer vision community的主要关注点。实际上,描述不仅必须捕获图像中包含的对象,而且还必须表达这些对象之间的关系。

参考论文:https://arxiv.org/abs/1411.4555

代码实现: https://github.com/mosessoh/CNN-LSTM-Caption-Generator

视频:  https://www.youtube.com/watch?v=XgJGvhkv_Mo

 中文翻译: https://www.jianshu.com/p/3330a56f0d5e

 

鉴于GitHub中原作者的代码需要用到caffe,这里介绍一种只需要用tensorflow来训练的改进版,其效果是一样的。

注意:作者电脑配置是i7-7700HQ 2.80GHz ,GTX1070ti ,16G 可以做个参考

           在下载数据集前要注意磁盘空间要留出150G左右(真正可能会用到100G)

第一步:

下载程序:http://download.csdn.net/download/laurenitum0716/10256327

第二步:

配置环境下载包

1.tensorflow1.0及以上

         作者所用的事tensorflow1.4  ,还未装的小伙伴可以参考我的另一篇博文

         https://blog.csdn.net/m0_38073193/article/details/82290249

显卡足够的小伙伴建议安装tensorflow(GPU),训练速度会比CPU版的快上10倍,作者只用了4个小时左右就训练好了。

2.NumPy  用pip下载即可

3.Natural Language Toolkit (NLTK)

    安装教程:1) pip 下载nltk 

                     

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Show, Attend and Tell (SAT) 是一种基于深度学习图像描述生成模型,它使用卷积神经网络来提取图像的特征,并使用循环神经网络来生成描述语句。 以下是SAT的代码实现,使用PyTorch框架: ```python import torch import torch.nn as nn import torchvision.models as models import torchvision.transforms as transforms from torch.autograd import Variable # 定义预处理,将图像转换为模型需要的格式 transform = transforms.Compose([ transforms.Resize(224), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 定义模型 class EncoderCNN(nn.Module): def __init__(self, embed_size): super(EncoderCNN, self).__init__() # 加载预训练的ResNet-152模型 resnet = models.resnet152(pretrained=True) # 去掉最后一层全连接层 modules = list(resnet.children())[:-1] self.resnet = nn.Sequential(*modules) # 添加全连接层,将ResNet的输出转换为指定大小的向量 self.fc = nn.Linear(resnet.fc.in_features, embed_size) self.init_weights() def init_weights(self): # 初始化全连接层的权重 self.fc.weight.data.normal_(0.0, 0.02) self.fc.bias.data.fill_(0) def forward(self, images): # 提取图像的特征 features = self.resnet(images) features = Variable(features.data) features = features.view(features.size(0), -1) # 将特征向量转换为指定大小的向量 features = self.fc(features) return features class DecoderRNN(nn.Module): def __init__(self, embed_size, hidden_size, vocab_size, num_layers): super(DecoderRNN, self).__init__() self.embed = nn.Embedding(vocab_size, embed_size) self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first=True) self.linear = nn.Linear(hidden_size, vocab_size) self.init_weights() def init_weights(self): # 初始化Embedding层和全连接层的权重 self.embed.weight.data.uniform_(-0.1, 0.1) self.linear.weight.data.normal_(0.0, 0.02) self.linear.bias.data.fill_(0) def forward(self, features, captions, lengths): # 将输入的句子转换为词向量 embeddings = self.embed(captions) # 将图像的特征向量和词向量拼接在一起作为输入 inputs = torch.cat((features.unsqueeze(1), embeddings), 1) # 对输入进行打包,加速训练过程 packed = nn.utils.rnn.pack_padded_sequence(inputs, lengths, batch_first=True) # 通过LSTM进行编码 hiddens, _ = self.lstm(packed) # 对LSTM的输出进行解码 outputs = self.linear(hiddens[0]) return outputs def sample(self, features, states=None): # 生成图像描述 sampled_ids = [] inputs = features.unsqueeze(1) for i in range(20): # 最长的描述句子长度为20 hiddens, states = self.lstm(inputs, states) outputs = self.linear(hiddens.squeeze(1)) _, predicted = outputs.max(1) sampled_ids.append(predicted) inputs = self.embed(predicted) inputs = inputs.unsqueeze(1) # 将生成描述转换为单词 sampled_ids = torch.cat(sampled_ids, 0) return sampled_ids.squeeze() ``` 这个代码实现分为两个部分,一个是EncoderCNN,一个是DecoderRNN。EncoderCNN使用预训练的ResNet-152模型提取图像的特征,然后将特征向量转换为指定大小的向量。DecoderRNN使用LSTM将图像的特征向量和描述语句的词向量拼接在一起进行编码,然后再进行解码生成描述语句。同时,DecoderRNN还实现了一个sample方法,可以在生成描述语句时进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值