Exemplo n.º 1
0
def main():
  """
  dialogs: dict, dialogs of the dataset.
  emo_dict: dict, emotions of all utterances.
  out_dict: dict, output logits of emotion classifier.
  """
  dialogs = joblib.load('./data/dialog_iemocap.pkl')
  emo_dict = joblib.load('./data/emo_all_iemocap.pkl')
  out_dict = joblib.load('./data/outputs.pkl')

  # set log
  logging.basicConfig(stream=sys.stdout,
                      format='%(asctime)s %(levelname)s:%(message)s',
                      level=logging.INFO,
                      datefmt='%I:%M:%S')

  # Split dialogs by speakers
  spk_dialogs = utils.split_dialog(dialogs)
  logging.info("Average number of speaker's utterances per dialog: %.3f" % np.mean(
                                                    [len(i) for i in spk_dialogs.values()]))


  # arguments
  args = parse_args()

  print('=' * 60 + '\n')
  logging.info('Parameters are:\n%s\n', json.dumps(vars(args), sort_keys=False, indent=4))
  print('=' * 60 + '\n')

  if args.transition_bias > 0:
    # Use given p_0
    p_0 = args.transition_bias

  else:
    # Estimate p_0 of ALL dialogs.
    p_0, total_transit = utils.transition_bias(spk_dialogs, emo_dict)

    print("\n"+"#"*50)
    logging.info('p_0: %.3f , total transition: %d\n' % (p_0, total_transit))
    print("#"*50)

    bias_dict = utils.get_val_bias(spk_dialogs, emo_dict)
    print("#"*50+"\n")

  trace = []
  label = []
  org_pred = []
  DED = bs.BeamSearch(p_0, args.crp_alpha, args.num_state, 
                              args.beam_size, args.test_iteration, emo_dict, out_dict)

  for i, dia in enumerate(dialogs):
    logging.info("Decoding dialog: {}/{}, {}".format(i,len(dialogs),dia))

    # Apply p_0 estimated from other 4 sessions.
    DED.transition_bias = bias_dict[dia[:5]] 
    
    # Beam search decoder
    out = DED.decode(dialogs[dia]) 

    trace += out
    label += [utils.convert_to_index(emo_dict[utt]) for utt in dialogs[dia]]
    org_pred += [np.argmax(out_dict[utt]) for utt in dialogs[dia]]
    if args.verbosity > 0:
      logging.info("Output: {}\n".format(out))

  print("#"*50+"\n")
  # Print the results of emotino classifier module
  uar, acc, conf = utils.evaluate(org_pred, label)
  logging.info('Original performance: uar: %.3f, acc: %.3f' % (uar, acc))

  # Eval ded outputs
  results = vars(args)
  uar, acc, conf = utils.evaluate(trace, label)
  logging.info('DED performance: uar: %.3f, acc: %.3f' % (uar, acc))
  logging.info('Confusion matrix:\n%s' % conf)

  # Save results
  results['uar'] = uar
  results['acc'] = acc
  results['conf'] = str(conf)
  logging.info('Save results:')
  logging.info('\n%s\n', json.dumps(results, sort_keys=False, indent=4))
  json.dump(results, open(args.out_dir+'/%s.json' % args.result_file, "w"))
Exemplo n.º 2
0
def main():
  """
  dialogs: dict, dialogs of the dataset.
  emo_dict: dict, emotions of all utterances.
  out_dict: dict, output logits of emotion classifier.
  """
  dialogs = joblib.load('./data/dialogs.pkl')
  #dialogs_edit = joblib.load('./data/dialog_rearrange_4emo_iemocap.pkl')
  #dialogs = joblib.load('./data/dialog_iemocap.pkl')
  #out_dict = joblib.load('./data/outputs.pkl')
  emo_dict = joblib.load('./data/emo_all.pkl')
  
  output_fold1 = joblib.load('./data/original_iaan/utt_logits_outputs_fold1.pkl')
  output_fold2 = joblib.load('./data/original_iaan/utt_logits_outputs_fold2.pkl')
  output_fold3 = joblib.load('./data/original_iaan/utt_logits_outputs_fold3.pkl')
  output_fold4 = joblib.load('./data/original_iaan/utt_logits_outputs_fold4.pkl')
  output_fold5 = joblib.load('./data/original_iaan/utt_logits_outputs_fold5.pkl')
  out_dict = {}
  for utt in output_fold1:
      if utt[4] == '1':
          out_dict[utt] = output_fold1[utt]
      elif utt[4] == '2':
          out_dict[utt] = output_fold2[utt]
      elif utt[4] == '3':
          out_dict[utt] = output_fold3[utt]
      elif utt[4] == '4':
          out_dict[utt] = output_fold4[utt]
      elif utt[4] == '5':
          out_dict[utt] = output_fold5[utt]
  
  '''
  out_dict = joblib.load('./data/DAG_emo_output_all_fold_multi8_rearrange.pkl')
  C2C_emo_dict = joblib.load('./data/C2C_4emo_all_iemocap.pkl')
  U2U_emo_dict = joblib.load('./data/U2U_4emo_all_iemocap.pkl')
  LogisticRegression_emo_shift_output = joblib.load('./data/LogisticRegression_emo_shift_output.pkl')
  RandomForest_emo_shift_output = joblib.load('./data/RandomForest_emo_shift_output.pkl')
  iaan_emo_shift_output = joblib.load('./data/iaan_emo_shift_output_rearrange.pkl')
  mlp_sklearn_emo_shift_output = joblib.load('./data/MLPSklearn_emo_shift_output.pkl')
  svm_emo_shift_output = joblib.load('./data/SVM_emo_shift_output.pkl')
  MLPPytorch_emo_shift_output = joblib.load('./data/MLPPytorch_emo_shift_output.pkl')
  '''
  #DAG_emo_shift_output_all_fold = joblib.load('./data/DAG_emo_shift_output_all_fold_multi4_rearrange.pkl')
  
  # set log
  logging.basicConfig(stream=sys.stdout,
                      format='%(asctime)s %(levelname)s:%(message)s',
                      level=logging.INFO,
                      datefmt='%I:%M:%S')

  # Split dialogs by speakers
  spk_dialogs = utils.split_dialog(dialogs)
  #spk_dialogs_edit = utils.split_dialog(dialogs_edit)
  logging.info("Average number of speaker's utterances per dialog: %.3f" % np.mean(
                                                    [len(i) for i in spk_dialogs.values()]))


  # arguments
  args = parse_args()

  print('=' * 60 + '\n')
  logging.info('Parameters are:\n%s\n', json.dumps(vars(args), sort_keys=False, indent=4))
  print('=' * 60 + '\n')

  if args.transition_bias > 0:
    # Use given p_0
    p_0 = args.transition_bias

  else:
    # Estimate p_0 of ALL dialogs.
    p_0, total_transit = utils.transition_bias(spk_dialogs, emo_dict)

    print("\n"+"#"*50)
    logging.info('p_0: %.3f , total transition: %d\n' % (p_0, total_transit))
    print("#"*50)

    bias_dict = utils.get_val_bias(spk_dialogs, emo_dict)
    print("#"*50+"\n")

  # rule based ddCRP alpha (ref: https://arxiv.org/pdf/1911.01266.pdf)
  #alpha_dict = utils.get_val_alpha(spk_dialogs_edit, emo_dict)

  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=1, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=0, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=1, Bi_or_Tri=3)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=0, Bi_or_Tri=3)

  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=3)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=3)

  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=3)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=3)

  trace = []
  label = []
  org_pred = []
  DED = bs.BeamSearch(p_0, {}, args.crp_alpha, args.num_state, 
                              args.beam_size, args.test_iteration, emo_dict, out_dict, {})
  model_pred_dict = {}
  for i, dia in enumerate(dialogs):
    logging.info("Decoding dialog: {}/{}, {}".format(i,len(dialogs),dia))

    # Apply p_0 estimated from other 4 sessions.
    DED.transition_bias = bias_dict[dia[:5]] 
    #DED.crp_alpha = alpha_dict[dia[:5]]

    # Apply emo_trans_prob_dict estimated from other 4 sessions.
    #DED.emo_trans_prob_dict = intra_emo_trans_prob_dict[dia[:5]]

    # Beam search decoder
    out = DED.decode(dialogs[dia], model_pred_dict) 

    trace += out
    label += [utils.convert_to_index(emo_dict[utt]) for utt in dialogs[dia]]
    org_pred += [np.argmax(out_dict[utt]) for utt in dialogs[dia]]
    if args.verbosity > 0:
      logging.info("Output: {}\n".format(out))

  print("#"*50+"\n")
  # Print the results of emotino classifier module
  uar, acc, conf = utils.evaluate(org_pred, label)
  logging.info('Original performance: uar: %.3f, acc: %.3f' % (uar, acc))

  # Eval ded outputs
  results = vars(args)
  uar, acc, conf = utils.evaluate(trace, label)
  logging.info('DED performance: uar: %.3f, acc: %.3f' % (uar, acc))
  logging.info('Confusion matrix:\n%s' % conf)

  # Save results
  results['uar'] = uar
  results['acc'] = acc
  results['conf'] = str(conf)
  logging.info('Save results:')
  logging.info('\n%s\n', json.dumps(results, sort_keys=False, indent=4))
  json.dump(results, open(args.out_dir+'/%s.json' % args.result_file, "w"))
  joblib.dump(model_pred_dict, './outputs/preds_4.pkl')
Exemplo n.º 3
0
def main():
  """
  dialogs: dict, dialogs of the dataset.
  emo_dict: dict, emotions of all utterances.
  out_dict: dict, output logits of emotion classifier.
  """
  train_dialogs = joblib.load('./data/train_dialogs.pkl')
  val_dialogs = joblib.load('./data/val_dialogs.pkl')
  test_dialogs = joblib.load('./data/test_dialogs.pkl')
  train_val_dialogs = dict(train_dialogs)
  train_val_dialogs.update(val_dialogs)
  #dialogs_edit = joblib.load('./data/dialog_6emo_iemocap.pkl')
  
  train_emo_dict = joblib.load('./data/train_emo_all.pkl')
  val_emo_dict = joblib.load('./data/val_emo_all.pkl')
  test_emo_dict = joblib.load('./data/test_emo_all.pkl')
  train_val_emo_dict = dict(train_emo_dict)
  train_val_emo_dict.update(val_emo_dict)
  
  train_out_dict = joblib.load('./data/train_utts_logit.pkl')
  val_out_dict = joblib.load('./data/train_utts_logit.pkl')
  test_out_dict = joblib.load('./data/test_utts_logit.pkl')
  train_val_out_dict = dict(train_out_dict)
  train_val_out_dict.update(val_out_dict)
  '''
  for utt in train_out_dict:
      train_out_dict[utt] = softmax(train_out_dict[utt])
  for utt in val_out_dict:
      val_out_dict[utt] = softmax(val_out_dict[utt])
  for utt in test_out_dict:
      test_out_dict[utt] = softmax(test_out_dict[utt])
  for utt in train_val_out_dict:
      test_out_dict[utt] = softmax(train_val_out_dict[utt])
  '''
  #C2C_emo_dict = joblib.load('./data/C2C_4emo_all_iemocap.pkl')
  #U2U_emo_dict = joblib.load('./data/U2U_6emo_all_iemocap.pkl')

  # set log
  logging.basicConfig(stream=sys.stdout,
                      format='%(asctime)s %(levelname)s:%(message)s',
                      level=logging.INFO,
                      datefmt='%I:%M:%S')

  # Split dialogs by speakers
  #train_val_spk_dialogs = utils.split_dialog(train_val_dialogs)
  train_spk_dialogs = utils.split_dialog(train_dialogs)
  #test_spk_dialogs = utils.split_dialog(test_dialogs)

  logging.info("Average number of speaker's utterances per dialog: %.3f" % np.mean(
                                                    [len(i) for i in train_spk_dialogs.values()]))


  # arguments
  args = parse_args()
  print(args)

  print('=' * 60 + '\n')
  logging.info('Parameters are:\n%s\n', json.dumps(vars(args), sort_keys=False, indent=4))
  print('=' * 60 + '\n')

  if args.transition_bias > 0:
    # Use given p_0
    p_0 = args.transition_bias

  else:
    # Estimate p_0 of ALL dialogs.
    #train_val_p_0, train_val_total_transit = utils.transition_bias(train_val_spk_dialogs, train_val_emo_dict)
    train_p_0, train_total_transit = utils.transition_bias(train_spk_dialogs, train_emo_dict)
    #test_p_0, test_total_transit = utils.transition_bias(test_spk_dialogs, test_emo_dict)
    
    print("\n"+"#"*50)
    logging.info('p_0: %.3f , total transition: %d\n' % (train_p_0, train_total_transit))
    print("#"*50)

  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=1, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=0, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=1, Bi_or_Tri=3)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(emo_dict, dialogs_edit, softmax_or_not=0, Bi_or_Tri=3)

  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=3)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(C2C_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=3)

  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=2)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=1, Bi_or_Tri=3)
  #seq_emo_trans_prob_dict, intra_emo_trans_prob_dict = utils.get_val_emo_trans_prob(U2U_emo_dict, dialogs, softmax_or_not=0, Bi_or_Tri=3)

  trace = []
  label = []
  org_pred = []
  DED = bs.BeamSearch(train_p_0, {}, args.crp_alpha, args.num_state, 
                              args.beam_size, args.test_iteration, test_emo_dict, test_out_dict)
  model_pred_dict = {}
  for i, dia in enumerate(test_dialogs):
    logging.info("Decoding dialog: {}/{}, {}".format(i,len(test_dialogs),dia))

    # Apply p_0 estimated from train_val data
    DED.transition_bias = train_p_0

    # Apply emo_trans_prob_dict estimated from other 4 sessions.
    #DED.emo_trans_prob_dict = seq_emo_trans_prob_dict[dia[:5]]

    # Beam search decoder
    out = DED.decode(test_dialogs[dia], model_pred_dict) 

    trace += out
    label += [utils.convert_to_index(test_emo_dict[utt]) for utt in test_dialogs[dia]]
    org_pred += [np.argmax(test_out_dict[utt]) for utt in test_dialogs[dia]]
    if args.verbosity > 0:
      logging.info("Output: {}\n".format(out))

  print("#"*50+"\n")
  # Print the results of emotino classifier module
  uar, acc, weighted_f1, conf = utils.evaluate(org_pred, label)
  logging.info('Original performance: uar: %.4f, acc: %.4f, weighted f1: %.4f' % (uar, acc, weighted_f1))
  print(conf)

  # Eval ded outputs
  results = vars(args)
  uar, acc, weighted_f1, conf = utils.evaluate(trace, label)
  logging.info('DED performance: uar: %.4f, acc: %.4f, weighted f1: %.4f' % (uar, acc, weighted_f1))
  #logging.info('Confusion matrix:\n%s' % conf)
  print(conf)

  # Save results
  results['uar'] = uar
  results['acc'] = acc
  results['weighted_f1'] = weighted_f1
  results['conf'] = str(conf)
  logging.info('Save results:')
  logging.info('\n%s\n', json.dumps(results, sort_keys=False, indent=4))
  json.dump(results, open(args.out_dir+'/%s.json' % args.result_file, "w"))
  joblib.dump(model_pred_dict, './outputs/preds_4.pkl')