diff --git a/answer_classifier_cached_features/train.py b/answer_classifier_cached_features/train.py index 7dbb698d86c72252f0fbb1911d0824e9238d64d2..bb213d9c96554d0e57e2424558aa7b24a71ccfbc 100644 --- a/answer_classifier_cached_features/train.py +++ b/answer_classifier_cached_features/train.py @@ -213,7 +213,6 @@ class graph_creator(): name = 'embedding_lookup_' + name) noun_embed[name].append(embed) - name = 'positive_adjectives' adjective_embed[name] = [] for j in xrange(self.batch_size): @@ -370,7 +369,7 @@ class graph_creator(): self.regularization_loss = self.regularization() - self.total_loss = 0.1*(self.object_loss + 1000.0*self.attribute_loss) + \ + self.total_loss = 0.0*(self.object_loss + 1000.0*self.attribute_loss) + \ self.regularization_loss + \ self.answer_loss @@ -755,7 +754,7 @@ if __name__=='__main__': print 'Starting a session...' config = tf.ConfigProto() config.gpu_options.allow_growth = True - config.gpu_options.per_process_gpu_memory_fraction = 0.8 + config.gpu_options.per_process_gpu_memory_fraction = 0.5 sess = tf.Session(config=config, graph=graph.tf_graph) print 'Creating initializer...' diff --git a/answer_classifier_cached_features/train_no_pretraining.py b/answer_classifier_cached_features/train_no_pretraining.py new file mode 100644 index 0000000000000000000000000000000000000000..d6a5b8a6dc5d951ee1a6736974d3e49a46d58a5c --- /dev/null +++ b/answer_classifier_cached_features/train_no_pretraining.py @@ -0,0 +1,804 @@ +from word2vec.word_vector_management import word_vector_manager +import object_attribute_classifier_cached_features.inference as feature_graph +import region_relevance_network.inference as relevance_graph +import answer_classifier_cached_features.inference as answer_graph +from tftools import var_collect, placeholder_management +import tftools.data +import losses +import constants +import tftools.var_collect as var_collect +import data.vqa_cached_features as vqa_data +import data.cropped_regions_cached_features as genome_data + +import numpy as np +import pdb +from itertools import izip +import tensorflow as tf + + +class graph_creator(): + def __init__( + self, + tb_log_dir, + batch_size, + image_size, + num_neg_answers, + space_dim, + regularization_coeff, + num_regions_wo_labels, + num_regions_w_labels, + num_object_labels, + num_attribute_labels, + resnet_feat_dim=2048, + training=True): + self.im_h, self.im_w = image_size + self.num_neg_answers = num_neg_answers + self.space_dim = space_dim + self.batch_size = batch_size + self.regularization_coeff = regularization_coeff + self.num_regions_wo_labels = num_regions_wo_labels + self.num_regions_w_labels = num_regions_w_labels + self.num_object_labels = num_object_labels + self.num_attribute_labels = num_attribute_labels + self.resnet_feat_dim = resnet_feat_dim + self.training = training + self.tf_graph = tf.Graph() + with self.tf_graph.as_default(): + self.create_placeholders() + + self.word_vec_mgr = word_vector_manager() + + if self.training: + self.concat_feats = tf.concat( + 0, + [self.plh['region_feats'], self.plh['region_feats_with_labels']]) + else: + self.concat_feats = self.plh['region_feats'] + + self.obj_atr_inference = feature_graph.ObjectAttributeInference( + self.concat_feats, + self.word_vec_mgr.object_label_vectors, + self.word_vec_mgr.attribute_label_vectors, + training) + + if self.training: + self.split_obj_atr_inference_output() + self.object_feat = self.object_embed_with_answers + self.attribute_feat = self.attribute_embed_with_answers + else: + self.object_feat = self.obj_atr_inference.object_embed + self.attribute_feat = self.obj_atr_inference.attribute_embed + + self.object_feat = tf.split( + 0, + self.batch_size, + self.object_feat) + + self.attribute_feat = tf.split( + 0, + self.batch_size, + self.attribute_feat) + + self.question_embed, self.question_embed_concat = \ + self.get_question_embeddings() + self.answers_embed, self.answers_embed_concat = \ + self.get_answer_embeddings() + self.noun_embed, self.adjective_embed = \ + self.get_noun_adjective_embeddings() + self.relevance_inference = \ + relevance_graph.RegionRelevanceInference( + self.batch_size, + self.object_feat, + self.attribute_feat, + self.noun_embed, + self.adjective_embed + ) + + self.answer_inference = answer_graph.AnswerInference( + self.object_feat, + self.attribute_feat, + self.relevance_inference.answer_region_prob, + self.question_embed_concat, + self.answers_embed_concat, + self.num_neg_answers + 1, + self.space_dim, + self.plh['keep_prob']) + + self.add_losses() + self.add_accuracy_computation() + self.collect_variables() + self.vars_to_save = tf.all_variables() + self.merged = tf.merge_all_summaries() + self.writer = tf.train.SummaryWriter( + tb_log_dir, + graph = self.tf_graph) + + def create_placeholders(self): + self.plh = placeholder_management.PlaceholderManager() + + self.plh.add_placeholder( + 'keep_prob', + tf.float32, + shape=[]) + + self.plh.add_placeholder( + 'region_feats', + tf.float32, + shape=[None, self.resnet_feat_dim]) + + if self.training: + self.plh.add_placeholder( + 'region_feats_with_labels', + tf.float32, + shape=[None, self.resnet_feat_dim]) + + self.plh.add_placeholder( + 'object_labels', + tf.float32, + shape=[None, self.num_object_labels]) + + self.plh.add_placeholder( + 'attribute_labels', + tf.float32, + shape=[None, self.num_attribute_labels]) + + for i in xrange(self.num_neg_answers): + answer_name = 'negative_answer_' + str(i) + self.plh.add_placeholder( + answer_name, + tf.int64, + shape=[None], + size=self.batch_size) + + self.plh.add_placeholder( + 'positive_answer', + tf.int64, + shape=[None], + size=self.batch_size) + + for i in xrange(4): + bin_name = 'bin_' + str(i) + self.plh.add_placeholder( + bin_name, + tf.int64, + shape=[None], + size=self.batch_size) + + self.plh.add_placeholder( + 'positive_nouns', + tf.int64, + shape=[None], + size=self.batch_size) + + self.plh.add_placeholder( + 'positive_adjectives', + tf.int64, + shape=[None], + size=self.batch_size) + + for i in xrange(self.num_neg_answers): + self.plh.add_placeholder( + 'negative_nouns_' + str(i), + tf.int64, + shape=[None], + size=self.batch_size) + + self.plh.add_placeholder( + 'negative_adjectives_' + str(i), + tf.int64, + shape=[None], + size=self.batch_size) + + def get_noun_adjective_embeddings(self): + with tf.variable_scope('noun_adjective_embed'): + noun_embed = dict() + adjective_embed = dict() + + name = 'positive_nouns' + noun_embed[name] = [] + for j in xrange(self.batch_size): + embed = tf.nn.embedding_lookup( + self.word_vec_mgr.word_vectors, + self.plh[name][j], + name = 'embedding_lookup_' + name) + noun_embed[name].append(embed) + + for i in xrange(self.num_neg_answers): + name = 'negative_nouns_' + str(i) + noun_embed[name] = [] + for j in xrange(self.batch_size): + embed = tf.nn.embedding_lookup( + self.word_vec_mgr.word_vectors, + self.plh[name][j], + name = 'embedding_lookup_' + name) + noun_embed[name].append(embed) + + name = 'positive_adjectives' + adjective_embed[name] = [] + for j in xrange(self.batch_size): + embed = tf.nn.embedding_lookup( + self.word_vec_mgr.word_vectors, + self.plh[name][j], + name = 'embedding_lookup_' + name) + adjective_embed[name].append(embed) + + for i in xrange(self.num_neg_answers): + name = 'negative_adjectives_' + str(i) + adjective_embed[name] = [] + for j in xrange(self.batch_size): + embed = tf.nn.embedding_lookup( + self.word_vec_mgr.word_vectors, + self.plh[name][j], + name = 'embedding_lookup_' + name) + adjective_embed[name].append(embed) + + return noun_embed, adjective_embed + + def get_question_embeddings(self): + with tf.variable_scope('question_bin_embed'): + question_bin_embed = dict() + tensor_list = [[] for i in xrange(self.batch_size)] + for i in xrange(4): + bin_name = 'bin_' + str(i) + question_bin_embed[bin_name] = [] + for j in xrange(self.batch_size): + embed = self.lookup_word_embeddings( + self.plh[bin_name][j], + bin_name) + question_bin_embed[bin_name].append(embed) + tensor_list[j].append(embed) + + question_bin_embed_concat = [] + for j in xrange(self.batch_size): + embed_concat = tf.concat( + 0, + tensor_list[j], + name = 'concat_question_bins') + question_bin_embed_concat.append(embed_concat) + + return question_bin_embed, question_bin_embed_concat + + def get_answer_embeddings(self): + with tf.variable_scope('answers_embed'): + answers_embed = dict() + tensor_list = [[] for i in xrange(self.batch_size)] + + answer_name = 'positive_answer' + answers_embed[answer_name] = [] + for j in xrange(self.batch_size): + embed = self.lookup_word_embeddings( + self.plh[answer_name][j], + answer_name) + answers_embed[answer_name].append(embed) + tensor_list[j].append(embed) + + for i in xrange(self.num_neg_answers): + answer_name = 'negative_answer_' + str(i) + answers_embed[answer_name] = [] + for j in xrange(self.batch_size): + embed = self.lookup_word_embeddings( + self.plh[answer_name][j], + answer_name) + answers_embed[answer_name].append(embed) + tensor_list[j].append(embed) + + answers_embed_concat = [] + for j in xrange(self.batch_size): + embed_concat = tf.concat( + 0, + tensor_list[j], + name = 'concat_answers') + answers_embed_concat.append(embed_concat) + + return answers_embed, answers_embed_concat + + def lookup_word_embeddings(self, index_list, name): + with tf.variable_scope(name): + word_vectors = tf.nn.embedding_lookup( + self.word_vec_mgr.word_vectors, + index_list, + name = 'embedding_lookup') + + embedding = tf.reduce_mean( + word_vectors, + 0, + True, + 'reduce_mean') + + return embedding + + def split_obj_atr_inference_output(self): + with tf.variable_scope('split'): + self.object_embed_with_answers = tf.slice( + self.obj_atr_inference.object_embed, + [0, 0], + [self.num_regions_wo_labels, -1]) + + self.object_scores_with_labels = tf.slice( + self.obj_atr_inference.object_scores, + [self.num_regions_wo_labels, 0], + [-1, -1]) + + self.attribute_embed_with_answers = tf.slice( + self.obj_atr_inference.attribute_embed, + [0, 0], + [self.num_regions_wo_labels, -1]) + + self.attribute_scores_with_labels = tf.slice( + self.obj_atr_inference.attribute_scores, + [self.num_regions_wo_labels, 0], + [-1, -1]) + + def add_losses(self): + y = np.zeros([1, self.num_neg_answers + 1]) + y[0,0] = 1.0 + y = tf.constant(y, dtype=tf.float32) + self.answer_loss = 0 + for j in xrange(self.batch_size): + self.answer_loss += losses.answer_loss( + self.answer_inference.answer_score[j], + y) + self.answer_loss /= self.batch_size + + if self.training: + self.object_loss = losses.object_loss( + #self.obj_atr_inference.object_scores, + self.object_scores_with_labels, + self.plh['object_labels']) + #object_labels) + + object_loss_summary = tf.scalar_summary( + "loss_object", + self.object_loss) + + self.attribute_loss = losses.attribute_loss( + #self.obj_atr_inference.attribute_scores, + self.attribute_scores_with_labels, + self.plh['attribute_labels'], + #attribute_labels, + self.num_regions_w_labels) + + attribute_loss_summary = tf.scalar_summary( + "loss_attribute", + self.attribute_loss) + # self.object_loss = 0.0 + # self.attribute_loss = 0.0 + else: + self.object_loss = 0.0 + self.attribute_loss = 0.0 + + self.regularization_loss = self.regularization() + + self.total_loss = 0.0*(self.object_loss + 1000.0*self.attribute_loss) + \ + self.regularization_loss + \ + self.answer_loss + + ema = tf.train.ExponentialMovingAverage(0.95, name='ema') + update_op = ema.apply([self.answer_loss]) + moving_average_answer_loss = ema.average(self.answer_loss) + with tf.control_dependencies([update_op]): + answer_loss_summary = tf.scalar_summary( + "loss_answer", + moving_average_answer_loss) + + regularization_loss_summary = tf.scalar_summary( + "loss_regularization", + self.regularization_loss) + + total_loss_summary = tf.scalar_summary( + "loss_total", + self.total_loss) + + def regularization(self): + vars_to_regularize = tf.get_collection('to_regularize') + loss = losses.regularization_loss( + vars_to_regularize, + self.regularization_coeff) + + return loss + + def add_accuracy_computation(self): + with tf.variable_scope('accuracy_graph'): + self.answer_accuracy, self.answer_accuracy_ema, \ + self.update_answer_accuracy_op = \ + self.add_answer_accuracy_computation( + self.answer_inference.answer_score) + + self.moving_average_accuracy = self.answer_accuracy_ema.average( + self.answer_accuracy) + + with tf.control_dependencies([self.update_answer_accuracy_op]): + answer_accuracy_summary = tf.scalar_summary( + ["accuracy_answer"], + self.moving_average_accuracy) + + def add_answer_accuracy_computation(self, scores): + with tf.variable_scope('answer_accuracy'): + accuracy = 0.0 + for j in xrange(self.batch_size): + is_correct = tf.equal( + tf.argmax(scores[j],1), + tf.constant(0,dtype=tf.int64)) + accuracy += tf.cast(is_correct, tf.float32) + accuracy /= self.batch_size + ema = tf.train.ExponentialMovingAverage(0.95, name='ema') + update_accuracy_op = ema.apply([accuracy]) + + return accuracy, ema, update_accuracy_op + + def collect_variables(self): + self.word_vec_vars = var_collect.collect_scope('word_vectors') + self.resnet_vars = self.obj_atr_inference.resnet_vars + self.object_attribute_vars = \ + var_collect.collect_scope('object_graph') + \ + var_collect.collect_scope('attribute_graph') + \ + var_collect.collect_scope('bn') + self.answer_vars = var_collect.collect_scope('answer_graph') + +def create_initializer(graph, sess, model): + class initializer(): + def __init__(self): + with graph.tf_graph.as_default(): + all_vars = tf.all_variables() + var_collect.print_var_list( + all_vars, + 'vars_to_init') + self.init = tf.initialize_variables(all_vars) + + def initialize(self): + sess.run(self.init) + + return initializer() + + +def create_vqa_batch_generator(): + data_mgr = vqa_data.data( + constants.vqa_train_resnet_feat_dir, + constants.vqa_train_anno, + constants.vocab_json, + constants.vqa_answer_vocab_json, + constants.image_size, + constants.num_region_proposals, + constants.num_negative_answers, + resnet_feat_dim=constants.resnet_feat_dim) + + index_generator = tftools.data.random( + constants.answer_batch_size, + constants.num_train_questions, + constants.answer_num_epochs, + constants.answer_offset) + + batch_generator = tftools.data.async_batch_generator( + data_mgr, + index_generator, + constants.answer_queue_size) + + return batch_generator + + +def create_vgenome_batch_generator(): + data_mgr = genome_data.data( + constants.genome_resnet_feat_dir, + constants.image_dir, + constants.object_labels_json, + constants.attribute_labels_json, + constants.regions_json, + constants.image_size, + channels=3, + resnet_feat_dim=constants.resnet_feat_dim, + mean_image_filename=None) + + index_generator = tftools.data.random( + constants.num_regions_with_labels, + constants.region_num_samples, + constants.region_num_epochs, + constants.region_offset) + + batch_generator = tftools.data.async_batch_generator( + data_mgr, + index_generator, + constants.region_queue_size) + + return batch_generator + + +def create_batch_generator(): + vqa_generator = create_vqa_batch_generator() + vgenome_generator = create_vgenome_batch_generator() + generator = izip(vqa_generator, vgenome_generator) + return generator + + +class attach_optimizer(): + def __init__(self, graph, lr): + self.graph = graph + self.lr = lr + with graph.tf_graph.as_default(): + all_trainable_vars = tf.trainable_variables() + self.not_to_train = []#+ graph.object_attribute_vars + vars_to_train = [ + var for var in all_trainable_vars + if var not in self.not_to_train] + #vars_to_train = graph.resnet_vars + + var_collect.print_var_list( + vars_to_train, + 'vars_to_train') + + all_vars = tf.all_variables() + self.ops = dict() + + self.add_adam_optimizer( + graph.total_loss, + vars_to_train, + 'optimizer') + + self.train_op = self.group_all_train_ops() + all_vars_with_opt_vars = tf.all_variables() + self.opt_vars = [var for var in all_vars_with_opt_vars if var not in all_vars] + + def filter_out_vars_to_train(self, var_list): + return [var for var in var_list if var not in self.not_to_train] + + def add_adam_optimizer(self, loss, var_list, name): + var_list = self.filter_out_vars_to_train(var_list) + if not var_list: + self.ops[name] = [] + return + + train_step = tf.train.AdamOptimizer(self.lr) \ + .minimize( + loss, + var_list = var_list) + + + self.ops[name] = train_step + + def group_all_train_ops(self): + train_op = tf.group() + for op in self.ops.values(): + if op: + train_op = tf.group(train_op, op) + +# check_op = tf.add_check_numerics_ops() +# train_op = tf.group(train_op, check_op) + return train_op + + +def create_feed_dict_creator(plh, num_neg_answers): + def feed_dict_creator(batch): + vqa_batch, vgenome_batch = batch + batch_size = len(vqa_batch['question']) + # Create vqa inputs + inputs = { + 'region_feats': np.concatenate(vqa_batch['region_feats'], axis=0), + 'positive_answer': vqa_batch['positive_answer'], + } + for i in xrange(4): + bin_name = 'bin_' + str(i) + inputs[bin_name] = [ + vqa_batch['question'][j][bin_name] for j in xrange(batch_size)] + + for i in xrange(num_neg_answers): + answer_name = 'negative_answer_' + str(i) + inputs[answer_name] = [ + vqa_batch['negative_answers'][j][i] for j in xrange(batch_size)] + + inputs['positive_nouns'] = [ + a + b for a, b in zip( + vqa_batch['question_nouns'], + vqa_batch['positive_answer_nouns'])] + + inputs['positive_adjectives'] = [ + a + b for a, b in zip( + vqa_batch['question_adjectives'], + vqa_batch['positive_answer_adjectives'])] + + for i in xrange(num_neg_answers): + name = 'negative_nouns_' + str(i) + list_ith_negative_answer_nouns = [ + vqa_batch['negative_answers_nouns'][j][i] + for j in xrange(batch_size)] + inputs[name] = [ + a + b for a, b in zip( + vqa_batch['question_nouns'], + list_ith_negative_answer_nouns)] + + name = 'negative_adjectives_' + str(i) + list_ith_negative_answer_adjectives = [ + vqa_batch['negative_answers_adjectives'][j][i] + for j in xrange(batch_size)] + inputs[name] = [ + a + b for a, b in zip( + vqa_batch['question_adjectives'], + list_ith_negative_answer_adjectives)] + + # Create vgenome inputs + inputs['region_feats_with_labels'] = vgenome_batch['region_feats'] + inputs['object_labels'] = vgenome_batch['object_labels'] + inputs['attribute_labels'] = vgenome_batch['attribute_labels'] + + inputs['keep_prob'] = 0.8 + return plh.get_feed_dict(inputs) + + return feed_dict_creator + + +class log_mgr(): + def __init__( + self, + graph, + vars_to_save, + sess, + log_every_n_iter, + output_dir, + model_path): + self.graph = graph + self.vars_to_save = vars_to_save + self.sess = sess + self.log_every_n_iter = log_every_n_iter + self.output_dir = output_dir + self.model_path = model_path + + self.model_saver = tf.train.Saver( + var_list = vars_to_save, + max_to_keep = 0) + + self.loss_values = dict() + + def log(self, iter, is_last=False, eval_vars_dict=None): + if eval_vars_dict: + self.graph.writer.add_summary( + eval_vars_dict['merged'], + iter) + + print 'Word Vector shape: {}'.format( + eval_vars_dict['word_vectors'].shape) + print np.max(eval_vars_dict['word_vectors']) + print np.min(eval_vars_dict['word_vectors']) + + print 'Object Scores shape: {}'.format( + eval_vars_dict['object_scores'].shape) + print np.max(eval_vars_dict['object_scores']) + + print 'Attribute Scores shape: {}'.format( + eval_vars_dict['attribute_scores'].shape) + print np.max(eval_vars_dict['attribute_scores']) + + print 'Answer Scores shape: {}'.format( + eval_vars_dict['answer_scores'].shape) + print np.max(eval_vars_dict['answer_scores']) + + print 'Relevance Prob shape: {}'.format( + eval_vars_dict['relevance_prob'].shape) + print np.max(eval_vars_dict['relevance_prob']) + + print 'Per region answer prob shape: {}'.format( + eval_vars_dict['per_region_answer_prob'].shape) + print np.max(eval_vars_dict['per_region_answer_prob']) + + if iter % self.log_every_n_iter==0 or is_last: + self.model_saver.save( + self.sess, + self.model_path, + global_step=iter) + + +def train( + batch_generator, + sess, + initializer, + vars_to_eval_dict, + feed_dict_creator, + logger): + + vars_to_eval_names = [] + vars_to_eval = [] + for var_name, var in vars_to_eval_dict.items(): + vars_to_eval_names += [var_name] + vars_to_eval += [var] + + with sess.as_default(): + initializer.initialize() + + iter = 0 + for batch in batch_generator: + print '---' + print 'Iter: {}'.format(iter) + feed_dict = feed_dict_creator(batch) + eval_vars = sess.run( + vars_to_eval, + feed_dict = feed_dict) + eval_vars_dict = { + var_name: eval_var for var_name, eval_var in + zip(vars_to_eval_names, eval_vars)} + logger.log(iter, False, eval_vars_dict) + iter+=1 + + logger.log(iter-1, True, eval_vars_dict) + + +if __name__=='__main__': + print 'Creating batch generator...' + batch_generator = create_batch_generator() + + print 'Creating computation graph...' + graph = graph_creator( + constants.tb_log_dir, + constants.answer_batch_size, + constants.image_size, + constants.num_negative_answers, + constants.answer_embedding_dim, + constants.answer_regularization_coeff, + constants.answer_batch_size*constants.num_region_proposals, + constants.num_regions_with_labels, + constants.num_object_labels, + constants.num_attribute_labels, + resnet_feat_dim=constants.resnet_feat_dim, + training=True) + + print 'Attaching optimizer...' + optimizer = attach_optimizer( + graph, + constants.answer_lr) + + print 'Starting a session...' + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.gpu_options.per_process_gpu_memory_fraction = 0.5 + sess = tf.Session(config=config, graph=graph.tf_graph) + + print 'Creating initializer...' + initializer = create_initializer( + graph, + sess, + constants.pretrained_model) + + print 'Creating feed dict creator...' + feed_dict_creator = create_feed_dict_creator( + graph.plh, + constants.num_negative_answers) + + print 'Creating dict of vars to be evaluated...' + vars_to_eval_dict = { + 'optimizer_op': optimizer.train_op, + 'word_vectors': graph.word_vec_mgr.word_vectors, + 'relevance_prob': graph.relevance_inference.answer_region_prob[0], + 'per_region_answer_prob': graph.answer_inference.per_region_answer_prob[0], + 'object_scores': graph.obj_atr_inference.object_scores, + 'attribute_scores': graph.obj_atr_inference.attribute_scores, + 'answer_scores': graph.answer_inference.answer_score[0], + 'accuracy': graph.moving_average_accuracy, + 'total_loss': graph.total_loss, + # 'question_embed_concat': graph.question_embed_concat, + # 'answer_embed_concat': graph.answers_embed_concat, + # 'noun_embed': graph.noun_embed['positive_nouns'], + # 'adjective_embed': graph.adjective_embed['positive_adjectives'], +# 'assert': graph.answer_inference.assert_op, + 'merged': graph.merged, + } + + print 'Creating logger...' + vars_to_save = graph.vars_to_save + logger = log_mgr( + graph, + graph.vars_to_save, + sess, + constants.answer_log_every_n_iter, + constants.answer_output_dir, + constants.answer_model) + + print 'Start training...' + train( + batch_generator, + sess, + initializer, + vars_to_eval_dict, + feed_dict_creator, + logger) + + + + + + diff --git a/constants_vision_gpu_2.py b/constants_vision_gpu_2.py index 556e91b4aee08c0622a8d19fef57518d11f264ce..aca86f81ae8aaa28205365432b1e1f3b853d9ef5 100644 --- a/constants_vision_gpu_2.py +++ b/constants_vision_gpu_2.py @@ -160,7 +160,7 @@ answer_offset = 0 answer_regularization_coeff = 1e-5 answer_queue_size = 500 answer_embedding_dim = 600 -answer_lr = 1e-4 +answer_lr = 1e-3 answer_log_every_n_iter = 500 answer_output_dir = os.path.join( global_experiment_dir,