Проблема состоит в обучении 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'])