Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 恢复训练tf.keras张力板_Python_Tensorflow_Machine Learning_Keras_Tensorboard - Fatal编程技术网

Python 恢复训练tf.keras张力板

Python 恢复训练tf.keras张力板,python,tensorflow,machine-learning,keras,tensorboard,Python,Tensorflow,Machine Learning,Keras,Tensorboard,当我继续训练我的模型并在tensorboard上可视化进度时,我遇到了一些问题 我的问题是如何在不手动指定任何历元的情况下从同一步骤恢复训练?如果可能,只需加载保存的模型,它就可以从保存的优化器中读取全局步骤,并从那里继续训练 我在下面提供了一些代码来重现类似的错误 import tensorflow as tf from tensorflow.keras.callbacks import TensorBoard from tensorflow.keras.models import load

当我继续训练我的模型并在tensorboard上可视化进度时,我遇到了一些问题

我的问题是如何在不手动指定任何历元的情况下从同一步骤恢复训练?如果可能,只需加载保存的模型,它就可以从保存的优化器中读取
全局步骤
,并从那里继续训练

我在下面提供了一些代码来重现类似的错误

import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.models import load_model

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, callbacks=[Tensorboard()])
model.save('./final_model.h5', include_optimizer=True)

del model

model = load_model('./final_model.h5')
model.fit(x_train, y_train, epochs=10, callbacks=[Tensorboard()])
您可以使用以下命令运行
tensorboard

tensorboard --logdir ./logs

您可以在函数
model.fit()
中将参数
initial\u epoch
设置为您希望开始训练的历元数。考虑到模型训练直到达到索引
epochs
的纪元(而不是
epochs
给出的迭代次数)。 在您的示例中,如果您想再训练10个时代,则应为:

model.fit(x_train, y_train, initial_epoch=9, epochs=19, callbacks=[Tensorboard()])
它将允许您以正确的方式在张力板上可视化绘图。
关于这些参数的更多信息可以在中找到。

非常简单。在训练模型时创建检查点,然后使用这些检查点从您离开的位置恢复训练

import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.models import load_model

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, callbacks=[Tensorboard()])
model.save('./final_model.h5', include_optimizer=True)

model = load_model('./final_model.h5')

callbacks = list()

tensorboard = Tensorboard()
callbacks.append(tensorboard)

file_path = "model-{epoch:02d}-{loss:.4f}.hdf5"

# now here you can create checkpoints and save according to your need
# here period is the no of epochs after which to save the model every time during training
# another option is save_weights_only, for your case it should be false
checkpoints = ModelCheckpoint(file_path, monitor='loss', verbose=1, period=1, save_weights_only=False)
callbacks.append(checkpoints)

model.fit(x_train, y_train, epochs=10, callbacks=callbacks)
在此之后,只需从您想要再次恢复训练的位置加载检查点

model = load_model(checkpoint_of_choice)
model.fit(x_train, y_train, epochs=10, callbacks=callbacks)
你就完了


如果您对此有更多问题,请告诉我。

这里是示例代码,以防有人需要它。它实现了阿比纳夫·阿南德提出的理念:

mca = ModelCheckpoint(join(dir, 'model_{epoch:03d}.h5'),
                      monitor = 'loss',
                      save_best_only = False)
tb = TensorBoard(log_dir = join(dir, 'logs'),
                 write_graph = True,
                 write_images = True)
files = sorted(glob(join(fold_dir, 'model_???.h5')))
if files:
    model_file = files[-1]
    initial_epoch = int(model_file[-6:-3])
    print('Resuming using saved model %s.' % model_file)
    model = load_model(model_file)
else:
    model = nn.model()
    initial_epoch = 0
model.fit(x_train,
          y_train,
          epochs = 100,
          initial_epoch = initial_epoch,
          callbacks = [mca, tb])

用您自己的定义模型的函数替换
nn.model()

即使加载模型,TensorFlow也会从起点开始处理度量。另外,这是因为历元从0开始,而不是从8个历元结束的位置开始。我知道这个方法,但我更喜欢不需要我指定历元的方法。我认为这不应该是唯一的方法,我自己也不认为指定历元有什么问题,因为没有指定历元就是零,只是因为它默认设置为零。当从检查点加载模型时,训练确实从保存的点开始,但很遗憾,您必须指定初始历元参数。是的,确实如此。它从保存检查点的位置开始,而不是从头开始。我建议您尝试一下,如果您遇到任何问题,请告诉我。您可以在恢复培训后查看丢失情况进行验证。@HardianLawi这里您也不需要手动指定历元,而需要指定从那里运行的历元数。您的代码对我不起作用。我不知道您为什么建议使用
ModelCheckpoint
回调。如果您查看检查点的源代码,它基本上是从模型中调用
save
方法,这与我在问题中提供的代码完全相同。我不确定它如何适用于您。你重新实例化了回调吗?因为你不能在训练的中间调用Mulk.Savy。你们的问题清楚地说明了你们想从你们离开的地方开始,ModeCheckpoint无疑提供了更多的灵活性。是的,您是对的,它确实调用model.save,因为这是保存模型的唯一方法。fit调用中的
epochs=training\u epochs+initial\u epoch
确保模型按照指定的epoch数量进行训练,而不是只针对
training\u epochs-initial\u epoch
次数进行训练。