【问题标题】:InvalidArgumentError: Incompatible shapes: [3] vs. [4]InvalidArgumentError:不兼容的形状:[3] 与 [4]
【发布时间】:2020-05-16 05:54:41
【问题描述】:

我第一次尝试使用tf.data API with help from this example,我有 3D 体积数据,即不是(高度、宽度、通道),而是(深度、高度、宽度、通道) .

def readfile(filenames):
    name = filenames[0]
    string = tf.read_file(name)
    image = tf.image.decode_image(string, channels=3)
    bunch = image
    for name in filenames[1:]:
        string = tf.read_file(name)
        image = tf.image.decode_image(string, channels=3)
        bunch = tf.concat([bunch,image],1)   
    return bunch

with tf.device("/cpu:0"):

    #read data file paths, shape [5,100] (five elements each with 100 frames)
    train_dataset = tf.data.Dataset.from_tensor_slices(train_files) 
    #train_dataset.element_spec gives shape=(100,)
    train_dataset = train_dataset.map(readfile, num_parallel_calls=16)
    #readfile function takes element of shape (1,100) and 
    #reads each frame and appends to a tensor which is returned 
    #train_dataset.element_spec gives shape=<unknown>
    train_dataset = train_dataset.map(lambda x: tf.random_crop(x, (100, 256, 256, 3)))
    #train_dataset.element_spec gives shape=(100, 256, 256, 3)
    train_dataset = train_dataset.batch(1)

    x = train_dataset.make_one_shot_iterator().get_next()

错误:

Traceback (most recent call last):
  File "/anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py", line 1365, in _do_call
return fn(*args)
  File "/anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py", line 1350, in _run_fn
target_list, run_metadata)
  File "/anaconda3/envs/myenv/lib/python3.6/site-packages/tensorflow_core/python/client/session.py", line 1443, in _call_tf_sessionrun
run_metadata)
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node __inference_Dataset_map_<lambda>_258}} Incompatible shapes: [3] vs. [4]
 [[{{node random_crop/GreaterEqual}}]]
 [[IteratorGetNext]]

我无法理解错误。我认为这意味着tf.random_crop 给出了 3D 张量形状,而.get_next() 部分给出了 4D 张量?在应用readfile 函数后,我对train_dataset 的形状有疑问,为什么是&lt;unknown&gt; 的形状,我希望类似于 (?,100,256,256,3)。我哪里错了?

有没有办法可视化 train_dataset 中的帧,所以我知道我做对了?我一直使用feed_dict,在那里很容易看到 numpy 帧,所以我确切地知道我在喂什么。

【问题讨论】:

  • 你能发布readfile函数吗?另外,让它接受形状为 (100,) 而不是 (1,100) 的元素。我的猜测是,如果您没有在函数内部将张量重新整形为 (100,1),它根本不会读取任何数据
  • @MiloMinderbinder 我已经更新了 readfile 函数代码。这个函数的输入似乎是一维的,这就是我这样写的原因。当我尝试其他一些变化时,它给了我错误ValueError: Index out of range using input dim 1; input has only 1 dims for 'strided_slice' (op: 'StridedSlice') with input shapes: [100], [2], [2], [2] and with computed input tensors: input[3] = &lt;1 1&gt;.

标签: python tensorflow


【解决方案1】:

基于有限的信息,我在您的代码中看到了基本和技术错误:

我假设您有(相当于)5 个包含 100 帧的目录。你有一个 5 行 100 列的张量 train_dataset,每个元素都是一个目录,元素中的每个值都是一个路径

基本:

  1. 这不是错误,但我理解错误。当您运行 train_dataset = train_dataset.map(readfile, num_parallel_calls=16) 时,您实际上是在发送形状为 (100,) 而不是您认为的 (1,100) 的张量,但是您的函数编写正确并且以正确的方式处理 (100,)
  2. 在 readfile 中您正在执行bunch = tf.concat([bunch,image],1)。这将沿维度 1 连接您的图像。如果您的图像是 (100,100,3),那么您将创建 (100,100*100,3) 作为 readfile 的输出。因此,您实际上将 (5,100,100*100,3) 作为train_dataset.map(readfile, num_parallel_calls=16) 的返回值。也许你想在这里使用堆栈。此外,“MapDataset”对象没有“elem_spec”属性,所以你是如何变得未知的,因为 train_dataset 的 elem_spec 的输出打败了我

技术:

  1. 现在,这是您的代码在train_dataset = train_dataset.map(lambda x: tf.random_crop(x, (100, 256, 256, 3))) 处中断的行。 x 的形状为 (5,100,100*100,3),因此 random_crop 采用的每个元素都是 (100,100*100,3),您无法将其裁剪为 (100,256,256,3)。这就是有效使用裁剪的方式
image = tf.image.random_crop(image, size=[28, 28, 1]) # Random crop back to 28x28

这里的图片是一批形状为(34,34,1)的图片

我认为所有事情都考虑到您的问题是由于使用 tf.concat 而您想使用 tf.stack 而产生的

【讨论】:

  • 所以我理解了这个错误,尽管对我有用的是使用 'tf.expand_dims' 和 'tf.concat'。谢谢!
  • tf.expand_dims 后跟 tf.concat 仅是 tf.stack
猜你喜欢
  • 2021-12-31
  • 2021-09-18
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
相关资源
最近更新 更多