Керас последовательное моделирование в функциональный API - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь преобразовать архитектуру 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?Выводы будут оценены.

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