https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Image-Captioning
首先要感谢这个在github上公开代码的大佬,很牛~
“站在巨人的肩膀上”,这里记录一下最近一段时间理解这个代码的心得体会。
一、模型输入数据
1、create_input_files.py + utils.py(create_input_files函数)
这两个东西,是用来生成输入模型的数据文件的,不是特别难理解,其中:
(1)图像 HDF5文件:
由于直接输入图像会导致占用内存太多而降低效率(一般电脑都接受不了),所以要将图像都压缩存储在hdf5中,并在此过程中图像大小均被resize成(3,256,256),同时它也会记录每个图片有多少个描述句子,这里是5。
(2)词表 WORDMAP文件:
所谓的词表文件,格式为:"word":id。
WORDMAP内容展示word是数据集文件中,所有描述句子的token,这里去掉了词频低于5的token;id是从1自增的。
WORDMAP内容展示要注意的是:①这里会将<unk>、<start>、<end>、<pad>放在最后;②这里会将句子长度超过50的句子丢弃掉。
<unk>代表了缺省词,即没在词表中出现过的词;<start>代表了生成句子的开始标识符,这里我的个人理解是:因为在生成第一个词时,需要有一个LSTM输入,为了固定这一个输入,就有了<start>;<end>代表了一个句子的结尾标识符,当LSTM的输出为<end>符时代表句子生成结束;<pad>代表了空白填充符,为了使所有输入到LSTM的句子统一长度,我们可以填0的方法,所以在制作词表的时候,<pad>对应的id就是0。
(3)句子表示 CAPTIONS文件:
我们有了词表,就可以根据当前句子中的词在词表中的id来表示一个句子了:
TEST_CAPTIONS_flickr30k_5_cap_per_img_5_min_word_freq.json这里要注意的一个操作是,对于一张图片不足5句描述句的图片(假如一张图片只有3个描述句),这里会将随机从3个描述句中任意选择一个句子做填充,且要选择两次。
2、dataset.py
这个文件用来将数据集文件对象化!!
image在这里会经过一系列变化转换,变换为对模型训练更加友好的数据,其中包括一些归一化操作等。
这里有一个操作是 :
```
img = torch.FloatTensor(self.imgs[i //self.cpi] /255.)
```
//,是因为每5句话对应一张图片,255.是为了归一化。
今天就到这里咯!
网友评论