def cnn_static(self): x_train, y_train, x_test, y_test, vocabolary_dict = data_load_and_preproccess( self.word_size, self.sequence_length) embedding_weights = word_to_vector(np.vstack( (x_train, x_test)), vocabolary_dict, self.embedding_dim, self.min_word_count, self.context_window_size) x_train = np.stack([ np.stack([embedding_weights[word] for word in sentence]) for sentence in x_train ]) x_test = np.stack([ np.stack([embedding_weights[word] for word in sentence]) for sentence in x_test ]) #model building model_input = Input(shape=(self.sequence_length, self.embedding_dim)) model = Dropout(self.drop_prob[0])(model_input) multi_cnn_channel = [] for kernal in self.kernal_size: conv_channel = Convolution1D(filters=self.filters, kernel_size=kernal, padding="valid", activation="relu", strides=1)(model) conv_channel = MaxPooling1D(pool_size=2)(conv_channel) conv_channel = Flatten()(conv_channel) multi_cnn_channel.append(conv_channel) model = Concatenate()(multi_cnn_channel) model = Dropout(self.drop_prob[1])(model) for dimension in self.hidden_dims: model = Dense(dimension, activation="relu")(model) model_output = Dense(1, activation="sigmoid")(model) model = Model(model_input, model_output) model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) print("Started Training : ") model.fit(x_train, y_train, batch_size=self.batch_size, epochs=self.epochs, validation_data=(x_test, y_test), verbose=2) print("Training Completed") self.model = model
def main(data_path, output_path): X_trainS1, Y_train, X_valS1, Y_val = load_data(data_path) epochs = 10 batch_size = 256 dropout_rate = 0.15 n_classes = 6 # 三个子模型的输入数据 main_input1 = Input(shape=(128, 3), name='main_input1') def lstm_cell(main_input): """ 基于DeepConvLSTM算法, 创建子模型 :param main_input: 输入数据 :return: 子模型 """ sub_model = TimeDistributed(Dense(384), input_shape=(128, 3))(main_input) # sub_model = Flatten()(main_input) print(sub_model) sub_model = LSTM(256, return_sequences=True)(sub_model) sub_model = LSTM(128, return_sequences=True)(sub_model) sub_model = LSTM(128)(sub_model) main_output = Dropout(dropout_rate)(sub_model) return main_output model = lstm_cell(main_input1) model = Dropout(0.4)(model) model = Dense(n_classes)(model) model = BatchNormalization()(model) output = Activation('softmax', name="softmax")(model) model = Model([main_input1], output) model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) print(model.summary()) # graph_path = os.path.join(output_path, "merged_model.png") # plot_model(model, to_file=graph_path, show_shapes=True) # 绘制模型图 metrics = Metrics() # 度量FPR history = model.fit(X_trainS1, Y_train, batch_size=batch_size, validation_data=(X_valS1, Y_val), epochs=epochs, callbacks=[metrics]) # 增加FPR输出 model_path = os.path.join(output_path, "merged_dcl.h5") model.save(model_path) # 存储模型 print(history.history)
def runResNet(epoch): gloveD = 300 embMat = pickle.load(open('embMat' + str(gloveD) + '.pickle', 'rb')) x_train_seq, y_train, x_val_seq, y_val = pickle.load( open('trainValData.pickle', 'rb')) act = 'relu' inp = Input(shape=(300, ), dtype='int32') e = Embedding(90461, gloveD, weights=[embMat], input_length=300, trainable=False)(inp) #model = Flatten()(e) model = Conv1D(filters=100, kernel_size=2, padding='valid', activation=act, strides=1)(e) model = Dropout(0.5)(model) model = GlobalMaxPooling1D()(model) short = model model = Dense(256, activation=act)(model) model = Dropout(0.8)(model) #short2 = model #model = Add()([model, short]) #model = Activation(act)(model) model = Dense(256, activation=act)(model) model = Dropout(0.8)(model) #short3 = model #model = Add()([model, short2]) #model = Activation(act)(model) model = Dense(256, activation=act)(model) model = Dropout(0.8)(model) #short4 = model #model = Add()([model, short3]) #model = Activation(act)(model) model = Dense(256, activation=act)(model) model = Dropout(0.8)(model) #short5 = model #model = Add()([model,short4]) #model = Activation(act)(model) model = Dense(100, activation=act)(model) model = Dropout(0.8)(model) model = Add()([model, short]) model = Activation(act)(model) output = Dense(2, activation='softmax')(model) model = Model(inputs=[inp], outputs=[output]) model.compile(loss="binary_crossentropy", optimizer='adam', metrics=['accuracy']) filepath = "res_best_weights.{epoch:02d}-{val_acc:.4f}.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max') model.fit(x_train_seq, y_train, validation_data=(x_val_seq, y_val), epochs=epoch, batch_size=128, verbose=1, callbacks=[checkpoint])
def main(data_path, output_path): X_trainS1, Y_train, X_valS1, Y_val = load_data(data_path) epochs = 10 batch_size = 256 kernel_size = 3 pool_size = 2 dropout_rate = 0.15 n_classes = 6 f_act = 'relu' # 三个子模型的输入数据 main_input1 = Input(shape=(128, 3), name='main_input1') def cnn_lstm_cell(main_input): """ 基于DeepConvLSTM算法, 创建子模型 :param main_input: 输入数据 :return: 子模型 """ sub_model = Conv1D(512, kernel_size, input_shape=(128, 3), activation=f_act, padding='same')(main_input) print('sub_model512:', sub_model) sub_model = BatchNormalization()(sub_model) sub_model = MaxPooling1D(pool_size=pool_size)(sub_model) print('sub_model:', sub_model) sub_model = Dropout(dropout_rate)(sub_model) print('sub_model:', sub_model) sub_model = Conv1D(64, kernel_size, activation=f_act, padding='same')(sub_model) print('sub_model64:', sub_model) sub_model = BatchNormalization()(sub_model) sub_model = MaxPooling1D(pool_size=pool_size)(sub_model) print('sub_model:', sub_model) sub_model = Dropout(dropout_rate)(sub_model) print('sub_model:', sub_model) sub_model = Conv1D(32, kernel_size, activation=f_act, padding='same')(sub_model) print('sub_model32:', sub_model) sub_model = BatchNormalization()(sub_model) sub_model = MaxPooling1D(pool_size=pool_size)(sub_model) print('sub_model:', sub_model) sub_model = LSTM(128, return_sequences=True)(sub_model) print('sub_model128_1:', sub_model) sub_model = LSTM(128, return_sequences=True)(sub_model) print('sub_model128_2:', sub_model) sub_model = LSTM(128)(sub_model) print('sub_model128_3:', sub_model) main_output = Dropout(dropout_rate)(sub_model) print('main_output:', main_output) return main_output model = cnn_lstm_cell(main_input1) model = Dropout(0.4)(model) model = Dense(n_classes)(model) model = BatchNormalization()(model) output = Activation('softmax', name="softmax")(model) model = Model([main_input1], output) model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) # graph_path = os.path.join(output_path, "merged_model.png") # plot_model(model, to_file=graph_path, show_shapes=True) # 绘制模型图 metrics = Metrics() # 度量FPR history = model.fit(X_trainS1, Y_train, batch_size=batch_size, validation_data=(X_valS1, Y_val), epochs=epochs, callbacks=[metrics]) # 增加FPR输出 model_path = os.path.join(output_path, "merged_dcl.h5") model.save(model_path) # 存储模型 print(history.history)
tangential_strain_layer = (Dense(32, activation='relu'))(tangential_strain_layer) tangential_strain_layer = Dropout(0.5)(tangential_strain_layer) tangential_strain_layer = Flatten()(tangential_strain_layer) merge = concatenate([energy_layer, maximum_amplitude_layer, radial_strain_layer, tangential_strain_layer]) model = (Dense(32, activation='relu'))(merge) model = Dropout(0.5)(model) model = (Dense(1, activation='sigmoid'))(model) model = Model(inputs=[energy_input, maximum_amplitude_input, radial_strain_input, tangential_strain_input], outputs=model) model.compile(loss='binary_crossentropy', optimizer="rmsprop", metrics=['accuracy']) print model.summary() print "Training....................................................." model.fit([energies, maximum_amplitudes, radial_strains, tangential_strains], train_labels, epochs=epochs, verbose=1, batch_size=batch_size, validation_split=0.2) print("--- train %s seconds ---" % (time.time() - start_time)) original_classified = model.predict([energies, maximum_amplitudes, radial_strains, tangential_strains], batch_size=batch_size, verbose=0) best_threshold = find_best_threshold(train_labels, original_classified) if run_test: print 'test' for test in test_sets: print test test_reader = pd.read_csv(get_diff_path(test)) energy_test, maximum_amplitude_test, radial_strain_test, tangential_strain_test, test_labels = read_data( test_reader)
opt = optimizers.Adam( ) # Default: lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False, model.compile(optimizer=opt, loss=losses.binary_crossentropy, metrics=['accuracy']) print(get_available_gpus()) # Model Summary model.summary() # Start timer start_time = time.time() # Fit model model.fit(x_train, y_train, batch_size=16, validation_data=(x_valid, y_valid), epochs=epochs, shuffle=True, verbose=2, callbacks=[metrics]) # Get time total_train_time = time.time() - start_time print('Total training time in seconds: ') print(total_train_time) # Save model to file model.save(os.path.join('.', 'trained_model.h5')) # Plotting Epoch/accuracy # print (metrics.acc) # plt.plot(metrics.acc) # plt.plot(metrics.val_acc,color='red') # plt.xlabel('epochs')
def BiLSTM_model(filename, train, output, X_train, X_test, word2ind, maxWords, y_train, y_test, ind2label, validation=False, X_valid=None, y_valid=None, word_embeddings=True, pretrained_embedding="", word_embedding_size=100, maxChar=0, char_embedding_type="", char2ind="", char_embedding_size=50, lstm_hidden=32, nbr_epochs=5, batch_size=32, dropout=0, optimizer='rmsprop', early_stopping_patience=-1, folder_path="model_results", gen_confusion_matrix=False): """ Build, train and test a BiLSTM Keras model. Works for multi-tasking learning. The model architecture looks like: - Words representations: - Word embeddings - Character-level representation [Optional] - Dropout - Bidirectional LSTM - Dropout - Softmax/CRF for predictions :param filename: File to redirect the printing :param train: Boolean if the model must be trained or not. If False, the model's wieght are expected to be stored in "folder_path/filename/filename.h5" :param otput: "crf" or "softmax". Type of prediction layer to use :param X_train: Data to train the model :param X_test: Data to test the model :param word2ind: Dictionary containing all words in the training data and a unique integer per word :param maxWords: Maximum number of words in a sequence :param y_train: Labels to train the model for the prediction task :param y_test: Labels to test the model for the prediction task :param ind2label: Dictionary where all labels for task 1 are mapped into a unique integer :param validation: Boolean. If true, the validation score will be computed from 'X_valid' and 'y_valid' :param X_valid: Optional. Validation dataset :param y_valid: Optional. Validation dataset labels :param word_embeddings: Boolean value. Add word embeddings into the model. :param pretrained_embedding: Use the pretrained word embeddings. Three values: - "": Do not use pre-trained word embeddings (Default) - False: Use the pre-trained embedding vectors as the weights in the Embedding layer - True: Use the pre-trained embedding vectors as weight initialiers. The Embedding layer will still be trained. :param word_embedding_size: Size of the pre-trained word embedding to use (100 or 300) :param maxChar: The maximum numbers of characters in a word. If set to 0, the model will not use character-level representations of the words :param char_embedding_type: Type of model to use in order to compute the character-level representation of words: Two values: "CNN" or "BILSTM" :param char2ind: A dictionary where each character is maped into a unique integer :param char_embedding_size: size of the character-level word representations :param lstm_hidden: Dimentionality of the LSTM output space :param nbr_epochs: Number of epochs to train the model :param batch_size: Size of batches while training the model :param dropout: Rate to apply for each Dropout layer in the model :param optimizer: Optimizer to use while compiling the model :param early_stopping_patience: Number of continuous tolerated epochs without improvement during training. :param folder_path: Path to the directory storing all to-be-generated files :param gen_confusion_matrix: Boolean value. Generated confusion matrices or not. :return: The classification scores for both tasks. """ print("====== {0} start ======".format(filename)) end_string = "====== {0} end ======".format(filename) # Create directory to store results os.makedirs(folder_path + "/" + filename) filepath = folder_path + "/" + filename + "/" + filename # Set print outputs file file, stdout_original = setPrintToFile("{0}.txt".format(filepath)) # Model params nbr_words = len(word2ind) + 1 out_size = len(ind2label) + 1 best_results = "" embeddings_list = [] inputs = [] # Input - Word Embeddings if word_embeddings: word_input = Input((maxWords, )) inputs.append(word_input) if pretrained_embedding == "": word_embedding = Embedding(nbr_words, word_embedding_size)(word_input) else: # Retrieve embeddings embedding_matrix = word2VecEmbeddings(word2ind, word_embedding_size) word_embedding = Embedding(nbr_words, word_embedding_size, weights=[embedding_matrix], trainable=pretrained_embedding, mask_zero=False)(word_input) embeddings_list.append(word_embedding) # Input - Characters Embeddings if maxChar != 0: character_input = Input(( maxWords, maxChar, )) char_embedding = character_embedding_layer(char_embedding_type, character_input, maxChar, len(char2ind) + 1, char_embedding_size) embeddings_list.append(char_embedding) inputs.append(character_input) # Model - Inner Layers - BiLSTM with Dropout embeddings = concatenate(embeddings_list) if len( embeddings_list) == 2 else embeddings_list[0] model = Dropout(dropout)(embeddings) model = Bidirectional( LSTM(lstm_hidden, return_sequences=True, dropout=dropout))(model) model = Dropout(dropout)(model) if output == "crf": # Output - CRF crfs = [[CRF(out_size), out_size] for out_size in [len(x) + 1 for x in ind2label]] outputs = [x[0](Dense(x[1])(model)) for x in crfs] model_loss = [x[0].loss_function for x in crfs] model_metrics = [x[0].viterbi_acc for x in crfs] if output == "softmax": outputs = [ Dense(out_size, activation='softmax')(model) for out_size in [len(x) + 1 for x in ind2label] ] model_loss = ['categorical_crossentropy' for x in outputs] model_metrics = None # Model model = Model(inputs=inputs, outputs=outputs) model.compile(loss=model_loss, metrics=model_metrics, optimizer=get_optimizer(optimizer)) print(model.summary(line_length=150), "\n\n\n\n") # Training Callbacks: callbacks = [] value_to_monitor = 'val_f1' best_model_weights_path = "{0}.h5".format(filepath) # 1) Classifition scores classification_scores = Classification_Scores([X_train, y_train], ind2label, best_model_weights_path) callbacks.append(classification_scores) # 2) EarlyStopping if early_stopping_patience != -1: early_stopping = EarlyStopping(monitor=value_to_monitor, patience=early_stopping_patience, mode='max') callbacks.append(early_stopping) # Train if train: # Train the model. Keras's method argument 'validation_data' is referred as 'testing data' in this code. hist = model.fit(X_train, y_train, validation_data=[X_test, y_test], epochs=nbr_epochs, batch_size=batch_size, callbacks=callbacks, verbose=2) print() print('-------------------------------------------') print( "Best F1 score:", early_stopping.best, " (epoch number {0})".format( 1 + np.argmax(hist.history[value_to_monitor]))) # Save Training scores save_model_training_scores("{0}".format(filepath), hist, classification_scores) # Print best testing classification report best_epoch = np.argmax(hist.history[value_to_monitor]) print(classification_scores.test_report[best_epoch]) # Best epoch results best_results = model_best_scores(classification_scores, best_epoch) # Load weigths from best training epoch into model save_load_utils.load_all_weights(model, best_model_weights_path) # Create confusion matrices if gen_confusion_matrix: for i, y_target in enumerate(y_test): # Compute predictions, flatten predictions, target = compute_predictions(model, X_test, y_target, ind2label[i]) # Generate confusion matrices save_confusion_matrix( target, predictions, list(ind2label[i].values()), "{0}_task_{1}_confusion_matrix_test".format( filepath, str(i + 1))) # Validation dataset if validation: print() print("Validation dataset") print("======================") # Compute classification report for i, y_target in enumerate(y_valid): # Compute predictions, flatten predictions, target = compute_predictions(model, X_valid, y_target, ind2label[i], nbrTask=i) # Only for multi-task if len(y_train) > 1: print("For task " + str(i + 1) + "\n") print( "====================================================================================" ) print("") print("With padding into account") print( metrics.flat_classification_report([target], [predictions], digits=4)) print("") print('----------------------------------------------') print("") print("Without the padding:") print( metrics.flat_classification_report([target], [predictions], digits=4, labels=list( ind2label[i].values()))) # Generate confusion matrices save_confusion_matrix( target, predictions, list(ind2label[i].values()), "{0}_task_{1}_confusion_matrix_validation".format( filepath, str(i + 1))) # Close file closePrintToFile(file, stdout_original) print(end_string) return best_results