def level2(): # Destroying the current TF graph - https://keras.io/backend/ backend.clear_session() print("\n### LEVEL2 ###") conv_base2 = NASNetLarge(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3)) model2 = models.Sequential() model2.add(conv_base2) model2.add(layers.GlobalAveragePooling2D()) model2.add(layers.Dense(fcLayer1, activation='relu')) model2.add(layers.Dropout(dropout)) model2.add(layers.Dense(classes, activation='softmax')) print("\nLoading trained weights from " + weights_path + " ...") model2.load_weights(weights_path) # unfreezing the base network up to a specific layer: if freezeUptoLayer == "": conv_base2.trainable = True print ("\ntrainable layers: ",int(len(model2.trainable_weights) / 2)) else: print("\ntrainable layers before unfreezing the base network up to " + freezeUptoLayer + ": ",int(len(model2.trainable_weights) / 2)) # weights = weights + bias = 2 pro layer conv_base2.trainable = True set_trainable = False for layer in conv_base2.layers: if layer.name == freezeUptoLayer: set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False print("trainable layers after the base network unfreezed from layer " + freezeUptoLayer + ": ", int(len(model2.trainable_weights)/2)) print("\nLEVEL2 Model after unfreezing the base network") model2.summary() model2.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=learning_rate/10, decay=lr_decay), metrics=['acc']) print ("\n### Validating ... ") val_loss, val_acc = model2.evaluate_generator(test_generator, steps=nbrTestImages, verbose=0) print('Validation Results before training unfreeze layers and trained densely connected layers:\nValidation loss:',val_loss,",",'Validation accuracy:', val_acc, "\n") # Jointly training both the unfreeze layers and the added trained densely connected layers callbacks_list_L2 = [ModelCheckpoint(filepath=model_path+'l2.h5', save_weights_only=False, monitor='val_acc', verbose=1, save_best_only=True), ReduceLROnPlateau(monitor='val_acc', factor=factorL2, patience=patiencel2, verbose=1), TensorBoard(log_dir=TensorBoardLogDir+'\\level2')] print ("\n### Level2 Training ... ") history = model2.fit_generator( train_generator, steps_per_epoch=(nbrTrainImages * classes) // (batch * 5), epochs=epochsL2, callbacks=callbacks_list_L2, validation_data=test_generator, validation_steps=nbrTestImages, verbose=verbose_train) history_val2 = [history.history] # saving all results of the final test plot(history_val2, "LEVEL2:", epochsL2) print("\n###LEVEL2 Training finished successfully ###")
def level1(): # Building the model using the pretrained model conv_base1 = NASNetLarge(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3)) print("\n### LEVEL1 ###\npretrained network:") conv_base1.summary() model = models.Sequential() model.add(conv_base1) model.add(layers.GlobalAveragePooling2D()) model.add(layers.Dense(fcLayer1, activation='relu')) model.add(layers.Dropout(dropout)) model.add(layers.Dense(classes, activation='softmax')) # freezing the base network print("trainable layers bevor freezing:", int(len(model.trainable_weights)/2)) # weights = weights + bias = 2 pro layer conv_base1.trainable = False print("trainable layers after freezing:", int(len(model.trainable_weights)/2)) print("\npretrained network + densely connected classifier") model.summary() # training the added layers only model.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=learning_rate, decay=lr_decay), metrics=['acc']) callbacks_list_L1 = [ModelCheckpoint(filepath=weights_path, save_weights_only=True, monitor='val_acc', verbose=1, save_best_only=True), ReduceLROnPlateau(monitor='val_acc', factor=factorL1, patience=patiencel1, verbose=1), TensorBoard(log_dir=TensorBoardLogDir+'\\level1')] print("\n### Level1 Training ... ") # training the model history = model.fit_generator( train_generator, steps_per_epoch=(nbrTrainImages * classes) // (batch * 5), epochs=epochsL1, callbacks=callbacks_list_L1, validation_data=test_generator, validation_steps=nbrTestImages, verbose=verbose_train) history_val1 = [history.history] # saving all results of the final test plot(history_val1, "LEVEL1:", epochsL1) print("\n### LEVEL1 Training finished successfully ###") print("\nLoading trained weights from " + weights_path + " ...") model.load_weights(weights_path) model.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=learning_rate), metrics=['acc']) print("\n### Saving Level1 Model to ", model_path+'l1.h5', " ... ") model.save(model_path+'l1.h5')
""" #Import NASNetLarge architecture with imagenet weights from keras.applications import NASNetLarge conv_base = NASNetLarge(weights='imagenet', include_top=False, input_shape=(350,350,3)) from keras import models, layers model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation = 'relu')) model.add(layers.Dense(3, activation = 'softmax')) #v0, convolutional layers 17-18 free conv_base.trainable = True set_trainable = False for layer in conv_base.layers: if layer.name == 'normal_conv_1_18' or layer.name == 'normal_conv_1_17': set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False #Optimizer = Adam model.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=1e-5), metrics=['acc']) #folder with training dataset train_dir = '/tolkach/training_dataset_SN/'