Tensorflow 2.4.1 - 使用 tf.data.Dataset 来拟合 Keras 序列模型

Tensorflow 2.4.1 - using tf.data.Dataset to fit a Keras Sequential Model

我正尝试按如下方式安装 tf.data.Dataset

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

INPUT_NEURONS = 10
OUTPUT_NEURONS = 1

features = tf.random.normal((1000, INPUT_NEURONS))
labels = tf.random.normal((1000, OUTPUT_NEURONS))
dataset = tf.data.Dataset.from_tensor_slices((features, labels))

def build_model():

  model = keras.Sequential(
    [
        layers.Dense(3, input_shape=[INPUT_NEURONS]),
        layers.Dense(OUTPUT_NEURONS),
    ]
  )

  optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)

  model.compile(loss='mse',
            optimizer=optimizer,
            metrics=['mae', 'mse'])

  return model

model = build_model()

model.fit(dataset, epochs=2, verbose=2)

但是,我收到以下错误:

ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 10 but received input with shape (10, 1)

不过 model.summary() 看起来不错:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 3)                 33        
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 4         
=================================================================
Total params: 37
Trainable params: 37
Non-trainable params: 0
_________________________________________________________________

Keras Model fit()真的适合tf.data.Dataset吗?如果是这样,我在这里做错了什么?

as far I know training using batches is optional, a hyperparameter to use or not during the model development

不完全是,不是可选的。 TF-Keras 旨在处理批处理。摘要中的第一个维度始终对应 batch_sizeNone 表示任何 batch_size 都被模型接受。

大多数时候您希望您的模型接受任何批量大小。好吧,如果你使用 stateful LSTM,那么你想要定义静态 batch_size.

将数据放入 tf.data.Dataset 之后,它们将不会具有特定的批次维度:

dataset.element_spec
>> (TensorSpec(shape=(10,), dtype=tf.float32, name=None),
    TensorSpec(shape=(1,), dtype=tf.float32, name=None))

而在使用tf.data时,Model.fit()中的batch_size会被忽略,所以需要手动进行批处理。更具体地说,你可能不知道一个 tf.data.Dataset 每次包含多少个元素。

在这种情况下,在数据集创建后进行批处理是没有意义的(我会解释):

dataset.batch(3).element_spec
>> (TensorSpec(shape=(None, 10), dtype=tf.float32, name=None),
 TensorSpec(shape=(None, 1), dtype=tf.float32, name=None))

tf.data 通常用于中大型数据集,因此 batching 创建后将允许矢量化转换。考虑这些场景:

  1. 您有 5M 行信号数据要应用 fft。如果你在fft过程之前不批处理它,它会一个一个地应用。

  2. 您有 (100K) 个图像数据集。您想要应用一些转换或一些操作。批处理数据集将允许更快和矢量化的转换并节省大量时间。