【问题标题】:How to I train a keras functional API model with batched tf Dataset objects? (BatchDataset)如何使用批处理的 tf Dataset 对象训练 keras 功能 API 模型? (批处理数据集)
【发布时间】:2022-02-10 20:04:11
【问题描述】:

我正在使用功能 API 构建一个 tf keras 模型。该模型将在大型内存映射数组上进行良好训练。但是,出于多种原因,使用 tensorflow 数据集对象可能是有利的。因此,我使用 from_tensor_slices() 将我的数组转换为 Dataset 对象。 问题是模型将不再训练。

keras 文档:Model training APIs 表明数据集对象是可接受的。

我正在关注的关于如何训练的指南可以在这里找到:Using tf.data with tf keras

有关如何使用 keras 功能 API 的指南是 here。但是,没有概述使用 tf Dataset 对象训练功能性 API 模型。

此处提供了 MWE:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras import layers

print('numpy version: {}'.format(np.__version__))
print('keras version: {}'.format(keras.__version__))
print('tensorflow version: {}'.format(tf.__version__))

numpy 版本:1.21.4
keras 版本:2.6.0
张量流版本:2.6.0

X = np.random.uniform(size=(1000,75))
Y = np.random.uniform(size=(1000))

data = tf.data.Dataset.from_tensor_slices((X, Y))
print(data.cardinality().numpy())

1000

data.batch(batch_size=100, drop_remainder=True)

def API_Model(input_shape, name="test_model"):

    inputs = layers.Input(shape=input_shape)
    x = layers.Dense(1)(inputs)
    outputs = layers.Activation('relu')(x)

    return keras.Model(inputs=inputs, outputs=outputs, name=name)

api_model = API_Model(input_shape=(X.shape[1],))
api_model.compile()
api_model.summary()
Model: "test_model"
_________________________________________________________________  
Layer (type)                 Output Shape              Param #     
=================================================================  
input_2 (InputLayer)         [(None, 75)]              0           
_________________________________________________________________  
dense_1 (Dense)              (None, 1)                 76          
_________________________________________________________________  
activation_1 (Activation)    (None, 1)                 0           
=================================================================  
Total params: 76  
Trainable params: 76  
Non-trainable params: 0  
_________________________________________________________________
api_model.fit(data, epochs=10)

纪元 1/10 警告:tensorflow:模型是用形状(无,75)构建的,用于输入 KerasTensor(type_spec=TensorSpec(shape=(None, 75), dtype=tf.float32, name='input_2'), name='input_2', description="created by layer 'input_2'"),但它是在输入上调用的 不兼容的形状 (75, 1)。

我收到的错误是:ValueError: Input 0 of layer dense_1 is incompatible with the layer: expected axis -1 of input shape to have value 75 but received input with shape (75, 1)

此外,我尝试训练的实际模型的错误略有不同,但在相同的原理下似乎出现故障。如下:

ValueError: Input 0 is incompatible with layer pfn_base: expected shape=(None, 1086, 5), found shape=(1086, 5)

在 BatchDataset 对象上训练 keras 功能 API 模型的正确方法是什么?

【问题讨论】:

  • 是的,我只是没有机会在将其作为正确答案之前对其进行全面测试。非常感谢:)

标签: machine-learning keras deep-learning tensorflow2.0 tensorflow-datasets


【解决方案1】:

您需要将批处理数据集分配给一个变量,并且您还应该在model.compile 中使用损失函数,因为默认值是None,您无法通过它学习任何东西。这是一个工作示例:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras import layers

print('numpy version: {}'.format(np.__version__))
print('keras version: {}'.format(keras.__version__))
print('tensorflow version: {}'.format(tf.__version__))
X = np.random.uniform(size=(1000,75))
Y = np.random.uniform(size=(1000))

data = tf.data.Dataset.from_tensor_slices((X, Y))
print(data.cardinality().numpy())
data = data.batch(batch_size=100, drop_remainder=True)

def API_Model(input_shape, name="test_model"):

    inputs = layers.Input(shape=input_shape)
    x = layers.Dense(1)(inputs)
    outputs = layers.Activation('relu')(x)

    return keras.Model(inputs=inputs, outputs=outputs, name=name)

api_model = API_Model(input_shape=(X.shape[1],))
api_model.compile(loss='mse')
api_model.summary()
api_model.fit(data, epochs=10)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 2021-09-21
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2017-04-05
    相关资源
    最近更新 更多