无法将NumPy数组转换为张量(不支持的对象类型dict)

2024-04-19 20:10:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我的方法我认为它的问题是

 history = model.fit_generator(train_generator, epochs=epochs, steps_per_epoch=train_steps, verbose=1, callbacks=[checkpoint], validation_data=val_generator, validation_steps=val_steps)

def data_generator(descriptions, photos, tokenizer, max_length, imgsIds, vocab_size):
    while 1:
        for ind in range(len(imgsIds)):
            photo = photos[ind]
            key = imgsIds[ind]
            desc_list = descriptions[str(key)]
            in_img, in_seq, out_word = create_sequences(
                tokenizer, max_length, desc_list, photo, vocab_size)
            yield [in_img, in_seq], out_word

我得到

Failed to convert a NumPy array to a Tensor (Unsupported object type dict).

如果有什么我应该补充的,请评论。。谢谢

Traceback (most recent call last):
  File "fit.py", line 271, in <module>
    main(sys.argv)
  File "fit.py", line 268, in main
    fit_model(train, train_descriptions, train_rnn_input, val, val_descriptions, val_rnn_input)
  File "fit.py", line 255, in fit_model
    history = model.fit_generator(train_generator, epochs=epochs, steps_per_epoch=train_steps, verbose=1, callbacks=[checkpoint], validation_data=val_generator, validation_steps=val_steps)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 324, in new_func
    return func(*args, **kwargs)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1479, in fit_generator
    initial_epoch=initial_epoch)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 66, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 872, in fit
    return_dict=True)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 66, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1057, in evaluate
    model=self)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1112, in __init__
    model=model)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 775, in __init__
    peek = _process_tensorlike(peek)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1013, in _process_tensorlike
    inputs = nest.map_structure(_convert_numpy_and_scipy, inputs)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/util/nest.py", line 617, in map_structure
    structure[0], [func(*x) for x in entries],
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/util/nest.py", line 617, in <listcomp>
    structure[0], [func(*x) for x in entries],
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1008, in _convert_numpy_and_scipy
    return ops.convert_to_tensor(x, dtype=dtype)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1341, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/framework/tensor_conversion_registry.py", line 52, in _default_conversion_function
    return constant_op.constant(value, dtype, name=name)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 262, in constant
    allow_broadcast=True)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 270, in _constant_impl
    t = convert_to_eager_tensor(value, ctx, dtype)
  File "/path/.local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 96, in convert_to_eager_tensor
    return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type dict).
2021-06-27 04:46:22.936001: W tensorflow/core/kernels/data/generator_dataset_op.cc:103] Error occurred when finalizing GeneratorDataset iterator: Failed precondition: Python interpreter state is not initialized. The process may be terminated.
     [[{{node PyFunc}}]]

编辑

def create_sequences(tokenizer, max_length, desc_list, photo, vocab_size):
    X1, X2, y = list(), list(), list()
    for desc in desc_list:
        seq = tokenizer.texts_to_sequences([desc])[0]
        for i in range(1, len(seq)):
            in_seq, out_seq = seq[:i], seq[i]
            in_seq = pad_sequences([in_seq], maxlen=max_length)[0]
            out_seq = to_categorical([out_seq], num_classes=vocab_size)[0]
            X1.append(np.array(photo).astype(np.float32))
            X2.append(np.array(in_seq).astype(np.float32))
            y.append(np.array(out_seq).astype(np.float32))
    return array(X1), array(X2), array(y)

Tags: topathinpylibpackageslocaltensorflow
1条回答
网友
1楼 · 发布于 2024-04-19 20:10:28

此错误表示数据中的某些值或所有值没有要转换的有效数据类型。


原因

此错误的常见原因是数组的值在图形模式下不是给定的数据类型。这可能是因为某些值是NaNNone,或者所有值的格式都不支持转换为张量,例如python字典


解决方案

这个问题可以通过将数据转换为预期的数据类型来解决,例如,在输入到模型之前对输入数据应用x=np.asarray(x).astype(np.float32)等方法。它还支持NaN值问题。请注意,最好对无数据值进行一些预处理,并用类似^{}的方法替换它们

但在数据类型不受支持的情况下(如python字典),您无法使用上述方法解决问题。您应该更改数据结构,然后将其提供给模型。注意,即使是np.asarray也不能改变结构。您可能会得到数据numpy数组的类型,但结构保持不变,无法由网络处理。因此,不要将该类型作为未被记录的证据。以下是一些示例:

x = {1:1,2:2,3:3,4:4,5:5}
print(type(x))      #<class 'dict'>
x = np.asarray(x)
print(type(x))      #<class 'numpy.ndarray'> #the type is changed
print(x)            #{1: 1, 2: 2, 3: 3, 4: 4, 5: 5} #the structure has not been changed
    

您的场景:

正如代码所反映的,您将数据转换为numpy数组和float。所以,即使没有变量,也不会出现错误。因此,正如错误所反映的(Unsupported object type dict),您的一个输入变量([in_img, in_seq], out_word)是一个字典。根据您的代码,in_seqout_seq是列表。因此,应该是从photo变量启动的in_img。所以,检查这个变量数据。它很可能保存一个类似字典的数据。不要注意类型(print(type(photo))),因为正如我上面的代码所示,它可能是一个numpy.ndarray,但包含一个字典数据

相关问题 更多 >