На вашем месте я проверю следующие три вещи.
1.Визуализируйте как данные обучения, так и данные тестирования бок о бок
Это самый простой способ проверить, является ли низкая производительность разумной.По сути, если данные тестирования сильно отличаются от данных обучения, ваша предварительно обученная модель не сможет достичь высокой производительности в этой новой области тестирования.Даже если это не так, визуализация должна помочь решить, какую простую адаптацию домена можно применить для достижения лучшей производительности.
2.Двойная проверка с вашей нормализацией L2
Я взглянул на исходный код keras.utils.normalize
@tf_export('keras.utils.normalize')
def normalize(x, axis=-1, order=2):
"""Normalizes a Numpy array.
Arguments:
x: Numpy array to normalize.
axis: axis along which to normalize.
order: Normalization order (e.g. 2 for L2 norm).
Returns:
A normalized copy of the array.
"""
l2 = np.atleast_1d(np.linalg.norm(x, order, axis))
l2[l2 == 0] = 1
return x / np.expand_dims(l2, axis)
Поскольку вы используете бэкэнд тензор потока, normalize
вдоль 1-й осичто означает?Нормализовать каждый ряд?Это странно.Правильный способ нормализации состоит в том, чтобы (1) векторизовать ваше входное изображение, то есть каждое изображение становится вектором;и (2) normalize
результирующий вектор (по оси = 1).
На самом деле, это несколько неуместно, особенно если вы хотите применить предварительно обученную модель в другом домене.Это связано с тем, что нормализация L2 более чувствительна к ненулевым значениям.В образцах MNIST, почти в двоичном виде, то есть 0 или 1 с.Однако на изображении в оттенках серого вы можете встретить значения в [0,255], что является совершенно другим распределением.
Вы можете попробовать простую (0,1) нормализацию, то есть
x_normalized = (x-min(x))/(max(x)-min(x))
, но для этого требуется переобучить новую модель.
3.Применяйте методы адаптации домена
Это означает, что вы хотите сделать следующие вещи перед подачей тестового изображения в вашу модель (даже до нормализации).
- преобразовать в двоичную форму тестовое изображение,т. е. конвертировать в 0/1 изображения
- отрицание тестового изображения, т. е. сделать 0 с 1 с и 1 с 0 с
- централизовать тестовое изображение, т.е. сместить ваше изображение таким образом, чтобы его центр масс был изображениемcenter.
Конечно, какие методы применять, зависит от различий в доменах, которые вы наблюдаете в результатах визуализации.