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)
Beispiel #3
0
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])
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
        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