Как остановить обучающую эпоху или итерацию, когда она достигает определенного значения потерь и точности? - PullRequest
0 голосов
/ 09 января 2019

У меня есть модель для обучения с библиотекой tflearn, я использую глубокую нейронную сеть (DNN) для этого. Мы можем видеть больше здесь (http://tflearn.org/models/dnn/)

Ниже мой кусок кода:

# Build neural network
net = tflearn.input_data(shape=[None, len(train_x[0])])
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, len(train_y[0]), activation='softmax')
net = tflearn.regression(net)

# Define model and setup tensorboard
model = tflearn.DNN(net, tensorboard_dir='tflearn_logs', best_val_accuracy=0.91)
# Start training (apply gradient descent algorithm)
model.fit(train_x, train_y, n_epoch=350, batch_size=8, show_metric=True)
model.save('model.tflearn')

Когда я запускаю этот код, я получаю некоторые значения до конца эпохи:

Training Step: 5083  | total loss: 0.31890 | time: 0.302s
| Adam | epoch: 085 | loss: 0.31890 - acc: 0.8948 -- iter: 344/474
Training Step: 20999  | total loss: 0.08880 | time: 0.366s
....
Training Step: 11279  | total loss: 0.10708 | time: 0.419s
| Adam | epoch: 188 | loss: 0.10708 - acc: 0.9556 -- iter: 472/474
Training Step: 11280  | total loss: 0.12302 | time: 0.425s
| Adam | epoch: 188 | loss: 0.12302 - acc: 0.9351 -- iter: 474/474
....
| Adam | epoch: 350 | loss: 0.08880 - acc: 0.9503 -- iter: 472/474
Training Step: 21000  | total loss: 0.08863 | time: 0.373s
| Adam | epoch: 350 | loss: 0.08863 - acc: 0.9553 -- iter: 474/474

Кто-нибудь знает, как остановить тренировку каждый раз, когда потери и точность достигают определенного значения? допустим потеря 0,05 и точность 0,95. Заранее спасибо

1 Ответ

0 голосов
/ 09 января 2019

Используйте раннюю остановку через экземпляр обратного вызова, указанный в качестве аргумента для вашего метода подгонки, как описано здесь:

http://mckinziebrandon.me/TensorflowNotebooks/2016/11/20/early-stopping.html

Примерно так должно сработать для прекращения тренировки, когда точность достигает 0,95

class EarlyStoppingCallback(tflearn.callbacks.Callback):
    def __init__(self, val_acc_thresh):
        """ Note: We are free to define our init function however we please. """
        self.val_acc_thresh = val_acc_thresh

    def on_epoch_end(self, training_state):
        """ """
        # Apparently this can happen.
        if training_state.val_acc is None: return
        if training_state.val_acc > self.val_acc_thresh:
            raise StopIteration

# Initializae our callback.
early_stopping_cb = EarlyStoppingCallback(val_acc_thresh=0.95)
# Give it to our trainer and let it fit the data. 
trainer.fit(feed_dicts={X: trainX, Y: trainY}, 
            val_feed_dicts={X: testX, Y: testY}, 
            n_epoch=2, 
            show_metric=True, # Calculate accuracy and display at every step.
            snapshot_epoch=False,
            callbacks=early_stopping_cb)
...