Я пытаюсь преобразовать архитектуру NN, созданную последовательными keras, в функциональный API.Однако, когда я это делаю, моя сеть ничего не изучает.И это точность проверки остается на уровне 28%.Исходный код:
https://github.com/flag0010/pop_gen_cnn/blob/master/selection/train.model.PYTHON3.py
NN устанавливается из строки № 26 - 73.
Способ, который я установилдо NN:
i1 = Input(shape=(5000, 208))
c1 = Conv1D(128*2, kernel_size=ksize,activation='relu',data_format='channels_first',kernel_regularizer=keras.regularizers.l2(l2_lambda))(i1)
c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)
c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)
c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)
c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)
c1 = Flatten()(c1)
i2 = Input(shape=(5000, ))
c2 = Dense(64, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(i2)
c2 = Dropout(0.1)(c2)
c = concatenate([c1, c2])
x = Dense(256, activation='relu', kernel_initializer='normal',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c)
x = Dropout(0.25)(x)
output = Dense(num_classes, activation='softmax')(x)
model = Model([i1, i2], [output])
model.summary()
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adam(),
metrics=['accuracy'])
for e in range(epochs):
for xtrainx, ytrainx, postrainx in training_data:
print (e, xtrainx, ytrainx, postrainx)
xtrain, ytrain,postrain = u[xtrainx], u[ytrainx], u[postrainx]
ytrain = keras.utils.to_categorical(ytrain, num_classes)
postrain = sequence.pad_sequences(postrain, padding='post', value=-1., dtype='float32', maxlen=5000)
xtrain = sequence.pad_sequences(xtrain, padding='post', maxlen=5000)
model.fit([xtrain, postrain], ytrain, batch_size=64,
epochs=1,
verbose=1,
validation_data=([xtest, postest], ytest))
То, что делают оба кода, состоит в том, что одна ветвь сети является нейронной сетью свертки, которая принимает матрицу размером 5000 x 208 в качестве входных данных, а другая ветвь являетсяполностью подключенный NN, который принимает вектор размером 5000. Затем я объединяю две ветви и передаю его в FC NN.На github сеть объединяется как:
model.add(Merge([b1, b2], mode = 'concat'))
И я объединяю две ветви как:
c = concatenate([c1, c2])
Мой код работает абсолютно нормально и без ошибок, но мой NN неучиться чему угодноКак вы думаете, может, я конкатенирую неправильный путь?Если да, то как бы вы объединились, используя функциональный API?Выводы будут оценены.