Я пытаюсь воссоздать модель и воспроизвести опубликованные результаты. Я использую 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
, упомянутый ранее для хорошей меры. Поэтому я, честно говоря, понятия не имею, что я пропустил или где я ошибся.