【问题标题】:Passing x_train as a list of numpy arrays to tf.data.Dataset is not working将 x_train 作为 numpy 数组列表传递给 tf.data.Dataset 不起作用
【发布时间】:2020-11-17 14:42:09
【问题描述】:

我的问题是 tf.data.Dataset.from_tensor_slices(x_train, y_train) 中的 x_train 需要是一个列表。当我使用以下行将 [x1_train,x2_train] 传递给 tensorflow.data.Dataset.from_tensor_slices 时,出现错误(x1_train、x2_train 和 y_train 是 numpy 数组):

Train=tensorflow.data.Dataset.from_tensor_slices(([x1_train,x2_train], y_train)).batch(batch_size)

错误:

Train=tensorflow.data.Dataset.from_tensor_slices(([x1_train,x2_train], y_train)).batch(batch_size)
return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Can't convert non-rectangular Python sequence to Tensor.

我该怎么办?

【问题讨论】:

  • 你在哪一行得到这个错误?
  • 我更新了问题
  • 实际上我今天遇到了完全相同的错误,我的问题是tf.data.Dataset.from_tensor_slices(x_train, y_train) 中的x_train 需要是一个列表,但是根据您提供的信息,我不确定这是否也适用于你。您能否提供更多关于您的实际目标以及x1_trainx2_trainy_train 中包含哪些数据的信息?
  • 是的。我也有同样的问题。 x1_train、x2_train 和 y_train 是 numpy 数组,我需要传递 [x1_train,x2_train] 因为我的模型有两组输入(我将其中一组通过一些层,然后与第二组输入聚合)。你是怎么解决的?

标签: tensorflow keras deep-learning tensorflow2.0 tensorflow-datasets


【解决方案1】:

如果主要目标是将数据提供给具有多个输入层的模型,那么以下方法可能会有所帮助:

import tensorflow as tf
from tensorflow import keras
import numpy as np

def _input_fn(n):
  x1_train = np.array([1, 2, 3, 4, 5, 6, 7, 8], dtype=np.int64)
  x2_train = np.array([15, 25, 35, 45, 55, 65, 75, 85], dtype=np.int64)

  labels = np.array([40, 30, 20, 10, 80, 70, 50, 60], dtype=np.int64)

  dataset = tf.data.Dataset.from_tensor_slices(({"input_1": x1_train, "input_2": x2_train}, labels))
  dataset = dataset.batch(2, drop_remainder=True)
  dataset = dataset.repeat(n)
  return dataset

input1 = keras.layers.Input(shape=(1,), name='input_1')
input2 = keras.layers.Input(shape=(1,), name='input_2')

model = keras.models.Model(inputs=[input_1, input_2], outputs=output)

基本上不是传递一个 python 列表,而是传递一个字典,其中的键表示数组将被馈送到的层的名称。

像上面的数组 x1_train 一样,将被馈送到名称为 input_1 的张量 input1。引用自here

【讨论】:

  • 感谢您的回答。如何在您的代码中使用 .prefetch、.catch 和 .make_one_shot_iterator? (我想在多个 GPU 上训练)
  • @hsn15051,是的,你可以使用
  • 你能告诉我我应该按什么顺序使用吗? (在 dataset.repeat(n) 之前或 dataset.repeat(n) 之后)
  • @hsn15051,将整个代码放在此处进行 mult-gpus 培训将超出此问题的范围。请为此提出一个单独的问题,并提及您的 tensorflow 版本。还请参考此视频演示一次youtube.com/…
  • 我将 tf.data 与 tfrecords 一起使用。我为此使用的序列是list_files->shuffle->repeat->interleave->batch->map->cache->prefetch
【解决方案2】:

如果您有不同类型(float32、int 和 str)的数据框,则必须手动创建它。

遵循 Pratik 的语法:

tf.data.Dataset.from_tensor_slices(({"input_1": np.asarray(var_float).astype(np.float32), "imput_2": np.asarray(var_int).astype(np.int), ...}, labels))

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多