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_size
,None
表示任何 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
创建后将允许矢量化转换。考虑这些场景:
您有 5M 行信号数据要应用 fft。如果你在fft过程之前不批处理它,它会一个一个地应用。
您有 (100K) 个图像数据集。您想要应用一些转换或一些操作。批处理数据集将允许更快和矢量化的转换并节省大量时间。
我正尝试按如下方式安装 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_size
,None
表示任何 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
创建后将允许矢量化转换。考虑这些场景:
您有 5M 行信号数据要应用 fft。如果你在fft过程之前不批处理它,它会一个一个地应用。
您有 (100K) 个图像数据集。您想要应用一些转换或一些操作。批处理数据集将允许更快和矢量化的转换并节省大量时间。