CNN сходится только для функции потери двоичной_кросентропии и терпит неудачу в тестовом наборе данных - PullRequest
1 голос
/ 09 ноября 2019

Проблема состоит в обучении CNN с набором данных, содержащим входные данные (n, n) матриц формы чисел от 0 до 1000. Выходные данные должны представлять те же самые (n, n) матрицы формы, имеющие значения 0исправлены другими значениями от 1 до 1000. (Аналогично шумоподавляющим изображениям)

Example:
Input:             Output: 
135 0   283 4      135 75  283 4
25  38  43  0      25  38  43  815
0   99  820 481    533 99  820 481
728 331 3   28     728 331 3   28

Выходные данные были получены путем выполнения входных данных через генетический алгоритм для оптимизации функции внешних затрат. (эта функция довольно сложна и вычисляется во внешней специализированной программе) Весь набор данных содержит 3000 входов и выходов, каждый из которых имеет форму (10,10).

Поскольку проблема напоминает сходство с нейронными сетями обработки изображенийЯ решил использовать CNN. X_data содержит значения каждой входной матрицы, а Y_data содержит двоичные кодировки (длиной 10 десятичных знаков) выходных исправленных данных. (разработал эту кодировку, чтобы уменьшить выходной размер и улучшить скорость сходимости)

Example:
X_data:            Y_data:
135 0   283 4      0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1...
25  38  43  0
0   99  820 481
728 331 3   28

Сеть сходится только при использовании функции потерь 'binary_crossentropy' , но при сравнениипроизводительность обученной CNN над новыми входами, улучшений нет. (Я измеряю это, сравнивая выходные данные CNN с оптимизированным выходным сигналом генетического алгоритма по той же функции внешних затрат)

Вопросы: совместимы ли входные и выходные наборы обучающих данных с такой проблемой? Достаточно ли велик набор данных для получения правильных результатов или следует предоставить больше данных для обучения? Является ли кодирование выходных данных хорошим подходом, или это проблема, из-за которой обученный CNN не работает? Если есть какие-либо другие недостатки подхода, пожалуйста, помогите мне разобраться с ними!

inshape = (dim,dim,1)
outshape = (dim*dim*10)

model = Sequential()     
inp = Input(inshape) 
x = BatchNormalization()(inp)
x = Conv2D(1000, kernel_size=3,padding='same')(x)
x = Activation('relu')(x)    
x = Reshape((100,100,-1))(x)
x = MaxPooling2D(pool_size=(5,5))(x)
x = SpatialDropout2D(rate = 0.5)(x, training=True)    
x = Conv2D(250, kernel_size=3,padding='same')(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(4,4))(x)    
x = SpatialDropout2D(rate = 0.3)(x, training=True)
x = Conv2D(400, kernel_size=3,padding='same')(x) 
x = Activation('sigmoid')(x)
x = MaxPooling2D(pool_size=(2,2))(x) 
x = Conv2D(2500, kernel_size=3,padding='same')(x) 
x = Activation('sigmoid')(x)
x = MaxPooling2D(pool_size=(2,2))(x)  
x = BatchNormalization()(x)
x = Flatten()(x)
out = Dense(outshape, activation='sigmoid',name='out')(x)
model = Model(inputs=inp,outputs=(out)) 
model.compile(optimizer=Adadelta(lr=1.0),
              loss = ['binary_crossentropy'], metrics =['accuracy'])

1 Ответ

0 голосов
/ 09 ноября 2019

Прежде всего, вам действительно нужен CNN или просто полностью соединенные слои? Чтобы ответить на этот вопрос, спросите себя, существует ли пространственная связь между значениями ваших входных данных, как на изображениях. Теперь по вашим вопросам:

Совместимы ли входные и выходные данные обучающего набора с такой проблемой?

Да, это так. То, что вам нужно, называется автоинкодером с шумоподавлением (CNN или полностью подключенный, это зависит от ваших данных). Автоэнкодеры применяют последовательно две функции к x, так что f (g (x)) = x ', а x и x' имеют одинаковый размер. Чтобы не дать автоэнкодеру узнать матрицу тождеств, слои посередине значительно меньше. Удаление является одним из вариантов, поскольку нули во входном массиве рассматриваются как шум, и вы хотите восстановить недостающую информацию в выходном слое.

Достаточно ли велик набор данных для получения правильных результатов или выполненияМне нужно больше данных?

Это зависит от сложности функции, которая связывает предикторы с результатами, а также от энтропии ваших данных. Попробуйте изменить ширину и глубину ваших слоев, чтобы увидеть, помогает ли это.

Является ли кодирование выходных данных хорошим подходом, или это проблема, которая заставляет обученный CNN не работать?

Однократное кодирование полезно, когда вы имеете дело с задачей классификации, а не с задачей регрессии. Из того, что я понимаю, у вас есть задача регрессии, даже если вы пытаетесь вывести целые числа. Вы можете просто попытаться восстановить входной x на выходном слое с матрицей действительных чисел и в конечном итоге округлить их для вычисления ваших потерь, что может быть простым RMSE (двоичная кросс-энтропия для задач классификации).

Теперь, чтобы заставить нейронные сети работать, есть много различных факторов, и одних знаний недостаточно. Вам также нужны опыт, испытания и ошибки и т. Д. Я рекомендую вам начать с простого, получить удовлетворительные результаты, а затем постараться постепенно повысить точность прогноза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...