尝试复现了一下,发现有几个问题(不确定),如遇到相同问题,欢迎讨论。
1.class JsonReader
对于build_vocab.py中的class JsonReader,在构建vocab的时候是没有问题的,但在dataset.py中,self.caption[image_name],image_name已经是图像名称,而不需要像build_vocab.py中用key[序号]来取。

所以我认为在运行trainer.py->dataset.py的时候class JsonReader应该改为如下。实验结束也表明修改之后的 JsonReader才会构造出不是空的target。
class JsonReader(object):
def __init__(self, json_file):
self.data = self.__read_json(json_file)
def __read_json(self, filename):
with open(filename, 'r') as f:
data = json.load(f)
return data
def __getitem__(self, item):
return self.data[item]
def __len__(self):
return len(self.data)
2.Sentence LSTM
和issue #11 中所说的一样,要加上这句话不然状态没法更新只会输出同样的内容。

3.Word LSTM
这里的写法有点不太清楚,只能看到原先被注释掉的。* word_mask).sum() * (0.9 ** word_index),这些的含义是什么?

4.Class MLC

感觉圈起来的那一句,应该返回的torch.topk的[0],[0]才是tensor中的内容,而[1]是序号。不知道这边我有没有理解错。
5.MSEloss
此代码中,在做多标签分类的时候用的是MSEloss(是可行的,但不知道是否和文中对应);而论文原文中所说的是交叉熵分类(感觉应该用sigmoid+BCELoss?)
6.图像的输入
文中提到会把image划分成多个region作为输入,但代码中直接使用的是原image(经过了transform操作中的RandomCrop);是直接讲划分成多个region理解为RandomCrop操作吗?还是有另外的操作方式,这里也不是很清楚。
尝试复现了一下,发现有几个问题(不确定),如遇到相同问题,欢迎讨论。
1.class JsonReader
对于build_vocab.py中的class JsonReader,在构建vocab的时候是没有问题的,但在dataset.py中,self.caption[image_name],image_name已经是图像名称,而不需要像build_vocab.py中用key[序号]来取。

所以我认为在运行trainer.py->dataset.py的时候class JsonReader应该改为如下。实验结束也表明修改之后的 JsonReader才会构造出不是空的target。2.Sentence LSTM
和issue #11 中所说的一样,要加上这句话不然状态没法更新只会输出同样的内容。

3.Word LSTM
这里的写法有点不太清楚,只能看到原先被注释掉的。* word_mask).sum() * (0.9 ** word_index),这些的含义是什么?

4.Class MLC

感觉圈起来的那一句,应该返回的torch.topk的[0],[0]才是tensor中的内容,而[1]是序号。不知道这边我有没有理解错。5.MSEloss
此代码中,在做多标签分类的时候用的是MSEloss(是可行的,但不知道是否和文中对应);而论文原文中所说的是交叉熵分类(感觉应该用sigmoid+BCELoss?)
6.图像的输入
文中提到会把image划分成多个region作为输入,但代码中直接使用的是原image(经过了transform操作中的RandomCrop);是直接讲划分成多个region理解为RandomCrop操作吗?还是有另外的操作方式,这里也不是很清楚。