#python #tensorflow #keras
#питон #тензорный поток #keras #python #tensorflow
Вопрос:
Я застрял на этом уже больше недели. Я создаю сеть, которая должна оценивать режимы волнового фронта с помощью датчика Шака-Хартмана. Что-то очень специфическое, в основном, видит кучу точек на изображении размером 254×254 и должен оценить 64 параметра, центрированных вокруг 0.
Мои сети выглядят следующим образом:
model = Sequential()
model.add(Conv2D (32,(5, 5),activation="relu",input_shape=[256,256,1]))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Conv2D (32,(5, 5),activation="relu"))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Conv2D (64,(3, 3),activation="relu"))
model.add(Conv2D (64,(3, 3),activation="relu"))
model.add(Conv2D (64,(3, 3),activation="relu"))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Flatten())
model.add(Dense (512, activation="relu" ))
model.add(Dropout(0.02))
model.add(Dense (512, activation="relu" ))
model.add(Dropout(0.02))
model.add(Dense(y_train.shape[1], activation="linear"))
Функция потерь уменьшается в течение нескольких итераций, а затем стагнирует с точностью около 0,09.
Чтобы исправить это, я попытался изменить архитектуру, изменить функции потерь, изменить функции активации, нормализовать данные различными способами и изменить размер пакета. Ничего не помогает.
У кого-нибудь есть представление о том, что я могу попробовать?
Ответ №1:
Это кажется действительно сложной задачей: возьмите некоторый ввод в виде изображения с точками и переведите его в вектор из 64 параметров. Я не удивлен, что сеть работает не очень хорошо. Кроме того, я предполагаю, что 64 параметра являются действительными числами в диапазоне от -1 до 1 (из-за вашего утверждения «сеть … должна оценивать 64 параметра с центром вокруг 0 от нее»). Если это так, то это не проблема классификации, и точность не имеет смысла как показатель. Попробуйте вместо этого отслеживать RMSE или AE. Аналогичным образом, убедитесь, что метки соответствуют вашим требованиям. Вы хотите классифицировать волновые фронты, присутствующие на изображении, по разным классам или вы хотите назначить вещественные параметры для каждого волнового фронта на изображении? В первом случае метки были бы однозначными векторами, а во втором — 64 действительными числами.
Несколько вещей, которые вы можете попробовать:
-
Во-первых, удалите отсев и обучите небольшое подмножество данных, чтобы убедиться, что модель может соответствовать небольшому подмножеству (т.Е. 100% точности или 0.0 RMSE). Если модель не может этого сделать, вам нужно попробовать другой подход (возможно, подход, отличный от cnn).
-
Масштабируйте свои цели до действительных чисел от 0 до 1 и измените активацию вывода на сигмоид. Это может дать сети лучшую отправную точку, поскольку ее выходные данные должны быть между 0 и 1. Использование линейной активации для последнего уровня дает сети свободу предсказывать любое действительное число и увеличивает пространство, которое NN должен искать, чтобы сделать хороший прогноз.
-
Соответственно, используйте двоичную кроссэнтропию в качестве функции потерь с сигмоидальным выводом и посмотрите, как работает модель.
-
Вы могли бы увидеть, может ли модель предсказать один элемент вектора длины 64 и обучить одну модель для каждого параметра. Это было бы дорого в вычислительном отношении, но если это сработает, это сработает.
Удачи.
Комментарии:
1. Спасибо за предложения! Я не использовал сигмоид в последнем слое, потому что это не очень практично для нормализации выходных данных. Вместо этого я изменил предпоследний слой активации на sigmoid и перед этим добавил слой нормализации, который сделал свое дело.