【问题标题】:AttributeError: 'str' object has no attribute 'ndim', unable to use model.predict()AttributeError:“str”对象没有属性“ndim”,无法使用 model.predict()
【发布时间】:2018-10-25 05:29:54
【问题描述】:

我试图以与here 类似的方式制作图像字幕模型

我使用 ResNet50 代替 VGG16 并且还必须通过 model.fit_generator() 方法使用渐进式加载。

我使用来自here 的 ResNet50,当我通过设置 include_top = False 导入它时,它给了我形状为 {'key': [[[[value1, value2, .... value 2048] 的照片特征]]]},其中 "key" 是图像 ID。

这是我的字幕生成器函数代码:-

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]), inSeq])
            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

我通过以下方式生成了 photoData:-

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 字典。

当我尝试生成字幕时:-

caption = createCaptions(tokenizerTrain, features, 34, model)

我收到以下错误:-

Traceback (most recent call last):
  File "CaptionGenerator.py", line 111, in <module>
caption = createCaptions(tokenizerTrain, features, 34, model)
  File "CaptionGenerator.py", line 101, in createCaptions
ID = model.predict([np.array(feature[0][0][0]), inSeq])
  File "/home/aditya/.virtualenvs/cv/lib/python3.5/site-packages/keras/engine/training.py", line 1817, in predict
check_batch_axis=False)
  File "/home/aditya/.virtualenvs/cv/lib/python3.5/site-packages/keras/engine/training.py", line 76, in _standardize_input_data
data = [np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data]
  File "/home/aditya/.virtualenvs/cv/lib/python3.5/site-packages/keras/engine/training.py", line 76, in <listcomp>
data = [np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data]
AttributeError: 'str' object has no attribute 'ndim'

我哪里做错了? 请帮忙。 提前致谢。

【问题讨论】:

    标签: python-3.x tensorflow keras deep-learning captions


    【解决方案1】:

    您将inSeq = "START" 作为字符串传递给model.predict

    ID = model.predict([np.array(feature[0][0][0]), inSeq])
    

    无需预处理。您需要将其编码为数组。

    【讨论】:

    • 感谢更正:) 我的 word_for_id 函数中又出现了一个错误:- Traceback(最近一次调用最后一次):文件“CaptionGenerator.py”,第 111 行,在 中标题 = createCaptions(tokenizerTrain ,特征,36,模型)文件“CaptionGenerator.py”,第 102 行,在 createCaptions ID = word_for_id(ID,tokenizer)文件“CaptionGenerator.py”,第 90 行,在 word_for_id 如果索引 == 整数:ValueError:真值具有多个元素的数组是不明确的。使用 a.any() 或 a.all() 这是什么意思?
    • 当我在 word_for_id 函数中应用 if (index == integer).any() 时,我只会得到“START”作为输出。我哪里错了?
    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多