继承自:Layer, Module
tf.keras.Model(
*args, **kwargs
)
参数 |
|
inputs |
模型的输入:keras.Input 对象或 keras.Input 对象列表。 |
outputs |
模型的输出。 请参阅下面的函数式 API 示例。 |
name |
字符串,模型的名称。 |
实例化模型有两种方法:
1 - 使用“Functional API”,您从输入开始,链接层调用以指定模型的前向传递,最后根据输入和输出创建模型:
import tensorflow as tf
inputs = tf.keras.Input(shape=(3,))
x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs)
outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
2 - 通过继承 Model 类:在这种情况下,您应该在 __init__ 中定义您的层,并且您应该在调用中实现模型的前向传递
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)
def call(self, inputs):
x = self.dense1(inputs)
return self.dense2(x)
model = MyModel()
如果您对模型进行子类化,您可以选择在调用中有一个训练参数(布尔值),您可以使用它来指定训练和推理中的不同行为:
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)
self.dropout = tf.keras.layers.Dropout(0.5)
def call(self, inputs, training=False):
x = self.dense1(inputs)
if training:
x = self.dropout(x, training=training)
return self.dense2(x)
model = MyModel()
创建模型后,您可以使用 model.compile() 为模型配置损失和指标,使用 model.fit() 训练模型,或者使用模型使用 model.predict() 进行预测。
属性 |
|
distribute_strategy |
这个模型是在 tf.distribute.Strategy下创建的。 |
layers |
|
metrics_names |
返回所有输出的模型显示标签 |
★注意:metrics_names 仅在 keras.Model 对实际数据进行训练/评估后可用。
inputs = tf.keras.layers.Input(shape=(3,))
outputs = tf.keras.layers.Dense(2)(inputs)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer="Adam", loss="mse", metrics=["mae"])
model.metrics_names
[]
x = np.random.random((2, 3))
y = np.random.randint(0, 2, (2, 2))
model.fit(x, y)
model.metrics_names
['loss', 'mae']
inputs = tf.keras.layers.Input(shape=(3,))
d = tf.keras.layers.Dense(2, name='out')
output_1 = d(inputs)
output_2 = d(inputs)
model = tf.keras.models.Model(
inputs=inputs, outputs=[output_1, output_2])
model.compile(optimizer="Adam", loss="mse", metrics=["mae", "acc"])
model.fit(x, (y, y))
model.metrics_names
['loss', 'out_loss', 'out_1_loss', 'out_mae', 'out_acc', 'out_1_mae',
'out_1_acc']
run_eagerly |
指示模型是否应急切运行的可设置属性。急切地运行意味着您的模型将逐步运行,就像 Python 代码一样。 您的模型可能运行得较慢,但您应该更容易通过进入各个层调用来调试它。默认情况下,我们会尝试将您的模型编译为静态图以提供最佳执行性能。 |
方法 |
|
call |
在新输入上调用模型 |
compile |
配置用于训练的模型 |
evaluate |
返回模型在测试模式下的损失值和指标值 |
evaluate_generator |
在数据生成器上评估模型 |
fit |
训练模型固定数量的时期(数据集上的迭代) |
fit_generator |
在 Python 生成器逐批生成的数据上拟合模型 |
get_layer |
根据名称(唯一)或索引检索图层。 |
load_weights |
从 TensorFlow 或 HDF5 权重文件加载所有层权重 |
make_predict_function |
创建一个执行一步推理的函数 |
make_test_function |
创建一个执行一个评估步骤的函数 |
make_train_function |
创建一个执行一步训练的函数 |
predict |
为输入样本生成输出预测 |
predict_generator |
为来自数据生成器的输入样本生成预测 |
predict_on_batch |
返回单批样本的预测 |
predict_step |
一个推理步骤的逻辑 |
reset_metrics |
重置模型中所有指标的状态 |
reset_states |
|
save |
将模型保存到 Tensorflow SavedModel 或单个 HDF5 文件 |
save_weights |
保存所有图层权重 |
summary |
打印网络的字符串摘要 |
test_on_batch |
在单批样本上测试模型 |
test_step |
一个评估步骤的逻辑 |
to_json |
返回包含网络配置的 JSON 字符串 |
to_yaml |
返回包含网络配置的 yaml 字符串 |
train_on_batch |
对单批数据运行单个梯度更新 |
train_step |
一个训练步骤的逻辑 |
compile
compile(
optimizer='rmsprop', loss=None, metrics=None, loss_weights=None,
weighted_metrics=None, run_eagerly=None, steps_per_execution=None, **kwargs
)
配置用于训练的模型
参数 |
|
optimizer |
字符串(优化器名称)或优化器实例。 参见 tf.keras.optimizers |
loss |
字符串(目标函数名称)、目标函数或tf.keras.losses.Loss 实例。参见tf.keras.losses.目标函数是任何具有签名 loss = fn(y_true,y_pred) 的可调用函数,其中 y_true = ground truth values ,其shape=[batch_size, d0, .. dN],除了稀疏的损失函数,例如稀疏分类交叉熵,其shape=[batch_size, d0, .. dN-1]。 y_pred = predicted values,其shape=[batch_size, d0, .. dN].它返回一个加权损失浮动张量。如果使用自定义Loss实例并将reduction设置为 NONE,则返回值的形状为 [batch_size, d0, .. dN-1] 即。 每个样本或每个时间步的损失值; 否则,它是一个标量。如果模型有多个输出,您可以通过传递字典或损失列表对每个输出使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。 |
metrics |
模型在训练和测试期间要评估的指标列表。每个都可以是字符串(内置函数的名称)、函数或 tf.keras.metrics.Metric 实例。参见tf.keras.metrics.通常,您将使用 metrics=['accuracy']。函数是任何具有签名result = fn(y_true,y_pred). 的可调用函数。要为多输出模型的不同输出指定不同的度量,您还可以传递一个字典,例如 metrics={'output_a': 'accuracy', 'output_b': ['accuracy', 'mse']}。您还可以传递指标列表的列表 (len = len(outputs)),例如 metrics=[['accuracy'], ['accuracy', 'mse']] 或 metrics=['accuracy', ['accuracy ', 'mse']]。当您传递字符串 'accuracy' 或 'acc' 时,我们会根据所使用的损失函数和模型输出形状选择 tf.keras.metrics.BinaryAccuracy, tf.keras.metrics.CategoricalAccuracy, tf.keras.metrics.SparseCategoricalAccuracy中的一个。我们也对字符串 'crossentropy' 和 'ce' 进行了类似的转换。 |
loss_weights |
指定标量系数(Python 浮点数)的可选列表或字典,以对不同模型输出的损失贡献进行加权。模型将最小化的损失值将是所有单个损失的加权总和,由loss_weights系数加权。如果是列表,则预计与模型输出的映射为 1:1。 如果是 dict,则应将输出名称(字符串)映射到标量系数。 |
weighted_metrics |
在训练和测试期间要由 sample_weight 或 class_weight 评估和加权的指标列表 |
run_eagerly |
布尔。 默认为False。 如果为 True,则此模型的逻辑将不会包含在tf.function 中。建议将此保留为 None ,除非您的模型无法在 tf.function中运行。使用tf.distribute.experimental.ParameterServerStrategy时不支持run_eagerly=True |
steps_per_execution |
int。 默认为 1。在每次 tf.function 调用期间运行的批次数。在单个 tf.function 调用中运行多个批处理可以极大地提高 TPU 或具有大量 Python 开销的小型模型的性能。每次执行最多会运行一个完整的 epoch。 如果传递的数字大于 epoch 的大小,则执行将被截断为 epoch 的大小。请注意,如果 steps_per_execution 设置为 N,则 Callback.on_batch_begin 和 Callback.on_batch_end 方法将仅每 N 批调用一次(即在每次tf.function执行之前/之后)。 |
**kwargs |
仅支持向后兼容的参数 |
fit
View source
fit(
x=None,
y=None,
batch_size=None,
epochs=1,
verbose='auto',
callbacks=None,
validation_split=0.0,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_batch_size=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
训练模型固定数量的时期(数据集上的迭代)
参数 |
|
x |
输入数据。 它可能是:
|
y |
目标数据。 与输入数据 x 一样,它可以是 Numpy 数组或 TensorFlow 张量。它应该与 x 一致(你不能有 Numpy 输入和张量目标,或者相反)。如果 x 是数据集、生成器或keras.utils.Sequence 实例,则不应指定 y(因为将从 x 获取目标)。 |
batch_size |
整数或无。 每次梯度更新的样本数。 如果未指定,batch_size 将默认为 32。如果您的数据采用数据集、生成器或 keras.utils.Sequence 实例的形式(因为它们生成批次),则不要指定 batch_size。 |
epochs |
整数。 训练模型的周期数。 epoch 是对提供的整个 x 和 y 数据的迭代。请注意,与initial_epoch 一起使用时,epochs 应理解为“final epoch”。该模型不是针对由 epoch 给出的多次迭代进行训练,而是直到达到索引 epoch 的 epoch。 |
verbose |
'auto'、0、1 或 2。详细模式。 0 = 无声,1 = 进度条,2 = 每个 epoch 一行。'auto' 在大多数情况下默认为 1,但与 ParameterServerStrategy 一起使用时默认为 2。请注意,进度条在记录到文件时不是特别有用,因此在不以交互方式运行时(例如,在生产环境中)建议使用 verbose=2。 |
callbacks |
keras.callbacks.Callback 实例列表。在训练期间应用的回调列表。 参见 tf.keras.callbacks。 注意tf.keras.callbacks.ProgbarLogger和 tf.keras.callbacks.History 回调是自动创建的,不需要传递到model.fit中。tf.keras.callbacks.ProgbarLogger 的创建与否基于 model.fit 的详细参数。tf.distribute.experimental.ParameterServerStrategy 目前不支持批处理级调用的回调,建议用户使用适当的 steps_per_epoch 值来实现epoch-level调用。 |
validation_split |
在0和1之间的浮点。用作验证数据的训练数据的一部分。 该模型将把这部分训练数据分开,不会对其进行训练,并将在每个周期结束时评估损失和此数据的任何模型指标。在混洗之前,验证数据是从提供的 x 和 y 数据中的最后一个样本中选择的。当 x 是数据集、生成器或keras.utils.Sequence实例时,不支持此参数。 tf.distribute.experimental.ParameterServerStrategy尚不支持validation_split。 |
validation_data |
在每个epoch结束时评估损失和任何模型指标的数据。该模型将不会在此数据上进行训练。因此,请注意这样一个事实,即使用 validation_split 或validation_data 提供的数据的验证丢失不受噪声和 dropout 等正则化层的影响。validation_data 将覆盖validation_split。 validation_data可以是:
|
shuffle |
Boolean(是否在每个 epoch 之前打乱训练数据)或 str(对于 'batch')。当 x 是生成器或 tf.data.Dataset 的对象时,将忽略此参数。'batch' 是处理 HDF5 数据限制的特殊选项; 它以批量大小的块进行洗牌。 当steps_per_epoch 不是None 时无效。 |
class_weight |
可选字典将类索引(整数)映射到权重(浮点数)值,用于对损失函数进行加权(仅在训练期间)。这对于告诉模型“更多关注”来自代表性不足的类的样本很有用。 |
sample_weight |
训练样本的可选 Numpy 权重数组,用于对损失函数进行加权(仅在训练期间)。您可以传递与输入样本长度相同的平面 (1D) Numpy 数组(权重和样本之间的 1:1 映射),或者在temporal data的情况下,您可以传递一个形状为 (samples, sequence_length) 的二维数组,以对每个样本的每个时间步应用不同的权重。当 x 是数据集、生成器或keras.utils.Sequence 实例时,不支持此参数,而是提供 sample_weights 作为 x 的第三个元素。 |
initial_epoch |
整数。 开始训练的时期(对于恢复之前的训练运行很有用)。 |
steps_per_epoch |
整数或无。宣布一个epoch结束并开始下一个epoch之前的总步数(样本批次)。使用输入张量(例如 TensorFlow 数据张量)进行训练时,默认 None 等于数据集中的样本数除以批量大小,如果无法确定,则为 1。如果 x 是 tf.data 数据集,并且 'steps_per_epoch' 为 None,则 epoch 将运行,直到输入数据集耗尽。传递无限重复的数据集时,您必须指定 steps_per_epoch 参数。数组输入不支持此参数。 steps_per_epoch=None 在使用 tf.distribute.experimental.ParameterServerStrategy 时不受支持。 |
validation_steps |
仅当提供了 validation_data 并且是 tf.data 数据集时才相关。在每个 epoch 结束执行验证时停止前要绘制的总步数(样本批次)。如果 'validation_steps' 为 None,则验证将一直运行,直到validation_data 数据集耗尽。在无限重复数据集的情况下,它将陷入无限循环。 如果指定了 'validation_steps' 并且仅消耗部分数据集,则评估将从每个epoch的数据集开头开始。这确保每次都使用相同的验证样本。 |
validation_batch_size |
整数或无。 每个验证批次的样本数。 如果未指定,将默认为 batch_size。如果您的数据采用数据集、生成器或keras.utils.Sequence 实例的形式(因为它们生成批次),请不要指定 validation_batch_size。 |
validation_freq |
仅在提供验证数据时相关。 整数或 collections.abc.Container 实例(例如列表、元组等)。如果是整数,则指定在执行新的验证运行之前要运行的训练周期数,例如 validation_freq=2 每 2 个 epoch 运行一次验证。如果是容器,则指定运行验证的epochs,例如 validation_freq=[1, 2, 10] 在第 1、2 和 10 轮结束时运行验证。 |
max_queue_size |
整数。 仅用于生成器或 keras.utils.Sequence 输入。 生成器队列的最大大小。 如果未指定,max_queue_size 将默认为 10。 |
workers |
整数。 仅用于生成器或 keras.utils.Sequence 输入。 使用基于进程的线程时要启动的最大进程数。 如果未指定,workers 将默认为 1。 |
use_multiprocessing |
布尔值。 仅用于生成器或 keras.utils.Sequence 输入。如果为 True,则使用基于进程的线程。 如果未指定,use_multiprocessing 将默认为 False。请注意,由于此实现依赖于多处理,因此您不应将non-picklable 参数传递给生成器,因为它们无法轻松传递给子进程。 |