【问题标题】:Tf.Dataset with Keras returning a ValueError带有 Keras 的 Tf.Dataset 返回 ValueError
【发布时间】:2019-06-07 18:28:37
【问题描述】:

将 Tensorflow 数据集传递给 Keras 的 model.fit 函数时,获取与形状相关的 ValueError。

我的数据集的 X_train 有形状(100 个样本 x 62 个特征),Y_train 是(100 个样本 x 1 个标签)

下面的可重现代码:

import numpy as np
from tensorflow.keras import layers, Sequential, optimizers
from tensorflow.data import Dataset

num_samples = 100
num_features = 62
num_labels = 1
batch_size = 32
steps_per_epoch = int(num_samples/batch_size)

X_train = np.random.rand(num_samples,num_features)
Y_train = np.random.rand(num_samples, num_labels)

final_dataset = Dataset.from_tensor_slices((X_train, Y_train))

model = Sequential()
model.add(layers.Dense(256, activation='relu',input_shape=(num_features,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(num_labels, activation='softmax'))
model.compile(optimizer=optimizers.Adam(0.001), loss='categorical_crossentropy',metrics=['accuracy'])

history = model.fit(final_dataset,epochs=10,batch_size=batch_size,steps_per_epoch = steps_per_epoch)

错误是:

ValueError: Error when checking input: expected dense_input to have shape (62,) but got array with shape (1,)

为什么dense_input 得到一个形状为(1,) 的数组?我清楚地传递了一个 X_train 形状 (n_samples, n_features)。

有趣的是,如果我将批处理(某个数字)函数应用于数据集,错误就会消失,但似乎我遗漏了一些东西。

【问题讨论】:

    标签: tensorflow keras tensorflow-datasets


    【解决方案1】:

    这是一种预期的行为。

    当你使用 Tensorflow Dataset 时,你不应该在 'Model' 的 fit 方法中指定 batch_size。相反,正如您提到的,您必须使用带有 tensorflow 数据集的函数生成批次。

    如文档中所述

    batch_size:整数或无。每次梯度更新的样本数。如果未指定,batch_size 将默认为 32。如果您的数据是符号张量、数据集、数据集迭代器、生成器或 keras.utils.Sequence 实例(因为它们会生成批次)形式,请不要指定 batch_size强>。

    因此,经典行为是按照您的做法:使用数据集生成批次。
    如果你想执行多个 epoch,也可以使用 repeat。在.fit 一侧,您必须指定steps_per_epoch 以指示一个时期有多少批次,并指定epochs 以指示您的时期数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多