我正在学习“过度拟合和欠拟合”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 中模型构建的理解仍然不稳定,所以答案可能很简单。
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。
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)))
这将维度扩展映射到数据集的每个元素。