Beispiel #1
0
def train(x_train, y_train, vocab_size, feature_size, save_path):
    print("\nTrain...")
    model = TextCNN(vocab_size, feature_size, args.embed_size,
                    args.num_classes, args.num_filters, args.filter_sizes,
                    args.regularizers_lambda, args.dropout_rate)
    model.summary()
    model.compile(tf.optimizers.Adam(learning_rate=args.learning_rate),
                  loss='binary_crossentropy',
                  metrics=[micro_f1, macro_f1])

    # parallel_model = keras.utils.multi_gpu_model(model, gpus=2)
    # parallel_model.compile(tf.optimizers.Adam(learning_rate=args.learning_rate), loss='binary_crossentropy',
    #                        metrics=[micro_f1, macro_f1])
    # keras.utils.plot_model(model, show_shapes=True, to_file=os.path.join(args.results_dir, timestamp, "model.pdf"))
    # y_train = tf.one_hot(y_train, args.num_classes)
    # tb_callback = keras.callbacks.TensorBoard(os.path.join(args.results_dir, timestamp, 'log/'),
    #                                           histogram_freq=0.1, write_graph=True,
    #                                           write_grads=True, write_images=True,
    #                                           embeddings_freq=0.5, update_freq='batch')
    history = model.fit(
        x=x_train,
        y=y_train,
        batch_size=args.batch_size,
        epochs=args.epochs,
        steps_per_epoch=19302 // args.batch_size,
        # callbacks=[tb_callback],
        validation_split=args.fraction_validation,
        shuffle=True)
    print("\nSaving model...")
    keras.models.save_model(model, save_path)
    pprint(history.history)
Beispiel #2
0
batch_size = 32
embedding_dims = 50
epochs = 10

print('Loading data...')
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')

print('Pad sequences (samples x time)...')
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)

print('Build model...')
model = TextCNN(maxlen, max_features, embedding_dims).get_model()
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])

print('Train...')
early_stopping = EarlyStopping(monitor='val_acc', patience=3, mode='max')
model.fit(x_train,
          y_train,
          batch_size=batch_size,
          epochs=epochs,
          callbacks=[early_stopping],
          validation_data=(x_test, y_test))

print('Test...')
result = model.predict(x_test)
def main(flag, load_existing_dump=False):
    highlight_string("INITIALIZING")
    print "loading data.."

    dataset = load_datasets(load_existing_dump)
    config = dataset.model_config

    print "word vocab Size: {}".format(len(dataset.word2idx))
    print "char vocab Size: {}".format(len(dataset.char2idx))
    print "Training data Size: {}".format(len(dataset.train_inputs[0]))
    print "valid data Size: {}".format(len(dataset.valid_inputs[0]))
    print "test data Size: {}".format(len(dataset.test_inputs[0]))

    print "word_vocab, embedding_matrix_size: ", len(dataset.word2idx), len(dataset.word_embedding_matrix)
    print "char_vocab, embedding_matrix_size: ", len(dataset.char2idx), len(dataset.char_embedding_matrix)


    if not os.path.exists(os.path.join(DataConfig.data_dir_path, DataConfig.model_dir)):
        os.makedirs(os.path.join(DataConfig.data_dir_path, DataConfig.model_dir))

    with tf.Graph().as_default(), tf.Session() as sess:
        print "Building network...",
        start = time.time()
        with tf.variable_scope("model") as model_scope:
            model = TextCNN(config, dataset.idx2label, dataset.word_embedding_matrix, dataset.label2idx,
                            dataset.char_embedding_matrix)
            # exit(0)
            saver = tf.train.Saver()

        print "took {:.2f} seconds\n".format(time.time() - start)
	print "Model evaluation metric: {}\n".format(config.accuracy_metric)

        merged = tf.summary.merge_all()
        train_writer = tf.summary.FileWriter(os.path.join(DataConfig.data_dir_path, DataConfig.summary_dir,
                                                          DataConfig.train_summ_dir), sess.graph)
        valid_writer = tf.summary.FileWriter(os.path.join(DataConfig.data_dir_path, DataConfig.summary_dir,
                                                          DataConfig.test_summ_dir))

        if flag == Flags.TRAIN:

            # Variable initialization -> not needed for .restore()
            """ The variables to restore do not have to have been initialized,
            as restoring is itself a way to initialize variables. """
            sess.run(tf.global_variables_initializer())
            """ call 'assignment' after 'init' only, else 'assignment' will get reset by 'init' """
            sess.run(tf.assign(model.word_embedding_matrix, model.word_embeddings))
            sess.run(tf.assign(model.char_embedding_matrix, model.char_embeddings))

            highlight_string("TRAINING")
            model.print_trainable_varibles()
	    
	    resume_training = False
	    
	    # Code for resuming training from previous saved checkpoint
	    if config.resume_training_from_saved_checkpoint:
		ckpt_path = tf.train.latest_checkpoint(os.path.join(DataConfig.data_dir_path, DataConfig.model_dir))
	        if ckpt_path is not None:
		    saver.restore(sess, ckpt_path)
		    print "Resuming training from previous saved checkpoint..."
		    resume_training = True
		else:
		    print "No previous checkpoint found! Starting training..."

            model.fit(sess, saver, config, dataset, train_writer, valid_writer, merged, resume_training = resume_training)

            # Testing
            highlight_string("Testing")
            print "Restoring best found parameters on dev set"
            saver.restore(sess, os.path.join(DataConfig.data_dir_path, DataConfig.model_dir,
                                             DataConfig.model_name))

            test_loss, test_accuracy, test_f1_score = model.run_test_epoch(sess, dataset)
            print "- Test Accuracy: {:.2f}".format(test_accuracy * 100.0)
	    print "- Test f1-score: {:.2f}".format(test_f1_score * 100.0)
            print "- Test loss: {:.4f}".format(test_loss)

            train_writer.close()
            valid_writer.close()

        else:
            ckpt_path = tf.train.latest_checkpoint(os.path.join(DataConfig.data_dir_path,
                                                                DataConfig.model_dir))
            if ckpt_path is not None:
                print "Found checkpoint! Restoring variables.."
                saver.restore(sess, ckpt_path)
                highlight_string("Testing")
                valid_loss, valid_accuracy, valid_f1_score = model.run_valid_epoch(sess, dataset, valid_writer, merged)
                print "- valid Accuracy: {:.2f}".format(valid_accuracy * 100.0)
		print "- valid f1-score: {:.2f}".format(valid_f1_score * 100.0)
                print "- valid loss: {:.4f}".format(valid_loss)
                test_loss, test_accuracy, test_f1_score = model.run_test_epoch(sess, dataset)
                print "- Test Accuracy: {:.2f}".format(test_accuracy * 100.0)
		print "- Test f1-score: {:.2f}".format(test_f1_score * 100.0)
                print "- Test loss: {:.4f}".format(test_loss)
                # print_confusion_matrix
            else:
                print "No checkpoint found!"