提交 9f27a5ca 编写于 作者: L lilu 提交者: Yibing Liu

test=develop (#2314)

上级 d47e15e0
...@@ -6,15 +6,16 @@ import sys ...@@ -6,15 +6,16 @@ import sys
import numpy as np import numpy as np
import pandas as pd import pandas as pd
def get_p_at_n_in_m(data, n, m, ind): def get_p_at_n_in_m(data, n, m, ind):
""" """
Get n in m Get n in m
""" """
pos_score = data[ind][0] pos_score = data[ind][0]
curr = data[ind : ind+m] curr = data[ind:ind + m]
curr = sorted(curr, key = lambda x: x[0], reverse=True) curr = sorted(curr, key=lambda x: x[0], reverse=True)
if curr[n-1][0] <= pos_score: if curr[n - 1][0] <= pos_score:
return 1 return 1
return 0 return 0
...@@ -28,9 +29,10 @@ def evaluate_Recall(data): ...@@ -28,9 +29,10 @@ def evaluate_Recall(data):
p_at_2_in_10 = 0.0 p_at_2_in_10 = 0.0
p_at_5_in_10 = 0.0 p_at_5_in_10 = 0.0
length = len(data) / 10 length = len(data) // 10
print('length=%s' % length)
for i in xrange(0, length): for i in range(0, length):
ind = i * 10 ind = i * 10
assert data[ind][1] == 1 assert data[ind][1] == 1
...@@ -43,7 +45,8 @@ def evaluate_Recall(data): ...@@ -43,7 +45,8 @@ def evaluate_Recall(data):
'1_in_2': p_at_1_in_2 / length, '1_in_2': p_at_1_in_2 / length,
'1_in_10': p_at_1_in_10 / length, '1_in_10': p_at_1_in_10 / length,
'2_in_10': p_at_2_in_10 / length, '2_in_10': p_at_2_in_10 / length,
'5_in_10': p_at_5_in_10 / length} '5_in_10': p_at_5_in_10 / length
}
return recall_dict return recall_dict
......
...@@ -26,9 +26,8 @@ import copy ...@@ -26,9 +26,8 @@ import copy
import numpy as np import numpy as np
import paddle.fluid as fluid import paddle.fluid as fluid
def init_pretraining_params(exe,
pretraining_params_path, def init_pretraining_params(exe, pretraining_params_path, main_program):
main_program):
""" """
Init pretraining params Init pretraining params
""" """
...@@ -50,4 +49,3 @@ def init_pretraining_params(exe, ...@@ -50,4 +49,3 @@ def init_pretraining_params(exe,
predicate=existed_params) predicate=existed_params)
print("Load pretraining parameters from {}.".format( print("Load pretraining parameters from {}.".format(
pretraining_params_path)) pretraining_params_path))
...@@ -23,6 +23,7 @@ sys.path.append('../../models/dialogue_model_toolkit/auto_dialogue_evaluation/') ...@@ -23,6 +23,7 @@ sys.path.append('../../models/dialogue_model_toolkit/auto_dialogue_evaluation/')
from net import Network from net import Network
import config import config
def train(args): def train(args):
"""Train """Train
""" """
...@@ -45,8 +46,7 @@ def train(args): ...@@ -45,8 +46,7 @@ def train(args):
fluid.clip.set_gradient_clip(clip=fluid.clip.GradientClipByValue( fluid.clip.set_gradient_clip(clip=fluid.clip.GradientClipByValue(
max=1.0, min=-1.0)) max=1.0, min=-1.0))
optimizer = fluid.optimizer.Adam( optimizer = fluid.optimizer.Adam(learning_rate=args.learning_rate)
learning_rate=args.learning_rate)
optimizer.minimize(loss) optimizer.minimize(loss)
print("begin memory optimization ...") print("begin memory optimization ...")
fluid.memory_optimize(train_program) fluid.memory_optimize(train_program)
...@@ -73,8 +73,7 @@ def train(args): ...@@ -73,8 +73,7 @@ def train(args):
print("device count %d" % dev_count) print("device count %d" % dev_count)
print("theoretical memory usage: ") print("theoretical memory usage: ")
print( print(fluid.contrib.memory_usage(
fluid.contrib.memory_usage(
program=train_program, batch_size=args.batch_size)) program=train_program, batch_size=args.batch_size))
exe = fluid.Executor(place) exe = fluid.Executor(place)
...@@ -127,15 +126,15 @@ def train(args): ...@@ -127,15 +126,15 @@ def train(args):
""" """
Evaluate to choose model Evaluate to choose model
""" """
val_batches = reader.batch_reader( val_batches = reader.batch_reader(args.val_path, args.batch_size, place,
args.val_path, args.batch_size, place, args.max_len, 1) args.max_len, 1)
scores = [] scores = []
labels = [] labels = []
for batch in val_batches: for batch in val_batches:
scores.extend(test_with_feed(batch)) scores.extend(test_with_feed(batch))
labels.extend([x[0] for x in batch[2]]) labels.extend([x[0] for x in batch[2]])
return eva.evaluate_Recall(zip(scores, labels)) return eva.evaluate_Recall(list(zip(scores, labels)))
def save_exe(step, best_recall): def save_exe(step, best_recall):
""" """
...@@ -143,17 +142,21 @@ def train(args): ...@@ -143,17 +142,21 @@ def train(args):
""" """
recall_dict = evaluate() recall_dict = evaluate()
print('evaluation recall result:') print('evaluation recall result:')
print('1_in_2: %s\t1_in_10: %s\t2_in_10: %s\t5_in_10: %s' % ( print('1_in_2: %s\t1_in_10: %s\t2_in_10: %s\t5_in_10: %s' %
recall_dict['1_in_2'], recall_dict['1_in_10'], (recall_dict['1_in_2'], recall_dict['1_in_10'],
recall_dict['2_in_10'], recall_dict['5_in_10'])) recall_dict['2_in_10'], recall_dict['5_in_10']))
if recall_dict['1_in_10'] > best_recall and step != 0: if recall_dict['1_in_10'] > best_recall and step != 0:
fluid.io.save_inference_model(args.save_path, fluid.io.save_inference_model(
args.save_path,
net.get_feed_inference_names(), net.get_feed_inference_names(),
logits, exe, main_program=train_program) logits,
exe,
main_program=train_program)
print("Save model at step %d ... " % step) print("Save model at step %d ... " % step)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) print(time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime(time.time())))
best_recall = recall_dict['1_in_10'] best_recall = recall_dict['1_in_10']
return best_recall return best_recall
...@@ -161,15 +164,16 @@ def train(args): ...@@ -161,15 +164,16 @@ def train(args):
global_step, train_time = 0, 0.0 global_step, train_time = 0, 0.0
best_recall = 0 best_recall = 0
for epoch in six.moves.xrange(args.num_scan_data): for epoch in six.moves.xrange(args.num_scan_data):
train_batches = reader.batch_reader( train_batches = reader.batch_reader(args.train_path, args.batch_size,
args.train_path, args.batch_size, place, place, args.max_len,
args.max_len, args.sample_pro) args.sample_pro)
begin_time = time.time() begin_time = time.time()
sum_cost = 0 sum_cost = 0
ce_cost = 0 ce_cost = 0
for batch in train_batches: for batch in train_batches:
if (args.save_path is not None) and (global_step % args.save_step == 0): if (args.save_path is not None) and (
global_step % args.save_step == 0):
best_recall = save_exe(global_step, best_recall) best_recall = save_exe(global_step, best_recall)
cost = train_with_feed(batch) cost = train_with_feed(batch)
...@@ -178,7 +182,8 @@ def train(args): ...@@ -178,7 +182,8 @@ def train(args):
ce_cost = cost.mean() ce_cost = cost.mean()
if global_step % args.print_step == 0: if global_step % args.print_step == 0:
print('training step %s avg loss %s' % (global_step, sum_cost / args.print_step)) print('training step %s avg loss %s' %
(global_step, sum_cost / args.print_step))
sum_cost = 0 sum_cost = 0
pass_time_cost = time.time() - begin_time pass_time_cost = time.time() - begin_time
...@@ -187,7 +192,8 @@ def train(args): ...@@ -187,7 +192,8 @@ def train(args):
.format(epoch, "%2.2f sec" % pass_time_cost)) .format(epoch, "%2.2f sec" % pass_time_cost))
if "CE_MODE_X" in os.environ and epoch == args.num_scan_data - 1: if "CE_MODE_X" in os.environ and epoch == args.num_scan_data - 1:
card_num = get_cards() card_num = get_cards()
print("kpis\ttrain_duration_card%s\t%s" % (card_num, pass_time_cost)) print("kpis\ttrain_duration_card%s\t%s" %
(card_num, pass_time_cost))
print("kpis\ttrain_loss_card%s\t%s" % (card_num, ce_cost)) print("kpis\ttrain_loss_card%s\t%s" % (card_num, ce_cost))
...@@ -246,8 +252,7 @@ def finetune(args): ...@@ -246,8 +252,7 @@ def finetune(args):
print("device count %d" % dev_count) print("device count %d" % dev_count)
print("theoretical memory usage: ") print("theoretical memory usage: ")
print( print(fluid.contrib.memory_usage(
fluid.contrib.memory_usage(
program=train_program, batch_size=args.batch_size)) program=train_program, batch_size=args.batch_size))
exe = fluid.Executor(place) exe = fluid.Executor(place)
...@@ -264,9 +269,7 @@ def finetune(args): ...@@ -264,9 +269,7 @@ def finetune(args):
if args.init_model: if args.init_model:
init.init_pretraining_params( init.init_pretraining_params(
exe, exe, args.init_model, main_program=train_startup)
args.init_model,
main_program=train_startup)
print('sccuess init %s' % args.init_model) print('sccuess init %s' % args.init_model)
print("start loading data ...") print("start loading data ...")
...@@ -294,8 +297,8 @@ def finetune(args): ...@@ -294,8 +297,8 @@ def finetune(args):
""" """
Evaluate to choose model Evaluate to choose model
""" """
val_batches = reader.batch_reader( val_batches = reader.batch_reader(args.val_path, args.batch_size, place,
args.val_path, args.batch_size, place, args.max_len, 1) args.max_len, 1)
scores = [] scores = []
labels = [] labels = []
for batch in val_batches: for batch in val_batches:
...@@ -311,11 +314,15 @@ def finetune(args): ...@@ -311,11 +314,15 @@ def finetune(args):
cor = evaluate() cor = evaluate()
print('evaluation cor relevance %s' % cor) print('evaluation cor relevance %s' % cor)
if cor > best_cor and step != 0: if cor > best_cor and step != 0:
fluid.io.save_inference_model(args.save_path, fluid.io.save_inference_model(
net.get_feed_inference_names(), logits, args.save_path,
exe, main_program=train_program) net.get_feed_inference_names(),
logits,
exe,
main_program=train_program)
print("Save model at step %d ... " % step) print("Save model at step %d ... " % step)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) print(time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime(time.time())))
best_cor = cor best_cor = cor
return best_cor return best_cor
...@@ -324,15 +331,15 @@ def finetune(args): ...@@ -324,15 +331,15 @@ def finetune(args):
best_cor = 0.0 best_cor = 0.0
pre_index = -1 pre_index = -1
for epoch in six.moves.xrange(args.num_scan_data): for epoch in six.moves.xrange(args.num_scan_data):
train_batches = reader.batch_reader( train_batches = reader.batch_reader(args.train_path, args.batch_size,
args.train_path, place, args.max_len,
args.batch_size, place, args.sample_pro)
args.max_len, args.sample_pro)
begin_time = time.time() begin_time = time.time()
sum_cost = 0 sum_cost = 0
for batch in train_batches: for batch in train_batches:
if (args.save_path is not None) and (global_step % args.save_step == 0): if (args.save_path is not None) and (
global_step % args.save_step == 0):
best_cor = save_exe(global_step, best_cor) best_cor = save_exe(global_step, best_cor)
cost = train_with_feed(batch) cost = train_with_feed(batch)
...@@ -340,7 +347,8 @@ def finetune(args): ...@@ -340,7 +347,8 @@ def finetune(args):
sum_cost += cost.mean() sum_cost += cost.mean()
if global_step % args.print_step == 0: if global_step % args.print_step == 0:
print('training step %s avg loss %s' % (global_step, sum_cost / args.print_step)) print('training step %s avg loss %s' %
(global_step, sum_cost / args.print_step))
sum_cost = 0 sum_cost = 0
pass_time_cost = time.time() - begin_time pass_time_cost = time.time() - begin_time
...@@ -361,36 +369,38 @@ def evaluate(args): ...@@ -361,36 +369,38 @@ def evaluate(args):
with fluid.scope_guard(fluid.Scope()): with fluid.scope_guard(fluid.Scope()):
infer_program, feed_target_names, fetch_vars = fluid.io.load_inference_model( infer_program, feed_target_names, fetch_vars = fluid.io.load_inference_model(
args.init_model, exe) args.init_model, exe)
print('init model %s' % args.init_model)
global_step, infer_time = 0, 0.0 global_step, infer_time = 0, 0.0
test_batches = reader.batch_reader( test_batches = reader.batch_reader(args.test_path, args.batch_size,
args.test_path, args.batch_size, place, place, args.max_len, 1)
args.max_len, 1)
scores = [] scores = []
labels = [] labels = []
for batch in test_batches: for batch in test_batches:
logits = exe.run( logits = exe.run(infer_program,
infer_program, feed={
feed = {
'context_wordseq': batch[0], 'context_wordseq': batch[0],
'response_wordseq': batch[1]}, 'response_wordseq': batch[1]
fetch_list = fetch_vars) },
fetch_list=fetch_vars)
logits = [x[0] for x in logits[0]] logits = [x[0] for x in logits[0]]
scores.extend(logits) scores.extend(logits)
labels.extend([x[0] for x in batch[2]]) labels.extend([x[0] for x in batch[2]])
mean_score = sum(scores)/len(scores) print('len scores: %s len labels: %s' % (len(scores), len(labels)))
mean_score = sum(scores) / len(scores)
if args.loss_type == 'CLS': if args.loss_type == 'CLS':
recall_dict = eva.evaluate_Recall(zip(scores, labels)) recall_dict = eva.evaluate_Recall(list(zip(scores, labels)))
print('mean score: %s' % mean_score) print('mean score: %s' % mean_score)
print('evaluation recall result:') print('evaluation recall result:')
print('1_in_2: %s\t1_in_10: %s\t2_in_10: %s\t5_in_10: %s' % ( print('1_in_2: %s\t1_in_10: %s\t2_in_10: %s\t5_in_10: %s' %
recall_dict['1_in_2'], recall_dict['1_in_10'], (recall_dict['1_in_2'], recall_dict['1_in_10'],
recall_dict['2_in_10'], recall_dict['5_in_10'])) recall_dict['2_in_10'], recall_dict['5_in_10']))
elif args.loss_type == 'L2': elif args.loss_type == 'L2':
cor = eva.evaluate_cor(scores, labels) cor = eva.evaluate_cor(scores, labels)
print('mean score: %s\nevaluation cor resuls:%s' % (mean_score, cor)) print('mean score: %s\nevaluation cor resuls:%s' %
(mean_score, cor))
else: else:
raise ValueError raise ValueError
...@@ -413,17 +423,16 @@ def infer(args): ...@@ -413,17 +423,16 @@ def infer(args):
args.init_model, exe) args.init_model, exe)
global_step, infer_time = 0, 0.0 global_step, infer_time = 0, 0.0
test_batches = reader.batch_reader( test_batches = reader.batch_reader(args.test_path, args.batch_size,
args.test_path, args.batch_size, place, place, args.max_len, 1)
args.max_len, 1)
scores = [] scores = []
for batch in test_batches: for batch in test_batches:
logits = exe.run( logits = exe.run(infer_program,
infer_program, feed={
feed = {
'context_wordseq': batch[0], 'context_wordseq': batch[0],
'response_wordseq': batch[1]}, 'response_wordseq': batch[1]
fetch_list = fetch_vars) },
fetch_list=fetch_vars)
logits = [x[0] for x in logits[0]] logits = [x[0] for x in logits[0]]
scores.extend(logits) scores.extend(logits)
...@@ -471,5 +480,6 @@ def main(): ...@@ -471,5 +480,6 @@ def main():
else: else:
raise ValueError raise ValueError
if __name__ == '__main__': if __name__ == '__main__':
main() main()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册