Skip to content
Snippets Groups Projects
Commit ee037267 authored by tgupta6's avatar tgupta6
Browse files

select best model

parent f2defe74
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,7 @@ import answer_classifier_cached_features.train as train ...@@ -13,6 +13,7 @@ import answer_classifier_cached_features.train as train
import numpy as np import numpy as np
import pdb import pdb
import ujson import ujson
import os
import tensorflow as tf import tensorflow as tf
...@@ -59,7 +60,7 @@ def create_batch_generator(mode): ...@@ -59,7 +60,7 @@ def create_batch_generator(mode):
constants.num_negative_answers, constants.num_negative_answers,
resnet_feat_dim=constants.resnet_feat_dim) resnet_feat_dim=constants.resnet_feat_dim)
index_generator = tftools.data.random( index_generator = tftools.data.sequential(
constants.answer_batch_size, constants.answer_batch_size,
num_questions, num_questions,
1, 1,
...@@ -129,10 +130,8 @@ def create_feed_dict_creator(plh, num_neg_answers): ...@@ -129,10 +130,8 @@ def create_feed_dict_creator(plh, num_neg_answers):
class eval_mgr(): class eval_mgr():
def __init__(self, eval_data_json, results_json): def __init__(self, results_json):
self.eval_data_json= eval_data_json
self.results_json = results_json self.results_json = results_json
self.eval_data = dict()
self.correct = 0 self.correct = 0
self.total = 0 self.total = 0
self.results = [] self.results = []
...@@ -141,18 +140,6 @@ class eval_mgr(): ...@@ -141,18 +140,6 @@ class eval_mgr():
batch_size = len(batch['question_unencoded']) batch_size = len(batch['question_unencoded'])
for j in xrange(batch_size): for j in xrange(batch_size):
dict_entry = dict()
dict_entry['question'] = batch['question_unencoded'][j]
dict_entry['positive_answer'] = {
batch['positive_answer_unencoded'][j]:
str(eval_vars_dict['answer_score_' + str(j)][0,0])}
dict_entry['negative_answers'] = dict()
for i in xrange(len(batch['negative_answers_unencoded'][j])):
answer = batch['negative_answers_unencoded'][j][i]
dict_entry['negative_answers'][answer] = \
str(eval_vars_dict['answer_score_' + str(j)][0,i+1])
question_id = batch['question_id'][j] question_id = batch['question_id'][j]
pred_answer, pred_score = self.get_pred_answer( pred_answer, pred_score = self.get_pred_answer(
[batch['positive_answer_unencoded'][j]] + \ [batch['positive_answer_unencoded'][j]] + \
...@@ -166,18 +153,13 @@ class eval_mgr(): ...@@ -166,18 +153,13 @@ class eval_mgr():
} }
self.results.append(result_entry) self.results.append(result_entry)
self.eval_data[str(question_id)] = dict_entry
print dict_entry
self.total += batch_size self.total += batch_size
self.correct += eval_vars_dict['accuracy']*batch_size self.correct += eval_vars_dict['accuracy'][0]*batch_size
self.print_accuracy()
if iter%100==0: if iter%10==0:
self.print_accuracy()
self.write_data() self.write_data()
def get_pred_answer(self, answers, scores): def get_pred_answer(self, answers, scores):
...@@ -199,12 +181,12 @@ class eval_mgr(): ...@@ -199,12 +181,12 @@ class eval_mgr():
print 'Total: {} Correct: {} Accuracy: {}'.format( print 'Total: {} Correct: {} Accuracy: {}'.format(
self.total, self.total,
self.correct, self.correct,
self.correct/float(self.total)) self.get_accuracy())
def write_data(self): def get_accuracy(self):
with open(self.eval_data_json, 'w') as file: return self.correct/float(self.total)
ujson.dump(self.eval_data, file, indent=4, sort_keys=True)
def write_data(self):
with open(self.results_json, 'w') as file: with open(self.results_json, 'w') as file:
ujson.dump(self.results, file, indent=4, sort_keys=True) ujson.dump(self.results, file, indent=4, sort_keys=True)
...@@ -228,8 +210,9 @@ def eval( ...@@ -228,8 +210,9 @@ def eval(
iter = 0 iter = 0
for batch in batch_generator: for batch in batch_generator:
print '---' if iter%10 == 0:
print 'Iter: {}'.format(iter) print '---'
print 'Iter: {}'.format(iter)
feed_dict = feed_dict_creator(batch) feed_dict = feed_dict_creator(batch)
eval_vars = sess.run( eval_vars = sess.run(
vars_to_eval, vars_to_eval,
...@@ -240,10 +223,13 @@ def eval( ...@@ -240,10 +223,13 @@ def eval(
evaluator.eval(iter, eval_vars_dict, batch) evaluator.eval(iter, eval_vars_dict, batch)
iter+=1 iter+=1
print '---'
print 'Iter: {}'.format(iter)
evaluator.print_accuracy()
evaluator.write_data() evaluator.write_data()
if __name__=='__main__': def eval_model(model_to_eval, results_json):
print 'Creating batch generator...' print 'Creating batch generator...'
batch_generator = create_batch_generator(constants.answer_eval_on) batch_generator = create_batch_generator(constants.answer_eval_on)
...@@ -269,7 +255,7 @@ if __name__=='__main__': ...@@ -269,7 +255,7 @@ if __name__=='__main__':
initializer = create_initializer( initializer = create_initializer(
graph, graph,
sess, sess,
constants.answer_model_to_eval) model_to_eval)
print 'Creating feed dict creator...' print 'Creating feed dict creator...'
feed_dict_creator = create_feed_dict_creator( feed_dict_creator = create_feed_dict_creator(
...@@ -285,9 +271,7 @@ if __name__=='__main__': ...@@ -285,9 +271,7 @@ if __name__=='__main__':
graph.answer_inference.answer_score[j] graph.answer_inference.answer_score[j]
print 'Creating evaluation manager...' print 'Creating evaluation manager...'
evaluator = eval_mgr( evaluator = eval_mgr(results_json)
constants.answer_eval_data_json,
constants.answer_results_json)
print 'Start training...' print 'Start training...'
eval( eval(
...@@ -298,8 +282,42 @@ if __name__=='__main__': ...@@ -298,8 +282,42 @@ if __name__=='__main__':
feed_dict_creator, feed_dict_creator,
evaluator) evaluator)
return evaluator.get_accuracy()
def model_path_generator(models_dir, start_model, step_size):
model_number = start_model
filename = os.path.join(models_dir,'model-' + str(model_number))
while os.path.exists(filename):
yield filename, model_number
model_number += step_size
filename = os.path.join(models_dir,'model-' + str(model_number))
if __name__=='__main__':
np.random.seed(seed=0)
model_paths = model_path_generator(
constants.models_dir,
constants.start_model,
constants.step_size)
model_accuracies_txt = open(constants.model_accuracies_txt, 'w')
best_model = (None, 0.0)
for model_path, model_number in model_paths:
results_json = os.path.join(
constants.answer_output_dir,
'eval_' + constants.answer_eval_on + '_results_' + str(model_number) + '.json')
accuracy = eval_model(model_path, results_json)
line = model_path + '\t' + str(accuracy)
print line
model_accuracies_txt.write(line + '\n')
if accuracy > best_model[1]:
best_model = (model_path, accuracy)
print 'best_model:' + '\t' + best_model[0] + '\t' + str(best_model[1])
line = 'best_model:' + '\t' + best_model[0] + '\t' + str(best_model[1])
model_accuracies_txt.write(line)
model_accuracies_txt.close()
...@@ -141,6 +141,9 @@ vqa_train_anno = os.path.join( ...@@ -141,6 +141,9 @@ vqa_train_anno = os.path.join(
vqa_val_image_dir = os.path.join( vqa_val_image_dir = os.path.join(
vqa_basedir, vqa_basedir,
'val2014_cropped_large') 'val2014_cropped_large')
vqa_val_resnet_feat_dir = os.path.join(
vqa_basedir,
'val2014_cropped_large_resnet_features')
vqa_val_anno = os.path.join( vqa_val_anno = os.path.join(
vqa_basedir, vqa_basedir,
'mscoco_val2014_annotations_with_parsed_questions.json') 'mscoco_val2014_annotations_with_parsed_questions.json')
...@@ -192,4 +195,14 @@ answer_eval_data_json = os.path.join( ...@@ -192,4 +195,14 @@ answer_eval_data_json = os.path.join(
answer_output_dir, answer_output_dir,
'eval_' + answer_eval_on + '_data.json') 'eval_' + answer_eval_on + '_data.json')
answer_eval_results_json = os.path.join(
answer_output_dir,
'eval_' + answer_eval_on + '_results.json')
# Select best model
models_dir = answer_output_dir
start_model = 1000
step_size = 2000
model_accuracies_txt = os.path.join(
answer_output_dir,
'model_accuracies.txt')
...@@ -140,6 +140,9 @@ vqa_train_anno = os.path.join( ...@@ -140,6 +140,9 @@ vqa_train_anno = os.path.join(
vqa_val_image_dir = os.path.join( vqa_val_image_dir = os.path.join(
vqa_basedir, vqa_basedir,
'val2014_cropped_large') 'val2014_cropped_large')
vqa_val_resnet_feat_dir = os.path.join(
vqa_basedir,
'val2014_cropped_large_resnet_features')
vqa_val_anno = os.path.join( vqa_val_anno = os.path.join(
vqa_basedir, vqa_basedir,
'mscoco_val2014_annotations_with_parsed_questions.json') 'mscoco_val2014_annotations_with_parsed_questions.json')
...@@ -191,4 +194,8 @@ answer_eval_data_json = os.path.join( ...@@ -191,4 +194,8 @@ answer_eval_data_json = os.path.join(
answer_output_dir, answer_output_dir,
'eval_' + answer_eval_on + '_data.json') 'eval_' + answer_eval_on + '_data.json')
answer_eval_results_json = os.path.join(
answer_output_dir,
'eval_' + answer_eval_on + '_results.json')
...@@ -7,7 +7,8 @@ def sequential(batch_size, num_samples, num_epochs=1, offset=0): ...@@ -7,7 +7,8 @@ def sequential(batch_size, num_samples, num_epochs=1, offset=0):
"""Generate sequence indices. """Generate sequence indices.
""" """
for epoch in range(num_epochs): for epoch in range(num_epochs):
indices = range(num_samples) indices = np.arange(num_samples) + offset
indices = indices.tolist()
for i in range(0, num_samples - batch_size + 1, batch_size): for i in range(0, num_samples - batch_size + 1, batch_size):
yield indices[i:i+batch_size] yield indices[i:i+batch_size]
......
...@@ -81,8 +81,6 @@ class word_vector_manager(): ...@@ -81,8 +81,6 @@ class word_vector_manager():
object_label_vector_list = [None]*num_object_labels object_label_vector_list = [None]*num_object_labels
for i in xrange(num_object_labels): for i in xrange(num_object_labels):
if i==471:
print inv_object_labels[i]
object_label_vector_list[i] = self.create_phrase_word_vectors( object_label_vector_list[i] = self.create_phrase_word_vectors(
inv_object_labels[i], inv_object_labels[i],
'object_label_' + str(i)) 'object_label_' + str(i))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment