【发布时间】:2019-06-07 21:17:52
【问题描述】:
我正在尝试重新创建模型并重新生成其发布的结果。我使用 TF 2.0,我认为模型是用 Theano 后端编码的。该模型来自 github 中的 repo,作为上下文。
我也不使用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
最后一个代码 sn-p 是错误指向的位置,但我不知道与图像格式相关的确切问题所在。具体来说,它指向第三行,或以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 中也提出了同样的论点,以作为良好的衡量标准。所以老实说,我不知道我错过了什么或哪里出错了。
【问题讨论】:
标签: python-3.x tensorflow keras tf.keras