如何纠正遵循“过拟合和欠拟合”TensorFlow 教程时产生的 input_shape 错误?

问题描述 投票:0回答:1

我正在学习“过度拟合和欠拟合”TensorFlow 教程,并使用他们提供的代码重现了 tiny_model

 之前的所有步骤。但是,当我运行命令时

size_histories['Tiny'] = compile_and_fit(tiny_model, 'sizes/Tiny')
我收到错误,

输入张量的输入形状无效(“data:0”,shape =(28,),dtype = float32)。预期形状 (None, 28),但输入具有不兼容的形状 (28,)。我不明白为什么“预期形状”是(无,28),当教程和我在tiny_model的定义中指定它应该是input_shape=(FEATURES,)

时。 (我们之前定义了
FEATURES = 28
。)

我在这里缺少什么?我对 TensorFlow 中模型构建的理解仍然不稳定,所以答案可能很简单。

tensorflow keras deep-learning tf.keras
1个回答
0
投票
浏览本教程,您似乎可能忘记添加这些行

validate_ds = validate_ds.batch(BATCH_SIZE) train_ds = train_ds.shuffle(BUFFER_SIZE).repeat().batch(BATCH_SIZE)
就在

这部分之前(向上滚动一点)。错误消息的重要部分是 .batch()

 调用,它将训练(和验证)数据集分成批次。

一开始令人困惑的一点是,使用

input_shape=(FEATURES,)

 为网络设置
一个样本的形状(在此步骤中,您忽略 batch_size
),但是当您调用 
model.fit(...)
 时,它期望 
批次数据的。这就是(None, features)
形状。它是 
(None, features)
 而不是 
(batch_size, features)
,因为 TensorFlow 将批量大小作为可变大小进行处理(
None
 在此上下文中代表可变大小)。这主要是针对最后一批完成的,在大多数情况下小于实际的批量大小。
例如,如果您有 40 个样本,批量大小为 16:您有 16、16、8 个数据点的批次,因为最后一个批次中没有足够的数据将其完全填充到 16。

您收到的错误表明数据未分批,因此网络一次获取一个样本。但 TensorFlow 中的网络始终需要一个批量大小,即使对于一个样本来说只是

1

编辑:解决错误

ValueError: Arguments target and output must have the same rank (ndim)

:这里的问题是目标必须处于形状
(batch_size, labels)
。如果目标只有一个值(如本例所示),列表通常会变得扁平,并且第二个 
labels
 暗淡不存在。要解决此问题,请使用以下两种解决方案之一:
如果您的数据位于 numpy 数组/tensorflow 张量等中,您可以使用

labels = labels.reshape((-1, 1)) # or similar functions
如果您已有 

Dataset

,请使用 

ds = ds.map(lambda x,y: (x, tf.expand_dims(y, 0)))
这将维度扩展映射到数据集的每个元素。

© www.soinside.com 2019 - 2024. All rights reserved.