Tokenizer.word_index 不包含 "START" 或 "END",而是包含 "start" 和 "end"
Tokenizer.word_index did not contain "START" or "END", rather contained "start" and "end"
我试图以与 here 类似的方式制作图像字幕模型
我使用 ResNet50 而不是 VGG16,并且还必须通过 model.fit_generator() 方法使用渐进式加载。
我使用了 here 的 ResNet50,当我通过设置 include_top = False 导入它时,它给了我 {'key' 形状的照片特征:[[[[value1, value2, .. .. 值 2048]]]]},其中 "key" 是图像 ID。
这是我的 captionGenerator 函数代码:-
def createCaptions(tokenizer, photoData, MaxLength, model):
for key, feature in photoData.items():
inSeq = "START"
for i in range(MaxLength):
sequence = tokenizer.texts_to_sequences([inSeq])[0]
sequence = pad_sequences([sequence], maxlen = MaxLength)
ID = model.predict([np.array(feature[0][0][0]), sequence])
ID = np.argmax(ID)
ID = word_for_id(ID)
if ID is None:
break
inSeq += " " + ID
if ID == "END":
break
print(inSeq)
函数 word_for_id 是:-
def word_for_id(integer, tokenizer):
for word, index in tokenizer.word_index.items():
if index == integer:
return word
return None
我通过以下方式生成了照片数据:-
features = {}
for images in os.listdir(args["image"]):
filename = args["image"] + '/' + images
image = load_img(filename, target_size = inputShape)
image = img_to_array(image)
image = np.expand_dims(image, axis = 0)
image = preprocess(image)
pred = resnet.predict(image)
image_id = images.split('.')[0]
features[image_id] = pred
print('>{}'.format(images))
features 是我的 photoData 字典。
问题是,在我通过以下方式生成的训练数据照片描述中:-
def train_test_data(filename):
DataFile = open(filename, 'r')
Data = DataFile.read()
DataFile.close()
ImageID = []
textDataFile = pickle.load(open('descriptions.pkl', 'rb'))
for line in Data.split('\n'):
if len(line) < 1:
continue
ImageID.append(line.split('.')[0])
Data = {}
for key in textDataFile:
if key in ImageID:
Data[key] = textDataFile[key]
for ID in Data:
for i in range(len(Data[ID])):
l = Data[ID][i]
l = "START " + " ".join(l) + " END"
Data[ID][i] = l
return Data
这里,我在描述的每个句子的开头和结尾分别添加了"START"和"END"。但是在 tokenizer.word_index 中, "START" 和 "END" 没有找到作为键。即:-
k = pickle.load(open('word_index.pkl', 'rb'))
print("START" in k)
结果为 False。
请向我解释为什么会这样。
如果我这样做:-
k = pickle.load(open('word_index.pkl', 'rb'))
print("start" in k)
答案出来了。
那是因为默认情况下Tokenizer
在根据lower=True
参数拟合时降低了单词。您可以在创建分词器时使用小写字母或传递 lower=False
,documentation.
我试图以与 here 类似的方式制作图像字幕模型 我使用 ResNet50 而不是 VGG16,并且还必须通过 model.fit_generator() 方法使用渐进式加载。 我使用了 here 的 ResNet50,当我通过设置 include_top = False 导入它时,它给了我 {'key' 形状的照片特征:[[[[value1, value2, .. .. 值 2048]]]]},其中 "key" 是图像 ID。 这是我的 captionGenerator 函数代码:-
def createCaptions(tokenizer, photoData, MaxLength, model):
for key, feature in photoData.items():
inSeq = "START"
for i in range(MaxLength):
sequence = tokenizer.texts_to_sequences([inSeq])[0]
sequence = pad_sequences([sequence], maxlen = MaxLength)
ID = model.predict([np.array(feature[0][0][0]), sequence])
ID = np.argmax(ID)
ID = word_for_id(ID)
if ID is None:
break
inSeq += " " + ID
if ID == "END":
break
print(inSeq)
函数 word_for_id 是:-
def word_for_id(integer, tokenizer):
for word, index in tokenizer.word_index.items():
if index == integer:
return word
return None
我通过以下方式生成了照片数据:-
features = {}
for images in os.listdir(args["image"]):
filename = args["image"] + '/' + images
image = load_img(filename, target_size = inputShape)
image = img_to_array(image)
image = np.expand_dims(image, axis = 0)
image = preprocess(image)
pred = resnet.predict(image)
image_id = images.split('.')[0]
features[image_id] = pred
print('>{}'.format(images))
features 是我的 photoData 字典。
问题是,在我通过以下方式生成的训练数据照片描述中:-
def train_test_data(filename):
DataFile = open(filename, 'r')
Data = DataFile.read()
DataFile.close()
ImageID = []
textDataFile = pickle.load(open('descriptions.pkl', 'rb'))
for line in Data.split('\n'):
if len(line) < 1:
continue
ImageID.append(line.split('.')[0])
Data = {}
for key in textDataFile:
if key in ImageID:
Data[key] = textDataFile[key]
for ID in Data:
for i in range(len(Data[ID])):
l = Data[ID][i]
l = "START " + " ".join(l) + " END"
Data[ID][i] = l
return Data
这里,我在描述的每个句子的开头和结尾分别添加了"START"和"END"。但是在 tokenizer.word_index 中, "START" 和 "END" 没有找到作为键。即:-
k = pickle.load(open('word_index.pkl', 'rb'))
print("START" in k)
结果为 False。 请向我解释为什么会这样。 如果我这样做:-
k = pickle.load(open('word_index.pkl', 'rb'))
print("start" in k)
答案出来了。
那是因为默认情况下Tokenizer
在根据lower=True
参数拟合时降低了单词。您可以在创建分词器时使用小写字母或传递 lower=False
,documentation.