Ejemplo n.º 1
0
def generate_gan(sess, model, loss_type="pair", negative_size=3):
    samples = []
    for _index, pair in enumerate(raw):
        if _index % 100 == 0:
            print("have sampled %d pairs" % _index)
        q = pair[2]
        a = pair[3]

        neg_alist_index = [i for i in range(len(alist))]
        neg_alist_index.remove(_index)  # remove the positive index
        sampled_index = np.random.choice(neg_alist_index, size=[FLAGS.pools_size], replace=False)
        pools = np.array(alist)[sampled_index]

        canditates = insurance_qa_data_helpers.loadCandidateSamples(q, a, pools, vocab)
        predicteds = []
        for batch in insurance_qa_data_helpers.batch_iter(canditates, batch_size=FLAGS.batch_size):
            feed_dict = {model.input_x_1: batch[:, 0], model.input_x_2: batch[:, 1], model.input_x_3: batch[:, 2]}
            predicted = sess.run(model.gan_score, feed_dict)
            predicteds.extend(predicted)

        # index=np.argmax(predicteds)
        # samples.append([encode_sent(vocab,item, FLAGS.max_sequence_length) for item in [q,a,pools[index]]])
        exp_rating = np.exp(np.array(predicteds) * FLAGS.sampled_temperature * 1.5)
        prob = exp_rating / np.sum(exp_rating)
        neg_samples = np.random.choice(pools, size=negative_size, p=prob, replace=False)
        for neg in neg_samples:
            samples.append([encode_sent(vocab, item, FLAGS.max_sequence_length) for item in [q, a, neg]])
    return samples
Ejemplo n.º 2
0
def main():
    with tf.Graph().as_default():
        with tf.device("/gpu:0"):
            session_conf = tf.ConfigProto(
                allow_soft_placement=FLAGS.allow_soft_placement,
                log_device_placement=FLAGS.log_device_placement)
            sess = tf.Session(config=session_conf)
            with sess.as_default(), open(precision, "w") as log:
                # DIS_MODEL_FILE="model/Discriminator20170107122042.model"
                # param = pickle.load(open(DIS_MODEL_FILE))
                # print( param)
                param = None
                DIS_MODEL_FILE = "model/pre-trained.model"
                param = pickle.load(open(DIS_MODEL_FILE, "rb"))
                discriminator = Discriminator.Discriminator(
                    sequence_length=FLAGS.max_sequence_length,
                    batch_size=FLAGS.batch_size,
                    vocab_size=len(vocab),
                    embedding_size=FLAGS.embedding_dim,
                    filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
                    num_filters=FLAGS.num_filters,
                    learning_rate=FLAGS.learning_rate,
                    l2_reg_lambda=FLAGS.l2_reg_lambda,
                    embeddings=None,
                    paras=param,
                    loss="pair")

                saver = tf.train.Saver()
                sess.run(tf.global_variables_initializer())
                # evaluation(sess,discriminator,log,0)

                for i in range(FLAGS.num_epochs):
                    # x1,x2,x3=generate_dns(sess,discriminator)
                    # samples=generate_dns(sess,discriminator)#generate_uniform_pair() #generate_dns(sess,discriminator) #generate_uniform() #
                    samples = generate_dns_pair(
                        sess, discriminator
                    )  #generate_uniform() # generate_uniform_pair() #
                    for j in range(1):
                        for batch in insurance_qa_data_helpers.batch_iter(
                                samples,
                                batch_size=FLAGS.batch_size,
                                num_epochs=1,
                                shuffle=True):  # try:

                            feed_dict = {
                                discriminator.input_x_1: batch[:, 0],
                                discriminator.input_x_2: batch[:, 1],
                                discriminator.input_x_3: batch[:, 2],
                            }

                            _, step, current_loss, accuracy = sess.run([
                                discriminator.train_op,
                                discriminator.global_step, discriminator.loss,
                                discriminator.accuracy
                            ], feed_dict)
                            time_str = datetime.datetime.now().isoformat()
                            print(("%s: DIS step %d, loss %f with acc %f " %
                                   (time_str, step, current_loss, accuracy)))

                        evaluation(sess, discriminator, log, i)
Ejemplo n.º 3
0
def generate_dns_pair(sess, model):
    samples = []
    for _index, pair in enumerate(raw):
        if _index % 100 == 0:
            print("have sampled %d pairs" % _index)
        q = pair[2]
        a = pair[3]

        pools = np.random.choice(alist, size=[FLAGS.pools_size])

        canditates = insurance_qa_data_helpers.loadCandidateSamples(
            q, a, pools, vocab)
        predicteds = []
        for batch in insurance_qa_data_helpers.batch_iter(
                canditates, batch_size=FLAGS.batch_size):
            feed_dict = {
                model.input_x_1: batch[:, 0],
                model.input_x_2: batch[:, 1],
                model.input_x_3: batch[:, 2]
            }
            predicted = sess.run(model.score13, feed_dict)
            predicteds.extend(predicted)
        index = np.argmax(predicteds)
        samples.append([
            encode_sent(vocab, item, FLAGS.max_sequence_length)
            for item in [q, a, pools[index]]
        ])

    return samples
Ejemplo n.º 4
0
def generate_dns_pair(sess, model):
    samples = []
    for _index, pair in enumerate(raw):

        #ループ内は1組のqaについて扱う
        if _index % 100 == 0:
            print("have sampled %d pairs" % _index)
        q = pair[2]
        a = pair[3]

        pools = np.random.choice(alist, size=[FLAGS.pools_size])
        #1qaペアにつき、プールサイズ(100)分のneg
        canditates = insurance_qa_data_helpers.loadCandidateSamples(
            q, a, pools, vocab)
        predicteds = []

        for batch in insurance_qa_data_helpers.batch_iter(
                canditates, batch_size=FLAGS.batch_size):
            #batchサイズ(100)分: (q,a,neg1),...,(q,a,negバッチサイズ)
            #batch[:,0]にはバッチサイズ分のq、batch[:,1]はa、batch[:.2]はneg。
            feed_dict = {
                model.input_x_1: batch[:, 0],
                model.input_x_2: batch[:, 1],
                model.input_x_3: batch[:, 2]
            }
            predicted = sess.run(model.score13, feed_dict)  #score13はcos(q,neg)
            predicteds.extend(predicted)
        index = np.argmax(predicteds)
        samples.append([
            encode_sent(vocab, item, FLAGS.max_sequence_length)
            for item in [q, a, pools[index]]
        ])

    return samples
Ejemplo n.º 5
0
def generate_gan(sess, model, raw_loop, alist_loop, loss_type="pair",negative_size=3):
	samples=[]
	for _index ,pair in enumerate (raw_loop):
		if _index %100==0:
			print( "have sampled %d pairs" % _index)
		q=pair[0]
		a=pair[1]


		neg_alist_index=[i for i in range(len(alist_loop))]
		neg_alist_index.remove(_index)                 #remove the positive index

		simq = []
		head = _index - 1
		while head >= 0 and raw_loop[head][0] == q:
			simq.append(raw_loop[head][1])
			neg_alist_index.remove(head)
			head -= 1

		tail = _index + 1
		while tail < len(raw_loop) and raw_loop[tail][0] == q:
			simq.append(raw_loop[tail][1])
			neg_alist_index.remove(tail)
			tail += 1

		while head >= 0 and raw_loop[head][1] in simq:
			neg_alist_index.remove(head)
			head -= 1

		while tail < len(raw_loop) and raw_loop[tail][1] in simq:
			neg_alist_index.remove(tail)
			tail += 1

		sampled_index=np.random.choice(neg_alist_index,size=[FLAGS.pools_size],replace= False)
		pools=np.array(alist_loop)[sampled_index]

		canditates=insurance_qa_data_helpers.loadCandidateSamples(q,a,pools)
		predicteds=[]
		for batch in insurance_qa_data_helpers.batch_iter(canditates,batch_size=FLAGS.batch_size):							
			feed_dict = {model.input_x_1: batch[:,0],model.input_x_2: batch[:,1],model.input_x_3: batch[:,2]}			
			predicted=sess.run(model.gan_score,feed_dict)
			predicteds.extend(predicted)

		# index=np.argmax(predicteds)
		# samples.append([encode_sent(vocab,item, FLAGS.max_sequence_length) for item in [q,a,pools[index]]])
		exp_rating = np.exp(np.array(predicteds)*FLAGS.sampled_temperature*1.5)
		prob = exp_rating / np.sum(exp_rating)
		neg_samples_index = np.random.choice(np.arange(len(pools)), size= negative_size,p=prob,replace=False)
		for neg in neg_samples_index:
			samples.append([q, a, pools[neg]])
	return samples
Ejemplo n.º 6
0
def main():
    with tf.Graph().as_default():
        with tf.device("/cpu:0"):
            session_conf = tf.ConfigProto(
                allow_soft_placement=FLAGS.allow_soft_placement,
                log_device_placement=FLAGS.log_device_placement)
            sess = tf.Session(config=session_conf)

            with sess.as_default(), open(log_precision, "w") as log, open(
                    loss_precision, "w") as loss_log:
                DIS_MODEL_FILE = "/home/haojianyong/file_1/irgan-master/Question-Answer/model/pre-trained.model"  # overfitted DNS
                param = pickle.load(open(DIS_MODEL_FILE, "rb"))
                loss_type = "pair"
                discriminator = Discriminator.Discriminator(
                    sequence_length=FLAGS.max_sequence_length,
                    batch_size=FLAGS.batch_size,
                    vocab_size=len(vocab),
                    embedding_size=FLAGS.embedding_dim,
                    filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
                    num_filters=FLAGS.num_filters,
                    learning_rate=FLAGS.learning_rate,
                    l2_reg_lambda=FLAGS.l2_reg_lambda,
                    # embeddings=embeddings,
                    embeddings=None,
                    paras=param,
                    loss=loss_type)

                generator = Generator.Generator(
                    sequence_length=FLAGS.max_sequence_length,
                    batch_size=FLAGS.batch_size,
                    vocab_size=len(vocab),
                    embedding_size=FLAGS.embedding_dim,
                    filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
                    num_filters=FLAGS.num_filters,
                    learning_rate=FLAGS.learning_rate * 0.1,
                    l2_reg_lambda=FLAGS.l2_reg_lambda,
                    # embeddings=embeddings,
                    embeddings=None,
                    paras=param,
                    loss=loss_type)

                sess.run(tf.global_variables_initializer())
                # evaluation(sess,discriminator,log,0)
                for i in range(FLAGS.num_epochs):
                    if i > 0:
                        samples = generate_gan(sess, generator)
                        # for j in range(FLAGS.d_epochs_num):
                        for _index, batch in enumerate(
                                insurance_qa_data_helpers.batch_iter(
                                    samples,
                                    num_epochs=FLAGS.d_epochs_num,
                                    batch_size=FLAGS.batch_size,
                                    shuffle=True)):  # try:

                            feed_dict = {
                                discriminator.input_x_1: batch[:, 0],
                                discriminator.input_x_2: batch[:, 1],
                                discriminator.input_x_3: batch[:, 2]
                            }
                            _, step, current_loss, accuracy = sess.run([
                                discriminator.train_op,
                                discriminator.global_step, discriminator.loss,
                                discriminator.accuracy
                            ], feed_dict)

                            line = ("%s: DIS step %d, loss %f with acc %f " %
                                    (datetime.datetime.now().isoformat(), step,
                                     current_loss, accuracy))
                            if _index % 10 == 0:
                                print(line)
                            loss_log.write(line + "\n")
                            loss_log.flush()

                        evaluation(sess, discriminator, log, i)

                    for g_epoch in range(FLAGS.g_epochs_num):  ## 1
                        print("start generator...")
                        loss_log.write("QA pairs have " + str(len(raw)) + "\n")
                        for _index, pair in enumerate(raw):
                            q = pair[2]
                            a = pair[3]

                            neg_alist_index = [
                                item for item in range(len(alist))
                            ]  ## [0,1,2,3,...,18540-1]
                            sampled_index = np.random.choice(
                                neg_alist_index,
                                size=[FLAGS.pools_size - 1],
                                replace=False)  ## choose negative examples: 99
                            sampled_index = list(sampled_index)
                            sampled_index.append(_index)
                            pools = np.array(
                                alist
                            )[sampled_index]  # 随机选取alist中的99个语句,同时包含了自己的后一个match语句, 作为候选语句
                            samples = insurance_qa_data_helpers.loadCandidateSamples(
                                q, a, pools,
                                vocab)  # 同上:1+99=100, [q,a,candidate], 编码转换为向量

                            ## 1
                            predicteds = []
                            for batch in insurance_qa_data_helpers.batch_iter(
                                    samples, batch_size=FLAGS.batch_size):
                                feed_dict = {
                                    generator.input_x_1: batch[:, 0],
                                    generator.input_x_2: batch[:, 1],
                                    generator.input_x_3: batch[:, 2]
                                }
                                predicted = sess.run(generator.gan_score,
                                                     feed_dict)
                                predicteds.extend(predicted)
                            exp_rating = np.exp(
                                np.array(predicteds) *
                                FLAGS.sampled_temperature)
                            prob = exp_rating / np.sum(exp_rating)

                            ## 2
                            neg_index = np.random.choice(
                                np.arange(len(pools)),
                                size=FLAGS.gan_k,
                                p=prob,
                                replace=False
                            )  # 在100个例子中按照prob生成 FLAGS.gan_k个负例
                            subsamples = np.array(
                                insurance_qa_data_helpers.loadCandidateSamples(
                                    q, a, pools[neg_index], vocab))

                            feed_dict = {
                                discriminator.input_x_1: subsamples[:, 0],
                                discriminator.input_x_2: subsamples[:, 1],
                                discriminator.input_x_3: subsamples[:, 2]
                            }
                            reward = sess.run(
                                discriminator.reward, feed_dict
                            )  # reward= 2 * (tf.sigmoid( score_13 ) - 0.5)

                            ## 3
                            samples = np.array(samples)
                            feed_dict = {
                                generator.input_x_1: samples[:, 0],
                                generator.input_x_2: samples[:, 1],
                                generator.neg_index: neg_index,
                                generator.input_x_3: samples[:, 2],
                                generator.reward: reward
                            }
                            _, step, current_loss, positive, negative = sess.run(  # 应该是全集上的softmax	但是此处做全集的softmax开销太大了
                                [
                                    generator.gan_updates,
                                    generator.global_step, generator.gan_loss,
                                    generator.positive, generator.negative
                                ],  # self.prob= tf.nn.softmax(self.cos_13)
                                feed_dict
                            )  # self.gan_loss = -tf.reduce_mean(tf.log(self.prob) * self.reward)

                            line = (
                                "%s: GEN step %d, loss %f  positive %f negative %f"
                                % (datetime.datetime.now().isoformat(), step,
                                   current_loss, positive, negative))
                            if _index % 100 == 0:
                                print(line)
                            loss_log.write(line + "\n")
                            loss_log.flush()

                        evaluation(sess, generator, log,
                                   i * FLAGS.g_epochs_num + g_epoch)
                        log.flush()
Ejemplo n.º 7
0
def main():
    with tf.Graph().as_default():
        with tf.device("/gpu"):
            session_conf = tf.ConfigProto(allow_soft_placement=FLAGS.allow_soft_placement,
                                          log_device_placement=FLAGS.log_device_placement)
            sess = tf.Session(config=session_conf)

            with sess.as_default(), open(log_precision, "w") as log, open(loss_precision, "w") as loss_log:

                DIS_MODEL_FILE = "model/pre-trained.model"  # overfitted DNS
                # param = pickle.load(open(DIS_MODEL_FILE,"rb"))

                param = None  # 不加载参数
                loss_type = "pair"
                discriminator = Discriminator.Discriminator(
                    sequence_length=FLAGS.max_sequence_length,
                    batch_size=FLAGS.batch_size,
                    vocab_size=len(vocab),
                    embedding_size=FLAGS.embedding_dim,
                    filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
                    num_filters=FLAGS.num_filters,
                    learning_rate=FLAGS.learning_rate,
                    l2_reg_lambda=FLAGS.l2_reg_lambda,
                    # embeddings=embeddings,
                    embeddings=None,
                    paras=param,
                    loss=loss_type)

                generator = Generator.Generator(
                    sequence_length=FLAGS.max_sequence_length,
                    batch_size=FLAGS.batch_size,
                    vocab_size=len(vocab),
                    embedding_size=FLAGS.embedding_dim,
                    filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
                    num_filters=FLAGS.num_filters,
                    learning_rate=FLAGS.learning_rate * 0.1,
                    l2_reg_lambda=FLAGS.l2_reg_lambda,
                    # embeddings=embeddings,
                    embeddings=None,
                    paras=param,
                    loss=loss_type)

                sess.run(tf.global_variables_initializer())
                # evaluation(sess,discriminator,log,0)
                for i in range(FLAGS.num_epochs):
                    if i > 0:
                        samples = generate_gan(sess, generator)
                        # for j in range(FLAGS.d_epochs_num):
                        for _index, batch in enumerate(
                                insurance_qa_data_helpers.batch_iter(samples, num_epochs=FLAGS.d_epochs_num,
                                                                     batch_size=FLAGS.batch_size,
                                                                     shuffle=True)):  # try:

                            feed_dict = {discriminator.input_x_1: batch[:, 0], discriminator.input_x_2: batch[:, 1],
                                         discriminator.input_x_3: batch[:, 2]}
                            _, step, current_loss, accuracy = sess.run(
                                [discriminator.train_op, discriminator.global_step, discriminator.loss,
                                 discriminator.accuracy],
                                feed_dict)

                            line = ("%s: DIS step %d, loss %f with acc %f " % (
                            datetime.datetime.now().isoformat(), step, current_loss, accuracy))
                            if _index % 10 == 0:
                                print(line)
                            loss_log.write(line + "\n")
                            loss_log.flush()

                        evaluation(sess, discriminator, log, i)

                    for g_epoch in range(FLAGS.g_epochs_num):
                        for _index, pair in enumerate(raw):

                            q = pair[2]
                            a = pair[3]

                            neg_alist_index = [item for item in range(len(alist))]  # 答案列表
                            # 随机选择 100-1=99个index
                            sampled_index = np.random.choice(neg_alist_index, size=[FLAGS.pools_size - 1],
                                                             replace=False)
                            sampled_index = list(sampled_index)
                            sampled_index.append(_index) # 添加凑齐100个
                            pools = np.array(alist)[sampled_index] # 按照sampled_index里面是索引从a_list里面选出answer
                            # 把文字形式转换成数字[[q,a,neg],[q,a,neg]......]
                            samples = insurance_qa_data_helpers.loadCandidateSamples(q, a, pools, vocab)
                            predicteds = []
                            for batch in insurance_qa_data_helpers.batch_iter(samples, batch_size=FLAGS.batch_size):
                                feed_dict = {generator.input_x_1: batch[:, 0], generator.input_x_2: batch[:, 1],
                                             generator.input_x_3: batch[:, 2]}

                                # 生成预测 # cosine(q,neg) - cosine(q,pos) 正常应该是负数
                                # 在QA中是排名cosine取最高的作为正确的。这里通过QA_CNN计算出Q_NEG - Q_POS的得分差值
                                predicted = sess.run(generator.gan_score, feed_dict)
                                predicteds.extend(predicted)

                            exp_rating = np.exp(np.array(predicteds) * FLAGS.sampled_temperature)
                            prob = exp_rating / np.sum(exp_rating)
                            # 回归后根据对应位置的概率,随机选择出一定的neg。 https://www.zhihu.com/question/23765351
                            neg_index = np.random.choice(np.arange(len(pools)), size=FLAGS.gan_k, p=prob,
                                                         replace=False)  # 生成 FLAGS.gan_k个负例
                            # 取出这些负样本就拿去给D判别 score12 = q_pos   score13 = q_neg
                            subsamples = np.array(
                                insurance_qa_data_helpers.loadCandidateSamples(q, a, pools[neg_index], vocab))
                            feed_dict = {discriminator.input_x_1: subsamples[:, 0],
                                         discriminator.input_x_2: subsamples[:, 1],
                                         discriminator.input_x_3: subsamples[:, 2]}
                            reward = sess.run(discriminator.reward,
                                              feed_dict)  # reward= 2 * (tf.sigmoid( 0.05- (q_pos -q_neg) ) - 0.5)

                            samples = np.array(samples)
                            feed_dict = {
                                generator.input_x_1: samples[:, 0],
                                generator.input_x_2: samples[:, 1],
                                generator.neg_index: neg_index,
                                generator.input_x_3: samples[:, 2],
                                generator.reward: reward
                            }
                            _, step, current_loss, positive, negative = sess.run(  # 应该是全集上的softmax	但是此处做全集的softmax开销太大了
                                [generator.gan_updates, generator.global_step, generator.gan_loss, generator.positive,
                                 generator.negative],  # self.prob= tf.nn.softmax( self.cos_13)
                                feed_dict)  # self.gan_loss = -tf.reduce_mean(tf.log(self.prob) * self.reward)

                            line = ("%s: GEN step %d, loss %f  positive %f negative %f" % (
                            datetime.datetime.now().isoformat(), step, current_loss, positive, negative))
                            if _index % 100 == 0:
                                print(line)
                            loss_log.write(line + "\n")
                            loss_log.flush()

                        evaluation(sess, generator, log, i * FLAGS.g_epochs_num + g_epoch)
                        log.flush()
Ejemplo n.º 8
0
def main():
	with tf.Graph().as_default():
		with tf.device("/gpu:1"):
			session_conf = tf.ConfigProto(allow_soft_placement=FLAGS.allow_soft_placement,log_device_placement=FLAGS.log_device_placement)
			sess = tf.Session(config=session_conf)

			with sess.as_default() ,open(log_precision,"w") as log,open(loss_precision,"w") as loss_log :
		
				param= None
				loss_type="pair"
				discriminator = Discriminator.Discriminator(
						sequence_length=FLAGS.max_sequence_length,
						batch_size=FLAGS.batch_size,
						vocab_size=FLAGS.vocab_size,
						embedding_size=FLAGS.embedding_dim,
						filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
						num_filters=FLAGS.num_filters,
						learning_rate=FLAGS.learning_rate,
						l2_reg_lambda=FLAGS.l2_reg_lambda,
						# embeddings=embeddings,
						embeddings=None,
						paras=param,
						loss=loss_type)

				generator = Generator.Generator(
						sequence_length=FLAGS.max_sequence_length,
						batch_size=FLAGS.batch_size,
						vocab_size=FLAGS.vocab_size,
						embedding_size=FLAGS.embedding_dim,
						filter_sizes=list(map(int, FLAGS.filter_sizes.split(","))),
						num_filters=FLAGS.num_filters,
						learning_rate=FLAGS.learning_rate*0.1,
						l2_reg_lambda=FLAGS.l2_reg_lambda,
						# embeddings=embeddings,
						embeddings=None,
						paras=param,
						loss=loss_type)

				timestamp = str(int(time.time()))
				out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs", FLAGS.model_name, timestamp))
				print("Writing to {}\n".format(out_dir))
				checkpoint_dir = os.path.abspath(os.path.join(out_dir, "checkpoints"))
				checkpoint_prefix = os.path.join(checkpoint_dir, "model")
				if not os.path.exists(checkpoint_dir):
					os.makedirs(checkpoint_dir)
				saver = tf.train.Saver(tf.global_variables(), max_to_keep=FLAGS.num_checkpoints)

				sess.run(tf.global_variables_initializer())
				# evaluation(sess,discriminator,log,0)
				num_round_per_epoch = int(math.ceil(len(raw)/FLAGS.data_every_round))
				for i in range(FLAGS.num_epochs):
					for loop in range(num_round_per_epoch):
						end_index = min((loop + 1) * FLAGS.data_every_round, len(raw))
						raw_loop = raw[end_index-FLAGS.data_every_round:end_index]
						alist_loop = alist[end_index-FLAGS.data_every_round:end_index]
						assert len(raw_loop) == len(alist_loop)

						if loop>0 or i>0:
							samples=generate_gan(sess,generator, raw_loop, alist_loop)
							# for j in range(FLAGS.d_epochs_num):
							for _index,batch in enumerate(insurance_qa_data_helpers.batch_iter(samples,num_epochs=FLAGS.d_epochs_num,batch_size=FLAGS.batch_size,shuffle=True)):	# try:

								feed_dict = {discriminator.input_x_1: batch[:,0],discriminator.input_x_2: batch[:,1],discriminator.input_x_3: batch[:,2]}
								_, step,	current_loss,accuracy = sess.run(
										[discriminator.train_op, discriminator.global_step, discriminator.loss,discriminator.accuracy],
										feed_dict)

								line=("%s: DIS step %d, loss %f with acc %f "%(datetime.datetime.now().isoformat(), step, current_loss,accuracy))
								if _index%10==0:
									print(line)
								loss_log.write(line+"\n")
								loss_log.flush()

							if loop != 0 and loop % 20 == 0:
								evaluation(sess,discriminator,log, dev_data, i)

						for g_epoch in range(FLAGS.g_epochs_num):
							for _index,pair in enumerate(raw_loop):

								q=pair[0]
								a=pair[1]

								neg_alist_index=[item for item in range(len(alist_loop))]
								neg_alist_index.remove(_index)  # remove the positive index

								simq = []
								head = _index - 1
								while head >= 0 and raw_loop[head][0] == q:
									simq.append(raw_loop[head][1])
									neg_alist_index.remove(head)
									head -= 1

								tail = _index + 1
								while tail < len(raw_loop) and raw_loop[tail][0] == q:
									simq.append(raw_loop[tail][1])
									neg_alist_index.remove(tail)
									tail += 1

								while head >= 0 and raw_loop[head][1] in simq:
									neg_alist_index.remove(head)
									head -= 1

								while tail < len(raw_loop) and raw_loop[tail][1] in simq:
									neg_alist_index.remove(tail)
									tail += 1

								sampled_index=np.random.choice(neg_alist_index,size=[FLAGS.pools_size-1],replace= False)
								sampled_index=list(sampled_index)
								sampled_index.append(_index)
								pools=np.array(alist_loop)[sampled_index]

								samples=insurance_qa_data_helpers.loadCandidateSamples(q,a,pools)
								predicteds=[]
								for batch in insurance_qa_data_helpers.batch_iter(samples,batch_size=FLAGS.batch_size):
									feed_dict = {generator.input_x_1: batch[:,0],generator.input_x_2: batch[:,1],generator.input_x_3: batch[:,2]}

									predicted=sess.run(generator.gan_score,feed_dict)
									predicteds.extend(predicted)

								exp_rating = np.exp(np.array(predicteds)*FLAGS.sampled_temperature)
								prob = exp_rating / np.sum(exp_rating)

								neg_index = np.random.choice(np.arange(len(pools)) , size=FLAGS.gan_k, p=prob ,replace=False)	# 生成 FLAGS.gan_k个负例

								subsamples=np.array(insurance_qa_data_helpers.loadCandidateSamples(q,a,pools[neg_index]))
								feed_dict = {discriminator.input_x_1: subsamples[:,0],discriminator.input_x_2: subsamples[:,1],discriminator.input_x_3: subsamples[:,2]}
								reward = sess.run(discriminator.reward,feed_dict)				 # reward= 2 * (tf.sigmoid( score_13 ) - 0.5)

								samples=np.array(samples)
								feed_dict = {
												generator.input_x_1: samples[:,0],
												generator.input_x_2: samples[:,1],
												generator.neg_index: neg_index,
												generator.input_x_3: samples[:,2],
												generator.reward: reward
											}
								_, step,	current_loss,positive,negative = sess.run(																					#应该是全集上的softmax	但是此处做全集的softmax开销太大了
										[generator.gan_updates, generator.global_step, generator.gan_loss, generator.positive,generator.negative],		 #	 self.prob= tf.nn.softmax( self.cos_13)
										feed_dict)																													#self.gan_loss = -tf.reduce_mean(tf.log(self.prob) * self.reward)

								line=("%s: Epoch %d, Loop %d, GEN step %d, loss %f  positive %f negative %f"%(datetime.datetime.now().isoformat(), i, loop, step, current_loss,positive,negative))
								if _index %10==0:
									print(line)
								loss_log.write(line+"\n")
								loss_log.flush()

							if loop != 0 and loop % 20 == 0:
								evaluation(sess,generator,log, dev_data, i*FLAGS.g_epochs_num + g_epoch)
							log.flush()

						path = saver.save(sess, checkpoint_prefix, global_step=generator.global_step)
						print("Saved model checkpoint to {}\n".format(path))
Ejemplo n.º 9
0
def main():
    with tf.Graph().as_default():
        with tf.device("/gpu:1"):
            session_conf = tf.ConfigProto(
                allow_soft_placement=FLAGS.allow_soft_placement,
                log_device_placement=FLAGS.log_device_placement)
            sess = tf.Session(config=session_conf)

            with sess.as_default(), open(log_precision, "w") as log, open(
                    loss_precision, "w") as loss_log:

                DIS_MODEL_FILE = "model/pre-trained.model"  # overfitted DNS
                #param = pickle.load(open(DIS_MODEL_FILE,"rb")) #add

                param = None  #add
                loss_type = "pair"

                with tf.name_scope('discriminator_setting') as scope:
                    discriminator = Discriminator.Discriminator(
                        sequence_length=FLAGS.max_sequence_length,
                        batch_size=FLAGS.batch_size,
                        vocab_size=len(vocab),
                        embedding_size=FLAGS.embedding_dim,
                        filter_sizes=list(
                            map(int, FLAGS.filter_sizes.split(","))),
                        num_filters=FLAGS.num_filters,
                        learning_rate=FLAGS.learning_rate,
                        l2_reg_lambda=FLAGS.l2_reg_lambda,
                        # embeddings=embeddings,
                        embeddings=None,
                        paras=param,
                        loss=loss_type)

                with tf.name_scope('generator_setting') as scope:
                    generator = Generator.Generator(
                        sequence_length=FLAGS.max_sequence_length,
                        batch_size=FLAGS.batch_size,
                        vocab_size=len(vocab),
                        embedding_size=FLAGS.embedding_dim,
                        filter_sizes=list(
                            map(int, FLAGS.filter_sizes.split(","))),
                        num_filters=FLAGS.num_filters,
                        learning_rate=FLAGS.learning_rate * 0.1,
                        l2_reg_lambda=FLAGS.l2_reg_lambda,
                        # embeddings=embeddings,
                        embeddings=None,
                        paras=param,
                        loss=loss_type)

                sess.run(tf.global_variables_initializer())
                tw = tf.summary.FileWriter("log_dir", graph=sess.graph)  #add
                # evaluation(sess,discriminator,log,0)

                with tf.name_scope('gan_training') as scope:
                    for i in range(FLAGS.num_epochs):
                        with tf.name_scope(
                                'discriminator_gan_training') as scope:
                            if i > 0:
                                samples = generate_gan(sess, generator)
                                # for j in range(FLAGS.d_epochs_num):
                                for _index, batch in enumerate(
                                        insurance_qa_data_helpers.batch_iter(
                                            samples,
                                            num_epochs=FLAGS.d_epochs_num,
                                            batch_size=FLAGS.batch_size,
                                            shuffle=True)):  # try:
                                    feed_dict = {
                                        discriminator.input_x_1: batch[:, 0],
                                        discriminator.input_x_2: batch[:, 1],
                                        discriminator.input_x_3: batch[:, 2]
                                    }

                                    _, step, current_loss, accuracy = sess.run(
                                        [
                                            discriminator.train_op,
                                            discriminator.global_step,
                                            discriminator.loss,
                                            discriminator.accuracy
                                        ], feed_dict)

                                    line = (
                                        "%s: DIS step %d, loss %f with acc %f "
                                        % (datetime.datetime.now().isoformat(),
                                           step, current_loss, accuracy))
                                    if _index % 10 == 0:
                                        print(line)
                                    loss_log.write(line + "\n")
                                    loss_log.flush()
                                evaluation(sess, discriminator, log, i)  #add

                        with tf.name_scope('generator_gan_training') as scope:
                            for g_epoch in range(FLAGS.g_epochs_num):
                                for _index, pair in enumerate(raw):

                                    q = pair[2]
                                    a = pair[3]

                                    neg_alist_index = [
                                        item for item in range(len(alist))
                                    ]
                                    sampled_index = np.random.choice(
                                        neg_alist_index,
                                        size=[FLAGS.pools_size - 1],
                                        replace=False)
                                    sampled_index = list(sampled_index)
                                    sampled_index.append(_index)
                                    pools = np.array(alist)[sampled_index]

                                    samples = insurance_qa_data_helpers.loadCandidateSamples(
                                        q, a, pools, vocab)
                                    predicteds = []
                                    for batch in insurance_qa_data_helpers.batch_iter(
                                            samples,
                                            batch_size=FLAGS.batch_size):
                                        feed_dict = {
                                            generator.input_x_1: batch[:, 0],
                                            generator.input_x_2: batch[:, 1],
                                            generator.input_x_3: batch[:, 2]
                                        }

                                        predicted = sess.run(
                                            generator.gan_score, feed_dict)
                                        predicteds.extend(predicted)

                                    exp_rating = np.exp(
                                        np.array(predicteds) *
                                        FLAGS.sampled_temperature)
                                    prob = exp_rating / np.sum(exp_rating)

                                    neg_index = np.random.choice(
                                        np.arange(len(pools)),
                                        size=FLAGS.gan_k,
                                        p=prob,
                                        replace=False)  # 生成 FLAGS.gan_k个负例

                                    subsamples = np.array(
                                        insurance_qa_data_helpers.
                                        loadCandidateSamples(
                                            q, a, pools[neg_index], vocab))
                                    feed_dict = {
                                        discriminator.input_x_1: subsamples[:,
                                                                            0],
                                        discriminator.input_x_2: subsamples[:,
                                                                            1],
                                        discriminator.input_x_3: subsamples[:,
                                                                            2]
                                    }
                                    reward = sess.run(
                                        discriminator.reward, feed_dict
                                    )  # reward= 2 * (tf.sigmoid( score_13 ) - 0.5)

                                    samples = np.array(samples)
                                    feed_dict = {
                                        generator.input_x_1: samples[:, 0],
                                        generator.input_x_2: samples[:, 1],
                                        generator.neg_index: neg_index,
                                        generator.input_x_3: samples[:, 2],
                                        generator.reward: reward
                                    }

                                    _, step, current_loss, positive, negative = sess.run(
                                        [
                                            generator.gan_updates,
                                            generator.global_step,
                                            generator.gan_loss,
                                            generator.positive,
                                            generator.negative
                                        ], feed_dict)
                                    #self.prob= tf.nn.softmax( self.cos_13)
                                    #self.gan_loss = -tf.reduce_mean(tf.log(self.prob) * self.reward)

                                    #tw = tf.summary.FileWriter("log_dir", graph=sess.graph) #add
                                    line = (
                                        "%s: GEN step %d, loss %f  positive %f negative %f"
                                        % (datetime.datetime.now().isoformat(),
                                           step, current_loss, positive,
                                           negative))
                                    if _index % 100 == 0:
                                        print(line)
                                    loss_log.write(line + "\n")
                                    loss_log.flush()
                                evaluation(sess, generator, log,
                                           i * FLAGS.g_epochs_num + g_epoch)
                                #evaluation(sess, generator, log, 2) #toy
                                log.flush()