Обучите модель дуэта, заморозив определенные слои в керасе - PullRequest
0 голосов
/ 18 апреля 2020

Я никогда не пытался заморозить модель.

Я разработал модель, которая имеет два параллельных CNN с одинаковой структурой, которая принимает один и тот же вход. Затем у меня есть три выхода, два из которых являются вспомогательными для каждого CNN, а один - для классификатора предохранителей.

Я хочу тренировать модель альтернативным способом в каждую эпоху. Я читал, что мы можем заморозить модель, но я не знаю, как реализовать альтернативный слой свертки во время обучения. В некоторых постах я видел, что мы можем передавать функции в качестве аргумента обратного вызова. Но я не уверен, как это сделать. Кто-нибудь может мне помочь, предоставив пример?

моя модель

вход 1

input1= layers.Input(shape=(600,), dtype='int32', name='model1')

embeded_sequence1 = layers.Embedding(10000, 32) (input1)

conv_layer1 = layers.Conv1D(NO_OF_CONV_FILTERS,NO_OF_CONV_SIZE)(embeded_sequence1 )

activ_layer1 = layers.Activation('relu')(conv_layer1 )

global_max_pool1 = layers.GlobalMaxPooling1D()(activ_layer1 )

fc_layer_1 = layers.Dense(256)(global_max_pool1)

fc_relu_1 = layers.Activation('relu')(fc_layer_1)

dropout_layer_1 = layers.Dropout(0.5)(fc_relu_1)

aux1_output = layers.Dense(2,activation='softmax',name='aux1_output')(dropout_layer_1)

вход 2

embeded_sequence2 = layers.Embedding(10000, 32)(input1 )

conv_layer2 = layers.Conv1D(NO_OF_CONV_FILTERS,NO_OF_CONV_SIZE)(embeded_sequence2 )

activ_layer2 = layers.Activation('relu')(conv_layer2 )

global_max_pool2 = layers.GlobalMaxPooling1D()(activ_layer2 )

fc_layer_2 = layers.Dense(256)(global_max_pool2)

fc_relu_2 = layers.Activation('relu')(fc_layer_2)

dropout_layer_2 = layers.Dropout(0.5)(fc_relu_2)

aux2_output = layers.Dense(2,activation='softmax',name='aux2_output')(dropout_layer_2)

выполнить классификацию предохранителей

fuse = add(inputs=[global_max_pool1, global_max_pool2])

fc_layer_fuse = layers.Dense(256)(dot_product)

fc_relu_fuse = layers.Activation('relu')(fc_layer_fuse)

dropout_layer_fuse = layers.Dropout(0.5)(fc_relu_fuse)

fuse_output = layers.Dense(2,activation='softmax',name='fuse_output')(dropout_layer_fuse)

losses = { aux1_output':'categorical_crossentropy',  
 'aux2_output':'categorical_crossentrpy', 
 'fuse_output':'categorical_crossentropy'    
}

lossWeights = {'aux1_output':0.3,'aux2_output':0.3,'fuse_output':1.0    }

model.compile(optimizer='adam', loss=losses,loss_weights=lossWeights,          metrics=['accuracy'])

model.fit([X_train],[Y_trai,Y_train,Y_train],validation_data=[[X_test],[Y_test,Y_test,Y_test]], verbose=2, epochs = 100,shuffle = False )
...