【问题标题】:Tensorflow: `batch_size` or `steps` is required for `Tensor` or `NumPy` input dataTensorflow:“Tensor”或“NumPy”输入数据需要“batch_size”或“steps”
【发布时间】:2019-11-07 15:57:46
【问题描述】:

考虑以下 TensorFlow 代码:

import numpy as np
import tensorflow as tf

import tensorflow_datasets as tfds

mnist_dataset, mnist_info = tfds.load(name = 'mnist', with_info=True, as_supervised=True)

mnist_train, mnist_test = mnist_dataset['train'], mnist_dataset['test']

num_validation_samples = 0.1 * mnist_info.splits['train'].num_examples
num_validation_samples = tf.cast(num_validation_samples, tf.int64)

num_test_samples = mnist_info.splits['test'].num_examples
num_test_samples = tf.cast(num_test_samples, tf.int64)

def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255.
    return image, label

scaled_train_and_validation_data = mnist_train.map(scale)
test_data = mnist_test.map(scale)

BUFFER_SIZE = 10_000

shuffled_train_and_validation_data = scaled_train_and_validation_data.shuffle(BUFFER_SIZE)

validation_data = shuffled_train_and_validation_data.take(num_validation_samples)
train_data = shuffled_train_and_validation_data.skip(num_validation_samples)

BATCH_SIZE = 100
train_data = train_data.batch(BATCH_SIZE)
validation_data = validation_data.batch(num_validation_samples) # Single batch, having size equal to number of validation samples
test_data = test_data.batch(num_test_samples)

validation_inputs, validation_targets = next(iter(validation_data))

input_size = 784 # One for each pixel of the 28 * 28 image
output_size = 10
hidden_layer_size = 50 # Arbitrary chosen

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28,1)),
    tf.keras.layers.Dense(hidden_layer_size, activation='relu'), # First hidden layer
    tf.keras.layers.Dense(hidden_layer_size, activation='relu'),
    tf.keras.layers.Dense(output_size, activation='softmax')
])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
NUM_EPOCHS = 5
model.fit(train_data, epochs = NUM_EPOCHS, validation_data=(validation_inputs, validation_targets), verbose=2)

在运行时 tf 给出错误:

ValueError:batch_sizestepsTensorNumPy 输入数据。

在对fit()的调用中添加batch_size时:

model.fit(train_data, batch_size = BATCH_SIZE, epochs = NUM_EPOCHS, validation_data=(validation_inputs, validation_targets), verbose=2)

然后它抱怨:

ValueError: batch_size 参数不能指定为 给定的输入类型。收到的输入:,batch_size:100

这里有什么错误?

【问题讨论】:

  • 您是否将完整代码复制到此处?我看到BUFFER_SIZE=10_000model.compile(optimize=...) 这些错别字。请准确复制并粘贴导致您显示的错误的代码。
  • @zihaozhihao 为什么你认为这是一个错字?我已经从 Jupyter 笔记本中提取了代码 sn-ps。我省略了降价,因为这会使其过于冗长。
  • 应该是优化器和10000
  • @zihaozhihao 数字支持下划线。见PEP 515。虽然很好地抓住了优化器。该代码有效,因为compile() 使用**kwargs 接受多个参数。它忽略拼写错误的变量并继续使用默认优化器。解决了这个问题。谢谢

标签: python tensorflow keras


【解决方案1】:

发生错误是因为Model.fit 的参数validation_data 提供了tf.Dataset,但Keras 不知道要验证多少步。要解决此问题,您只需设置参数validation_steps。例如:

model.fit(train_data,
    batch_size=BATCH_SIZE,
    epochs=NUM_EPOCHS,
    validation_data=(validation_inputs, validation_targets),
    validation_steps=10)

【讨论】:

  • 非常感谢。对于在 SO 上提出这样的基本问题,我有点犹豫。但我是一名 Java 开发人员,Python 和 Tf 对我来说都很陌生。
  • 不客气。我不认为问有什么问题 - 许多其他人可能会从你的问题中受益。总是乐于提供帮助!
  • @rvinas 感谢您提供一些解释代码将如何解决问题。真的很有帮助。
【解决方案2】:

如果您访问此链接 - https://www.tensorflow.org/api_docs/python/tf/keras/Model,您会发现 fit() 仅在提供了 validation_data 并且是 tf.data 数据集时才需要参数 -validation_steps。就像在您的代码中一样,您似乎通过拆分数据集的训练部分来创建了 validation_data。

【讨论】:

    【解决方案3】:
    NUM_EPOCHS=5
        model.fit(train_data,epochs= NUM_EPOCHS,
        validation_data=(validation_inputs, validation_targets),
        validation_steps=10,verbose=2)
    

    【讨论】:

    • 这里不需要batch_size参数,因为你之前已经指定了BATCH_SIZE = 100 train_data = train_data.batch(BATCH_SIZE)。
    • 请不要只发布代码作为答案,还要说明您的代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更有可能吸引投票。
    • 我如何知道需要多少验证步骤?
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2020-07-09
    • 2021-11-21
    • 2018-07-31
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多