[英]InvalidArgumentError: Incompatible shapes: [3] vs. [4]
在此示例的帮助下,我第一次尝试使用tf.data
API,我有 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
后,我对 train_dataset 的形状有疑问,为什么形状是<unknown>
,我希望类似于 (?,100,256,256,3)。 我哪里错了?
有没有办法可视化 train_dataset 中的帧,所以我知道我做对了? 我一直使用feed_dict
并且很容易看到 numpy 帧,所以我确切地知道我在喂什么。
根据有限的信息,我在您的代码中看到了基本和技术错误:
我假设你有(相当于)5 个 100 帧的目录。 您有一个 5 行 100 列的张量 train_dataset,每个元素都是一个目录,元素中的每个值都是一个路径
基本的:
train_dataset = train_dataset.map(readfile, num_parallel_calls=16)
您实际上是在发送形状为 (100,) 而不是您认为的 (1,100) 的张量,但是您的 function 写得正确并且正在处理 (100,)正确的路bunch = tf.concat([bunch,image],1)
。 这将沿维度 1 连接您的图像。如果您的图像是 (100,100,3),那么您将创建 (100,100*100,3) 作为 readfile 的 output。 因此,您实际上将 (5,100,100*100,3) 作为train_dataset.map(readfile, num_parallel_calls=16)
的返回值。 也许你想在这里使用堆栈。 此外,'MapDataset' object 没有属性 'elem_spec' 所以你是如何变得不为人知的,因为 train_dataset 的 elem_spec 的 output 击败了我技术的:
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
的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.