«Процессорная реализация FusedBatchNorm пока поддерживает только тензорный формат NHWC». - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь воссоздать модель и воспроизвести опубликованные результаты. Я использую TF 2.0, и модель, на мой взгляд, была написана на основе Theano. Модель пришла из этого репо в github, для контекста.

Я также не использую tensorflow-gpu, поскольку он не совместим с моей настройкой оборудования.

Во всяком случае, сначала я столкнулся с большой ошибкой, пытаясь загрузить его вес или даже модель. Когда я понял, что функции сохранения / загрузки просто испорчены, я перешел к попытке загрузить и обучить модель. Поскольку я использую Tensorflow, я изменил код для использования формата 'channels_last' или NHWC, как об этом говорит ошибка.

Вот мой список импорта:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from tensorflow import keras

import cv2
import os
import pathlib
import shutil

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

Модифицированная модель:

def createModel():
    model = keras.models.Sequential()
    model.add(keras.layers.Lambda(norm_input, input_shape=(28,28,1), output_shape=(28,28,1)))
    model.add(keras.layers.Conv2D(32, (3,3)))
    model.add(keras.layers.LeakyReLU())
    model.add(keras.layers.BatchNormalization(axis=1))
    model.add(keras.layers.Conv2D(32, (3,3)))
    model.add(keras.layers.LeakyReLU())
    model.add(keras.layers.MaxPooling2D())
    model.add(keras.layers.BatchNormalization(axis=1))
    model.add(keras.layers.Conv2D(64, (3,3)))
    model.add(keras.layers.LeakyReLU())
    model.add(keras.layers.BatchNormalization(axis=1))
    model.add(keras.layers.Conv2D(64, (3,3)))
    model.add(keras.layers.LeakyReLU())
    model.add(keras.layers.MaxPooling2D())
    model.add(keras.layers.Flatten())
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Dense(512))
    model.add(keras.layers.LeakyReLU())
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Dropout(0.3))
    model.add(keras.layers.Dense(10, activation='softmax'))

    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

    return model

Как я загрузил и предварительно обработал набор данных MNIST:

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

test_labels = y_test

x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)

x_train = x_train.astype(np.float32)
x_test = x_test.astype(np.float32)

x_train /= 255
x_test /= 255

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

ImageDataGenerator:

    gen = keras.preprocessing.image.ImageDataGenerator(
            rotation_range=12, 
            width_shift_range=0.1, 
            shear_range=0.3,
            height_shift_range=0.1, 
            zoom_range=0.1, 
            data_format='channels_last')

И, наконец, функция обучения моделей:

def fit_model(m):
    m.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1, verbose=0,
                   validation_data=test_batches, validation_steps=validation_steps)
    m.optimizer.lr = 0.1
    m.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4, verbose=0,
                   validation_data=test_batches, validation_steps=validation_steps)
    m.optimizer.lr = 0.01
    m.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=12, verbose=0,
                   validation_data=test_batches, validation_steps=validation_steps)
    m.optimizer.lr = 0.001
    m.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=18, verbose=0,
                   validation_data=test_batches, validation_steps=validation_steps)
    return m

В последнем фрагменте кода указывается ошибка, но я не знаю, что именно там произошло, что связано с форматом изображения. В частности, он указывает на третью строку или строку, начинающуюся с validation_data=....

Полная ошибка:

Component function execution failed: Internal: The CPU implementation of FusedBatchNorm only supports NHWC tensor format for now.
     [[{{node batch_normalization_v2/cond/then/_0/FusedBatchNorm}}]]

и трассировка:

Traceback (most recent call last):
  File "model3.py", line 113, in <module>
    m = fit_model(createModel())
  File "model3.py", line 52, in fit_model
    validation_data=test_batches, validation_steps=validation_steps)
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1515, in fit_generator
    steps_name='steps_per_epoch')
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_generator.py", line 257, in model_iteration
    batch_outs = batch_function(*batch_data)
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1259, in train_on_batch
    outputs = self._fit_function(ins)  # pylint: disable=not-callable
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3217, in __call__
    outputs = self._graph_fn(*converted_inputs)
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 558, in __call__
    return self._call_flat(args)
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 627, in _call_flat
    outputs = self._inference_function.call(ctx, args)
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 415, in call
    ctx=ctx)
  File "/home/ren/.local/lib/python3.6/site-packages/tensorflow/python/eager/execute.py", line 66, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InternalError: The CPU implementation of FusedBatchNorm only supports NHWC tensor format for now.
     [[{{node batch_normalization_v2/cond/then/_0/FusedBatchNorm}}]] [Op:__inference_keras_scratch_graph_3602]

Я ожидаю, что это будет исправлено, когда я добавлю строку tf.keras.backend.set_image_data_format('channels_last') вверху моего кода. Я также даже положил тот же аргумент в ImageDataGenerator, упомянутый ранее для хорошей меры. Поэтому я, честно говоря, понятия не имею, что я пропустил или где я ошибся.

1 Ответ

0 голосов
/ 12 июня 2019

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Я только новичок в этой области, и только этот ответ основан на том, что я прочитал в документах . У меня нет полного понимания возможных последствий и 1013 * его последствий для модели ; в худшем случае он может повлиять на его производительность и точность . В лучшем случае это решение можно рассматривать только как временное исправление до , подавляющее ошибку , по крайней мере, до тех пор, пока кто-то еще не подтвердит это, как в противном случае. Любые подтверждения, разъяснения, предложения и альтернативные решения всегда приветствуются.

С Документация Keras на BatchNormalization:

ось : целое число, ось, которая должна быть нормализована (обычно это ось объектов). Например, после слоя Conv2D с data_format="channels_first" установите axis=1 в BatchNormalization.

Поскольку я использую channels_last или NHWC в качестве формата изображения, просто приравнивая axis к -1 в параметре, исправившем это. Чтобы было ясно:

keras.layers.BatchNormalization(axis=-1)

Исправлена ​​моя проблема.

...