def valid(sess, model): total_data = dataManager.train(True) acc_array = np.zeros((2), dtype=np.float32) count, total_loss, cnt = 0, 0., 0 document, candidates, ori_labels, ori_locs = [], [], [], [] acc_blank = np.zeros((2, 2), dtype=np.float32) for doc, can, lab, loc, _ in total_data: document.append(doc) candidates.append(can) ori_labels.append(lab) ori_locs.append(loc) cnt += 1 if cnt == FLAGS.batch_size * 2: document, doc_length, candidates, labels, locs, ori_labels, mask = \ prepare_batch_data(document, candidates, ori_labels, ori_locs) valid_result = model.train_step(sess, document, doc_length, candidates, labels, locs, mask, 'dev') count += 1 total_loss += valid_result[0] caculate_result = caculate_acc(ori_labels, valid_result[1]) acc_array += caculate_result[0] acc_blank += caculate_result[1] document, candidates, ori_labels, ori_locs = [], [], [], [] cnt = 0 if cnt > 0: document, doc_length, candidates, labels, locs, ori_labels, mask = \ prepare_batch_data(document, candidates, ori_labels, ori_locs) valid_result = model.train_step(sess, document, doc_length, candidates, labels, locs, mask, 'dev') count += 1 total_loss += valid_result[0] caculate_result = caculate_acc(ori_labels, valid_result[1]) acc_array += caculate_result[0] acc_blank += caculate_result[1] print(caculate_result) print(acc_array[0]) print(acc_array[1]) acc = acc_array[0] / acc_array[1] acc_single = acc_blank[0, 0] / (acc_blank[0, 1] + 1e-12) acc_multi = acc_blank[1, 0] / (acc_blank[1, 1] + 1e-12) avg_loss = total_loss / count print("*** Valid" + " acc %.5f loss %.3f single_acc %.5f multi_acc %.5f" % (acc, avg_loss, acc_single, acc_multi)) return acc, avg_loss
def train(sess, model): acc_array = np.zeros((2), dtype=np.float32) st_time, count, total_loss, cnt = time.time(), 0, 0., 0 if tf.train.get_checkpoint_state(train_dir): best_dev_acc = valid(sess, model)[0] best_iter = model.global_step.eval() else: best_dev_acc = 0.1 prev_loss = [1e15, 1e15] document, candidates, ori_labels, ori_locs = [], [], [], [] for _ in range(10): total_data = dataManager.train() for doc, can, lab, loc, _ in total_data: document.append(doc) candidates.append(can) ori_labels.append(lab) ori_locs.append(loc) cnt += 1 if cnt == FLAGS.batch_size: document, doc_length, candidates, labels, locs, ori_labels, mask = \ prepare_batch_data(document, candidates, ori_labels, ori_locs) train_result = model.train_step(sess, document, doc_length, candidates, labels, locs, mask) total_loss += train_result[0] acc_array += caculate_acc(ori_labels, train_result[1])[0] count += 1 if model.global_step.eval() % 100 == 0: temp_avg_time = (time.time() - st_time) / count temp_avg_loss = total_loss / count acc = acc_array[0] / acc_array[1] record_str = "step %d lr %.6f acc %.4f time %.3f loss %.3f" % \ (model.global_step.eval(), model.lr.eval(), acc, temp_avg_time, temp_avg_loss) print(record_str) if model.global_step.eval() % 1000 == 0: dev_acc, dev_loss = valid(sess, model) if dev_acc > best_dev_acc: model.saver.save(sess, "%s/checkpoint" % train_dir, global_step=model.global_step) best_dev_acc = dev_acc best_iter = model.global_step.eval() print("** New best iteration %d" % best_iter) print("* Best iteration %d" % best_iter) if dev_loss > max(prev_loss): sess.run(model.lr_decay) prev_loss = [prev_loss[1], dev_loss] acc_array = np.zeros((2), dtype=np.float32) st_time, count, total_loss = time.time(), 0, 0. document, candidates, ori_labels, ori_locs = [], [], [], [] cnt = 0
def valid(sess, model, mode="dev", record=False): if record: file = open("pred_result_" + FLAGS.model + "_" + mode + ".txt", "w") total_data = dataManager.valid(mode) acc_array = np.zeros((2), dtype=np.float32) count, total_loss, cnt = 0, 0., 0 document, candidates, ori_labels, ori_locs = [], [], [], [] acc_blank = np.zeros((2, 2), dtype=np.float32) for doc, can, lab, loc in total_data: document.append(doc) candidates.append(can) ori_labels.append(lab) ori_locs.append(loc) cnt += 1 if cnt == FLAGS.batch_size * 2: document, doc_length, candidates, labels, locs, ori_labels, mask = \ prepare_batch_data(document, candidates, ori_labels, ori_locs) valid_result = model.train_step(sess, document, doc_length, candidates, labels, locs, False, mask) count += 1 total_loss += valid_result[0] caculate_result = caculate_acc(ori_labels, valid_result[1]) acc_array += caculate_result[0] acc_blank += caculate_result[1] if record: for id in range(len(ori_labels)): ori_label = ori_labels[id] pred_result = valid_result[1][id] for pred in pred_result[:len(ori_label)]: file.write(str(int(pred)) + " ") file.write("\n") document, candidates, ori_labels, ori_locs = [], [], [], [] cnt = 0 if cnt > 0: document, doc_length, candidates, labels, locs, ori_labels, mask = \ prepare_batch_data(document, candidates, ori_labels, ori_locs) valid_result = model.train_step(sess, document, doc_length, candidates, labels, locs, False, mask) count += 1 total_loss += valid_result[0] caculate_result = caculate_acc(ori_labels, valid_result[1]) acc_array += caculate_result[0] acc_blank += caculate_result[1] if record: for id in range(len(ori_labels)): ori_label = ori_labels[id] pred_result = valid_result[1][id] for pred in pred_result[:len(ori_label)]: file.write(str(int(pred)) + " ") file.write("\n") if record: file.close() acc = acc_array[0] / acc_array[1] acc_single = acc_blank[0, 0] / (acc_blank[0, 1] + 1e-12) acc_multi = acc_blank[1, 0] / (acc_blank[1, 1] + 1e-12) avg_loss = total_loss / count print("*** " + mode.upper() + " acc %.5f loss %.3f single_acc %.5f multi_acc %.5f" % (acc, avg_loss, acc_single, acc_multi)) return acc, avg_loss