有没有一种方法可以让 Keras 读取 TFRecord 数据集而不需要额外的数据处理措施?
Is there a method for Keras to read TFRecord datasets without additional data processing measures?
我是一名尝试学习 TensorFlow 基础知识的高中生。我目前正在使用 TFRecords 输入文件构建模型,这是 TensorFlow 的默认数据集文件类型,已从原始原始数据中压缩。我目前正在使用一种复杂的方式将数据解析为 numpy 数组,以便 Keras 对其进行解释。虽然 Keras 是 TF 的一部分,但它应该能够轻松读取 TFRecord 数据集。 Keras 是否有任何其他方式来理解 TFRecord 文件?
我使用 _decodeExampleHelper 方法准备训练数据。
def _decodeExampleHelper(example) :
dataDictionary = {
'xValues' : tf.io.FixedLenFeature([7], tf.float32),
'yValues' : tf.io.FixedLenFeature([3], tf.float32)
}
# Parse the input tf.Example proto using the data dictionary
example = tf.io.parse_single_example(example, dataDictionary)
xValues = example['xValues']
yValues = example['yValues']
# The Keras Sequential network will have "dense" as the name of the first layer; dense_input is the input to this layer
return dict(zip(['dense_input'], [xValues])), yValues
data = tf.data.TFRecordDataset(workingDirectory + 'training.tfrecords')
parsedData = data.map(_decodeExampleHelper)
我们可以看到 parsedData
在以下代码块中具有正确的维度。
tmp = next(iter(parsedData))
print(tmp)
这将以 Keras 应该能够解释的正确维度输出第一组数据。
({'dense_input': <tf.Tensor: id=273, shape=(7,), dtype=float32, numpy=
array([-0.6065675 , -0.610906 , -0.65771157, -0.41417238, 0.89691925,
0.7122903 , 0.27881026], dtype=float32)>}, <tf.Tensor: id=274, shape=(3,), dtype=float32, numpy=array([ 0. , -0.65868723, -0.27960175], dtype=float32)>)
这是一个非常简单的模型,只有两层,用我刚刚解析的数据训练它。
model = tf.keras.models.Sequential(
[
tf.keras.layers.Dense(20, activation = 'relu', input_shape = (7,)),
tf.keras.layers.Dense(3, activation = 'linear'),
]
)
model.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['accuracy'])
model.fit(parsedData, epochs = 1)
尽管 dense_input 为 7,但 model.fit(parsedData, epochs = 1)
行给出了 ValueError: Error when checking input: expected dense_input to have shape (7,) but got array with shape (1,)
的错误。
这种情况会出现什么问题?为什么 Keras 无法正确解释文件中的张量?
您需要先对数据进行批处理,然后再将其传递给 Keras 并使用输入层。以下对我来说很好用:
import tensorflow as tf
ds = tf.data.Dataset.from_tensors((
{'dense_input': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]}, [ 0.0, 0.1, -0.1]))
ds = ds.repeat(32).batch(32)
model = tf.keras.models.Sequential(
[
tf.keras.Input(shape=(7,), name='dense_input'),
tf.keras.layers.Dense(20, activation = 'relu'),
tf.keras.layers.Dense(3, activation = 'linear'),
]
)
model.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['accuracy'])
model.fit(ds, epochs = 1)
我是一名尝试学习 TensorFlow 基础知识的高中生。我目前正在使用 TFRecords 输入文件构建模型,这是 TensorFlow 的默认数据集文件类型,已从原始原始数据中压缩。我目前正在使用一种复杂的方式将数据解析为 numpy 数组,以便 Keras 对其进行解释。虽然 Keras 是 TF 的一部分,但它应该能够轻松读取 TFRecord 数据集。 Keras 是否有任何其他方式来理解 TFRecord 文件?
我使用 _decodeExampleHelper 方法准备训练数据。
def _decodeExampleHelper(example) :
dataDictionary = {
'xValues' : tf.io.FixedLenFeature([7], tf.float32),
'yValues' : tf.io.FixedLenFeature([3], tf.float32)
}
# Parse the input tf.Example proto using the data dictionary
example = tf.io.parse_single_example(example, dataDictionary)
xValues = example['xValues']
yValues = example['yValues']
# The Keras Sequential network will have "dense" as the name of the first layer; dense_input is the input to this layer
return dict(zip(['dense_input'], [xValues])), yValues
data = tf.data.TFRecordDataset(workingDirectory + 'training.tfrecords')
parsedData = data.map(_decodeExampleHelper)
我们可以看到 parsedData
在以下代码块中具有正确的维度。
tmp = next(iter(parsedData))
print(tmp)
这将以 Keras 应该能够解释的正确维度输出第一组数据。
({'dense_input': <tf.Tensor: id=273, shape=(7,), dtype=float32, numpy=
array([-0.6065675 , -0.610906 , -0.65771157, -0.41417238, 0.89691925,
0.7122903 , 0.27881026], dtype=float32)>}, <tf.Tensor: id=274, shape=(3,), dtype=float32, numpy=array([ 0. , -0.65868723, -0.27960175], dtype=float32)>)
这是一个非常简单的模型,只有两层,用我刚刚解析的数据训练它。
model = tf.keras.models.Sequential(
[
tf.keras.layers.Dense(20, activation = 'relu', input_shape = (7,)),
tf.keras.layers.Dense(3, activation = 'linear'),
]
)
model.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['accuracy'])
model.fit(parsedData, epochs = 1)
尽管 dense_input 为 7,但 model.fit(parsedData, epochs = 1)
行给出了 ValueError: Error when checking input: expected dense_input to have shape (7,) but got array with shape (1,)
的错误。
这种情况会出现什么问题?为什么 Keras 无法正确解释文件中的张量?
您需要先对数据进行批处理,然后再将其传递给 Keras 并使用输入层。以下对我来说很好用:
import tensorflow as tf
ds = tf.data.Dataset.from_tensors((
{'dense_input': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]}, [ 0.0, 0.1, -0.1]))
ds = ds.repeat(32).batch(32)
model = tf.keras.models.Sequential(
[
tf.keras.Input(shape=(7,), name='dense_input'),
tf.keras.layers.Dense(20, activation = 'relu'),
tf.keras.layers.Dense(3, activation = 'linear'),
]
)
model.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['accuracy'])
model.fit(ds, epochs = 1)