Я пытаюсь сохранить матрицу numpy, используя векторы, которые я выбираю во время тренировки. Вектор заполняется после каждой эпохи, поэтому я выбираю его, используя end () модуль SessionRunHook , и добавляю его в пустую матрицу numpy, которую я передаю своему крючку во время инициализации ( init () module):
"""Training hook to store vector after an epoch."""
class FetchVecHook(tf.estimator.SessionRunHook):
def __init__(self, ledger, epochs, steps_per_epoch, num_batches, store_vec):
self._ledger = ledger
self._steps_per_epoch, self._num_batches = steps_per_epoch, num_batches
self._total_num_batches_per_epoch = self._steps_per_epoch*self._num_batches
self._epoch_vector = ledger.epoch_vector()
self._epochs = epochs
self.store_all_vec = store_vec
def end(self, session):
epoch_i = self._epoch_count.eval(session=session)
self.epoch_vector = session.run(self._epoch_vector)
print("Epoch vector : ", self.epoch_vector)
print("Epoch vector shape: ", self.epoch_vector.shape)
self.store_all_vec[int(epoch_i), :] = self.epoch_vector.reshape(1, self._total_num_batches_per_epoch)
print("All Epochs matrix: ", self.store_all_vec)
if(epoch_i >= self._epochs-1):
np.save('all_vec_3', self.store_all_vec)
Я инициализирую Hook при определении моей модели следующим образом:
def cnn_model_fn():
.... #code to define optimizers and loss functions
store_vec = np.empty((epochs, steps_per_epoch*FLAGS.batches), dtype=np.float32)
training_hooks = [
FetchVecHook(ledger, epochs, steps_per_epoch, FLAGS.batches, store_vec)
]
Это приводит к следующему выводу :
Epoch vector : [[ 1.4527533 1.2839319 1.3178247 ... 14.445037 14.15316 5.71838 ]]
Epoch vector shape: (1, 3744)
All Epochs matrix: [[ 1.4527533 1.2839319 1.3178247 ... 14.445037 14.15316 5.71838 ]
[ 0. 0. 0. ... 0. 0. 0. ]]
Test accuracy after 1 epochs is: 0.756
Epoch vector : [[13.050387 18.837223 12.569242 ... 20.187925 13.8853245 13.288585 ]]
Epoch vector shape: (1, 3744)
All Epochs matrix: [[-4.00076472e+14 4.57650065e-41 1.04952130e-35 ... 0.00000000e+00
6.72623263e-44 0.00000000e+00]
[ 1.30503874e+01 1.88372231e+01 1.25692415e+01 ... 2.01879253e+01
1.38853245e+01 1.32885847e+01]]
Test accuracy after 1 epochs is: 0.781
Матрица ( store_ve c) переинициализируется внутри хука каждую эпоху.
Как работают эти тренировочные крючки? Вызывается ли init каждый раз, когда заканчивается эпоха? Должен ли я использовать другие методы, такие как after_run () ? Я не могу найти хороший пример для хранения значений во время тренировок с использованием хуков. Мы будем благодарны за любую помощь.
Обновление:
Я передал store_ve c модулю init () ловушки, чтобы избежать повторной инициализации Everytime.
def __init__(self, ledger, epochs, steps_per_epoch, num_batches, store_vec):
Теперь store_ve c только правильно сохраняет последние два вектора и добавляет мусор для остальных. Показано в следующем выводе:
Epoch vector : [[ 1.7995529 1.3204167 1.0545766 ... 9.134889 10.044149 16.712208 ]]
All Epochs matrix: [[ 1.7995529 1.3204167 1.0545766 ... 9.134889 10.044149 16.712208 ]
[ 0. 0. 0. ... 0. 0. 0. ]
[ 0. 0. 0. ... 0. 0. 0. ]
[ 0. 0. 0. ... 0. 0. 0. ]]
Test accuracy after 1 epochs is: 0.719
Epoch vector : [[11.012252 8.395912 11.624993 ... 8.585892 19.383434 13.664489]]
All Epochs matrix: [[7.3732539e-36 0.0000000e+00 7.7621428e-36 ... 0.0000000e+00
8.9683102e-44 0.0000000e+00]
[1.1012252e+01 8.3959122e+00 1.1624993e+01 ... 8.5858917e+00
1.9383434e+01 1.3664489e+01]
[0.0000000e+00 0.0000000e+00 2.9287138e-43 ... 0.0000000e+00
1.4012985e-44 0.0000000e+00]
[2.2420775e-43 0.0000000e+00 6.7262326e-44 ... 0.0000000e+00
2.8199065e-36 0.0000000e+00]]
Test accuracy after 2 epochs is: 0.751
Epoch vector : [[24.034466 15.158795 16.683199 ... 14.875858 7.309484 11.866685]]
All Epochs matrix: [[7.3732539e-36 0.0000000e+00 7.7621428e-36 ... 0.0000000e+00
0.0000000e+00 0.0000000e+00]
[0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00
3.1325604e-36 0.0000000e+00]
[2.4034466e+01 1.5158795e+01 1.6683199e+01 ... 1.4875858e+01
7.3094840e+00 1.1866685e+01]
[2.9502124e-36 0.0000000e+00 6.7958497e-36 ... 0.0000000e+00
4.4841551e-44 0.0000000e+00]]
Test accuracy after 3 epochs is: 0.734
Epoch vector: [[13.959857 13.110616 6.1355295 ... 13.660195 14.45642 8.483354 ]]
All Epochs matrix: [[7.9048666e-36 0.0000000e+00 6.0523380e-36 ... 0.0000000e+00
0.0000000e+00 0.0000000e+00]
[0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00
3.1325604e-36 0.0000000e+00]
[2.4034466e+01 1.5158795e+01 1.6683199e+01 ... 1.4875858e+01
7.3094840e+00 1.1866685e+01]
[1.3959857e+01 1.3110616e+01 6.1355295e+00 ... 1.3660195e+01
1.4456420e+01 8.4833536e+00]]
Test accuracy after 4 epochs is: 0.768