Esempio n. 1
0
def train():
    batch_size = 64
    # maxlen = 36
    data_loader = Data_Loader(batch_size)
    maxlen = data_loader.maxlen
    model = Model(data_loader.emb_mat, num_class=3, drop_out=0.5).to(device)
    optimizer = torch.optim.Adam(
        model.parameters(),
        lr=0.0001)  ###############learning rate is important
    epochs = 100
    for i in range(epochs):
        data_loader.reset_pointer()
        num_batch = int(data_loader.train_size / batch_size)
        for b in range(num_batch + 1):
            input_data, mask_data, y_data = data_loader.__next__()

            loss = model(input_data.to(device), maxlen, mask_data.to(device),
                         y_data.to(device))

            optimizer.zero_grad()

            loss.backward()

            torch.nn.utils.clip_grad_norm(model.parameters(), 1.)

            optimizer.step()

            sys.stdout.write("\repoch:{}, batch:{}, loss:{}".format(
                i, b, loss))
Esempio n. 2
0
def train():
	batch_size = 32
	neg_size = 4
	data_loader = Data_Loader(batch_size)
	maxlen = data_loader.maxlen
	model = Model(data_loader.emb_mat,
				num_tag = data_loader.num_tag,
				num_class = 3,
				maxlen = maxlen,
				batch_size = batch_size,
				drop_out = 0.5,
				neg_size = neg_size)
	epochs = 100
	best_acc = 0
	with tf.Session() as sess:
		sess.run(tf.global_variables_initializer())
		saver = tf.train.Saver(tf.global_variables())

		for i in range(epochs):
			data_loader.reset_pointer()
			num_batch = int(data_loader.train_size/batch_size)
			for b in range(num_batch+1):
				input_data, input_tag, mask_data, y_data, label_mask = data_loader.__next__()
				# print(input_data.shape, mask_data.shape, y_data.shape)
				input_neg = np.random.randint(1,data_loader.vocab_size, (input_data.shape[0], maxlen, neg_size))
				# print(input_neg)
				y_data = to_categorical(y_data, 3)
				# print(y_data.shape,'uqjwen')
				_,loss = sess.run([model.train_op, model.cost], feed_dict = {model.x:input_data,
																			model.t:input_tag,
																			model.mask:mask_data,
																			model.neg:input_neg,
																			model.labels:y_data})

				sys.stdout.write('\repoch:{}, batch:{}, loss:{}'.format(i,b,loss))
				sys.stdout.flush()

				# break
			acc1, acc2 = val(sess, model, data_loader)
			if acc1>best_acc:
				best_acc = acc1
				saver.save(sess, checkpointer_dir+'model.ckpt', global_step=i)
			print("\nacc1: ",acc1, "acc2: ",acc2)
Esempio n. 3
0
def train():
    batch_size = 32
    # domain = sys.argv[1]
    data_loader = Data_Loader(batch_size, FLAGS.domain, FLAGS.emb_size)
    maxlen = data_loader.maxlen
    model = Model(data_loader.gen_mat,
                  data_loader.emb_mat,
                  num_tag=data_loader.num_tag,
                  num_cat=data_loader.num_cat,
                  num_class=3,
                  maxlen=maxlen,
                  batch_size=batch_size,
                  drop_out=0.5)
    epochs = 100
    best_1 = 0
    best_2 = 0
    train_loss = []
    val_score = []
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        # saver = tf.train.Saver(tf.global_variables())
        saver = tf.train.Saver(max_to_keep=1)

        ckpt = tf.train.get_checkpoint_state(checkpoint_dir)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)
            print(" [*] loading parameters success!!!")
        else:
            print(" [!] loading parameters failed...")

        lambda_1 = 1
        lambda_2 = 1

        if FLAGS.variant == 'term':
            lambda_2 = 0.
        elif FLAGS.variant == 'category':
            lambda_1 = 0.
        print('lambda: ', lambda_1, lambda_2)

        # print('lambda_2: ',lambda_2)
        val_data = data_loader.val(1)
        for i in range(epochs):
            data_loader.reset_pointer()
            num_batch = int(data_loader.train_size / batch_size)
            # print("total batch: ", num_batch)
            for b in range(num_batch + 1):
                input_data, input_tag, mask_data, y_data, clabels, tfidf = data_loader.__next__(
                )
                # print(input_data.shape, input_tag.shape, mask_data.shape, y_data.shape, label_mask.shape)
                # print(input_data.shape, mask_data.shape, y_data.shape)
                # print(input_neg)
                y_data = to_categorical(y_data, 3)

                # print(y_data.shape,'uqjwen')

                feed_dict = {
                    model.x: input_data,
                    model.t: input_tag,
                    model.mask: mask_data,
                    model.labels: y_data,
                    model.clabels: clabels,
                    model.is_training: True,
                    model.tfidf: tfidf,
                    model.lambda_1: lambda_1,
                    model.lambda_2: lambda_2
                }
                _, loss = sess.run([model.train_op, model.cost],
                                   feed_dict=feed_dict)

                sys.stdout.write('\repoch:{}, batch:{}, loss:{}'.format(
                    i, b, loss))
                sys.stdout.flush()
                # if loss is np.nan:
            # print('sum_score',sum_score,'\nd1',d1,'\nd2',d2)

            # break
            # print("validation....")
            lr = sess.run(model.lr, feed_dict={model.global_step: i})
            # print('\t learning_rate: ',lr)
            fscore_1, fscore_2 = val(sess, model, val_data)
            print('\n', fscore_1, fscore_2)
            # if i>=100:
            # 	lambda_1 = 1.
            if FLAGS.oriented == 'term' and fscore_1 > best_1:
                saver.save(sess, checkpoint_dir + 'model.ckpt', global_step=i)
                best_1 = fscore_1
                print('\n', fscore_1)
            elif FLAGS.oriented == 'category' and fscore_2 > best_2:
                saver.save(sess, checkpoint_dir + 'model.ckpt', global_step=i)
                best_2 = fscore_2
                print('\n', fscore_2)
            # print("\nfscore_1: ", fscore_1, "fscore_2: ", fscore_2)
            # break
            train_loss.append(loss)
            val_score.append([fscore_1, fscore_2])

        np.savetxt(FLAGS.output + train_loss_filename, train_loss, fmt='%.5f')
        np.savetxt(FLAGS.output + val_loss_filename, val_score, fmt='%.5f')