Хранение массива numpy в TensorFlow SessionRunHook - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь сохранить матрицу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...