Spaces:
Runtime error
Runtime error
| # Copyright 2016 The TensorFlow Authors All Rights Reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # ============================================================================== | |
| """Code for setting up the network for CMP. | |
| Sets up the mapper and the planner. | |
| """ | |
| import sys, os, numpy as np | |
| import matplotlib.pyplot as plt | |
| import copy | |
| import argparse, pprint | |
| import time | |
| import tensorflow as tf | |
| from tensorflow.contrib import slim | |
| from tensorflow.contrib.slim import arg_scope | |
| import logging | |
| from tensorflow.python.platform import app | |
| from tensorflow.python.platform import flags | |
| from src import utils | |
| import src.file_utils as fu | |
| import tfcode.nav_utils as nu | |
| import tfcode.cmp_utils as cu | |
| import tfcode.cmp_summary as cmp_s | |
| from tfcode import tf_utils | |
| value_iteration_network = cu.value_iteration_network | |
| rotate_preds = cu.rotate_preds | |
| deconv = cu.deconv | |
| get_visual_frustum = cu.get_visual_frustum | |
| fr_v2 = cu.fr_v2 | |
| setup_train_step_kwargs = nu.default_train_step_kwargs | |
| compute_losses_multi_or = nu.compute_losses_multi_or | |
| get_repr_from_image = nu.get_repr_from_image | |
| _save_d_at_t = nu.save_d_at_t | |
| _save_all = nu.save_all | |
| _eval_ap = nu.eval_ap | |
| _eval_dist = nu.eval_dist | |
| _plot_trajectories = nu.plot_trajectories | |
| _vis_readout_maps = cmp_s._vis_readout_maps | |
| _vis = cmp_s._vis | |
| _summary_vis = cmp_s._summary_vis | |
| _summary_readout_maps = cmp_s._summary_readout_maps | |
| _add_summaries = cmp_s._add_summaries | |
| def _inputs(problem): | |
| # Set up inputs. | |
| with tf.name_scope('inputs'): | |
| inputs = [] | |
| inputs.append(('orig_maps', tf.float32, | |
| (problem.batch_size, 1, None, None, 1))) | |
| inputs.append(('goal_loc', tf.float32, | |
| (problem.batch_size, problem.num_goals, 2))) | |
| common_input_data, _ = tf_utils.setup_inputs(inputs) | |
| inputs = [] | |
| if problem.input_type == 'vision': | |
| # Multiple images from an array of cameras. | |
| inputs.append(('imgs', tf.float32, | |
| (problem.batch_size, None, len(problem.aux_delta_thetas)+1, | |
| problem.img_height, problem.img_width, | |
| problem.img_channels))) | |
| elif problem.input_type == 'analytical_counts': | |
| for i in range(len(problem.map_crop_sizes)): | |
| inputs.append(('analytical_counts_{:d}'.format(i), tf.float32, | |
| (problem.batch_size, None, problem.map_crop_sizes[i], | |
| problem.map_crop_sizes[i], problem.map_channels))) | |
| if problem.outputs.readout_maps: | |
| for i in range(len(problem.readout_maps_crop_sizes)): | |
| inputs.append(('readout_maps_{:d}'.format(i), tf.float32, | |
| (problem.batch_size, None, | |
| problem.readout_maps_crop_sizes[i], | |
| problem.readout_maps_crop_sizes[i], | |
| problem.readout_maps_channels))) | |
| for i in range(len(problem.map_crop_sizes)): | |
| inputs.append(('ego_goal_imgs_{:d}'.format(i), tf.float32, | |
| (problem.batch_size, None, problem.map_crop_sizes[i], | |
| problem.map_crop_sizes[i], problem.goal_channels))) | |
| for s in ['sum_num', 'sum_denom', 'max_denom']: | |
| inputs.append(('running_'+s+'_{:d}'.format(i), tf.float32, | |
| (problem.batch_size, 1, problem.map_crop_sizes[i], | |
| problem.map_crop_sizes[i], problem.map_channels))) | |
| inputs.append(('incremental_locs', tf.float32, | |
| (problem.batch_size, None, 2))) | |
| inputs.append(('incremental_thetas', tf.float32, | |
| (problem.batch_size, None, 1))) | |
| inputs.append(('step_number', tf.int32, (1, None, 1))) | |
| inputs.append(('node_ids', tf.int32, (problem.batch_size, None, | |
| problem.node_ids_dim))) | |
| inputs.append(('perturbs', tf.float32, (problem.batch_size, None, | |
| problem.perturbs_dim))) | |
| # For plotting result plots | |
| inputs.append(('loc_on_map', tf.float32, (problem.batch_size, None, 2))) | |
| inputs.append(('gt_dist_to_goal', tf.float32, (problem.batch_size, None, 1))) | |
| step_input_data, _ = tf_utils.setup_inputs(inputs) | |
| inputs = [] | |
| inputs.append(('action', tf.int32, (problem.batch_size, None, problem.num_actions))) | |
| train_data, _ = tf_utils.setup_inputs(inputs) | |
| train_data.update(step_input_data) | |
| train_data.update(common_input_data) | |
| return common_input_data, step_input_data, train_data | |
| def readout_general(multi_scale_belief, num_neurons, strides, layers_per_block, | |
| kernel_size, batch_norm_is_training_op, wt_decay): | |
| multi_scale_belief = tf.stop_gradient(multi_scale_belief) | |
| with tf.variable_scope('readout_maps_deconv'): | |
| x, outs = deconv(multi_scale_belief, batch_norm_is_training_op, | |
| wt_decay=wt_decay, neurons=num_neurons, strides=strides, | |
| layers_per_block=layers_per_block, kernel_size=kernel_size, | |
| conv_fn=slim.conv2d_transpose, offset=0, | |
| name='readout_maps_deconv') | |
| probs = tf.sigmoid(x) | |
| return x, probs | |
| def running_combine(fss_logits, confs_probs, incremental_locs, | |
| incremental_thetas, previous_sum_num, previous_sum_denom, | |
| previous_max_denom, map_size, num_steps): | |
| # fss_logits is B x N x H x W x C | |
| # confs_logits is B x N x H x W x C | |
| # incremental_locs is B x N x 2 | |
| # incremental_thetas is B x N x 1 | |
| # previous_sum_num etc is B x 1 x H x W x C | |
| with tf.name_scope('combine_{:d}'.format(num_steps)): | |
| running_sum_nums_ = []; running_sum_denoms_ = []; | |
| running_max_denoms_ = []; | |
| fss_logits_ = tf.unstack(fss_logits, axis=1, num=num_steps) | |
| confs_probs_ = tf.unstack(confs_probs, axis=1, num=num_steps) | |
| incremental_locs_ = tf.unstack(incremental_locs, axis=1, num=num_steps) | |
| incremental_thetas_ = tf.unstack(incremental_thetas, axis=1, num=num_steps) | |
| running_sum_num = tf.unstack(previous_sum_num, axis=1, num=1)[0] | |
| running_sum_denom = tf.unstack(previous_sum_denom, axis=1, num=1)[0] | |
| running_max_denom = tf.unstack(previous_max_denom, axis=1, num=1)[0] | |
| for i in range(num_steps): | |
| # Rotate the previous running_num and running_denom | |
| running_sum_num, running_sum_denom, running_max_denom = rotate_preds( | |
| incremental_locs_[i], incremental_thetas_[i], map_size, | |
| [running_sum_num, running_sum_denom, running_max_denom], | |
| output_valid_mask=False)[0] | |
| # print i, num_steps, running_sum_num.get_shape().as_list() | |
| running_sum_num = running_sum_num + fss_logits_[i] * confs_probs_[i] | |
| running_sum_denom = running_sum_denom + confs_probs_[i] | |
| running_max_denom = tf.maximum(running_max_denom, confs_probs_[i]) | |
| running_sum_nums_.append(running_sum_num) | |
| running_sum_denoms_.append(running_sum_denom) | |
| running_max_denoms_.append(running_max_denom) | |
| running_sum_nums = tf.stack(running_sum_nums_, axis=1) | |
| running_sum_denoms = tf.stack(running_sum_denoms_, axis=1) | |
| running_max_denoms = tf.stack(running_max_denoms_, axis=1) | |
| return running_sum_nums, running_sum_denoms, running_max_denoms | |
| def get_map_from_images(imgs, mapper_arch, task_params, freeze_conv, wt_decay, | |
| is_training, batch_norm_is_training_op, num_maps, | |
| split_maps=True): | |
| # Hit image with a resnet. | |
| n_views = len(task_params.aux_delta_thetas) + 1 | |
| out = utils.Foo() | |
| images_reshaped = tf.reshape(imgs, | |
| shape=[-1, task_params.img_height, | |
| task_params.img_width, | |
| task_params.img_channels], name='re_image') | |
| x, out.vars_to_restore = get_repr_from_image( | |
| images_reshaped, task_params.modalities, task_params.data_augment, | |
| mapper_arch.encoder, freeze_conv, wt_decay, is_training) | |
| # Reshape into nice things so that these can be accumulated over time steps | |
| # for faster backprop. | |
| sh_before = x.get_shape().as_list() | |
| out.encoder_output = tf.reshape(x, shape=[task_params.batch_size, -1, n_views] + sh_before[1:]) | |
| x = tf.reshape(out.encoder_output, shape=[-1] + sh_before[1:]) | |
| # Add a layer to reduce dimensions for a fc layer. | |
| if mapper_arch.dim_reduce_neurons > 0: | |
| ks = 1; neurons = mapper_arch.dim_reduce_neurons; | |
| init_var = np.sqrt(2.0/(ks**2)/neurons) | |
| batch_norm_param = mapper_arch.batch_norm_param | |
| batch_norm_param['is_training'] = batch_norm_is_training_op | |
| out.conv_feat = slim.conv2d(x, neurons, kernel_size=ks, stride=1, | |
| normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_param, | |
| padding='SAME', scope='dim_reduce', | |
| weights_regularizer=slim.l2_regularizer(wt_decay), | |
| weights_initializer=tf.random_normal_initializer(stddev=init_var)) | |
| reshape_conv_feat = slim.flatten(out.conv_feat) | |
| sh = reshape_conv_feat.get_shape().as_list() | |
| out.reshape_conv_feat = tf.reshape(reshape_conv_feat, shape=[-1, sh[1]*n_views]) | |
| with tf.variable_scope('fc'): | |
| # Fully connected layers to compute the representation in top-view space. | |
| fc_batch_norm_param = {'center': True, 'scale': True, | |
| 'activation_fn':tf.nn.relu, | |
| 'is_training': batch_norm_is_training_op} | |
| f = out.reshape_conv_feat | |
| out_neurons = (mapper_arch.fc_out_size**2)*mapper_arch.fc_out_neurons | |
| neurons = mapper_arch.fc_neurons + [out_neurons] | |
| f, _ = tf_utils.fc_network(f, neurons=neurons, wt_decay=wt_decay, | |
| name='fc', offset=0, | |
| batch_norm_param=fc_batch_norm_param, | |
| is_training=is_training, | |
| dropout_ratio=mapper_arch.fc_dropout) | |
| f = tf.reshape(f, shape=[-1, mapper_arch.fc_out_size, | |
| mapper_arch.fc_out_size, | |
| mapper_arch.fc_out_neurons], name='re_fc') | |
| # Use pool5 to predict the free space map via deconv layers. | |
| with tf.variable_scope('deconv'): | |
| x, outs = deconv(f, batch_norm_is_training_op, wt_decay=wt_decay, | |
| neurons=mapper_arch.deconv_neurons, | |
| strides=mapper_arch.deconv_strides, | |
| layers_per_block=mapper_arch.deconv_layers_per_block, | |
| kernel_size=mapper_arch.deconv_kernel_size, | |
| conv_fn=slim.conv2d_transpose, offset=0, name='deconv') | |
| # Reshape x the right way. | |
| sh = x.get_shape().as_list() | |
| x = tf.reshape(x, shape=[task_params.batch_size, -1] + sh[1:]) | |
| out.deconv_output = x | |
| # Separate out the map and the confidence predictions, pass the confidence | |
| # through a sigmoid. | |
| if split_maps: | |
| with tf.name_scope('split'): | |
| out_all = tf.split(value=x, axis=4, num_or_size_splits=2*num_maps) | |
| out.fss_logits = out_all[:num_maps] | |
| out.confs_logits = out_all[num_maps:] | |
| with tf.name_scope('sigmoid'): | |
| out.confs_probs = [tf.nn.sigmoid(x) for x in out.confs_logits] | |
| return out | |
| def setup_to_run(m, args, is_training, batch_norm_is_training, summary_mode): | |
| assert(args.arch.multi_scale), 'removed support for old single scale code.' | |
| # Set up the model. | |
| tf.set_random_seed(args.solver.seed) | |
| task_params = args.navtask.task_params | |
| batch_norm_is_training_op = \ | |
| tf.placeholder_with_default(batch_norm_is_training, shape=[], | |
| name='batch_norm_is_training_op') | |
| # Setup the inputs | |
| m.input_tensors = {} | |
| m.train_ops = {} | |
| m.input_tensors['common'], m.input_tensors['step'], m.input_tensors['train'] = \ | |
| _inputs(task_params) | |
| m.init_fn = None | |
| if task_params.input_type == 'vision': | |
| m.vision_ops = get_map_from_images( | |
| m.input_tensors['step']['imgs'], args.mapper_arch, | |
| task_params, args.solver.freeze_conv, | |
| args.solver.wt_decay, is_training, batch_norm_is_training_op, | |
| num_maps=len(task_params.map_crop_sizes)) | |
| # Load variables from snapshot if needed. | |
| if args.solver.pretrained_path is not None: | |
| m.init_fn = slim.assign_from_checkpoint_fn(args.solver.pretrained_path, | |
| m.vision_ops.vars_to_restore) | |
| # Set up caching of vision features if needed. | |
| if args.solver.freeze_conv: | |
| m.train_ops['step_data_cache'] = [m.vision_ops.encoder_output] | |
| else: | |
| m.train_ops['step_data_cache'] = [] | |
| # Set up blobs that are needed for the computation in rest of the graph. | |
| m.ego_map_ops = m.vision_ops.fss_logits | |
| m.coverage_ops = m.vision_ops.confs_probs | |
| # Zero pad these to make them same size as what the planner expects. | |
| for i in range(len(m.ego_map_ops)): | |
| if args.mapper_arch.pad_map_with_zeros_each[i] > 0: | |
| paddings = np.zeros((5,2), dtype=np.int32) | |
| paddings[2:4,:] = args.mapper_arch.pad_map_with_zeros_each[i] | |
| paddings_op = tf.constant(paddings, dtype=tf.int32) | |
| m.ego_map_ops[i] = tf.pad(m.ego_map_ops[i], paddings=paddings_op) | |
| m.coverage_ops[i] = tf.pad(m.coverage_ops[i], paddings=paddings_op) | |
| elif task_params.input_type == 'analytical_counts': | |
| m.ego_map_ops = []; m.coverage_ops = [] | |
| for i in range(len(task_params.map_crop_sizes)): | |
| ego_map_op = m.input_tensors['step']['analytical_counts_{:d}'.format(i)] | |
| coverage_op = tf.cast(tf.greater_equal( | |
| tf.reduce_max(ego_map_op, reduction_indices=[4], | |
| keep_dims=True), 1), tf.float32) | |
| coverage_op = tf.ones_like(ego_map_op) * coverage_op | |
| m.ego_map_ops.append(ego_map_op) | |
| m.coverage_ops.append(coverage_op) | |
| m.train_ops['step_data_cache'] = [] | |
| num_steps = task_params.num_steps | |
| num_goals = task_params.num_goals | |
| map_crop_size_ops = [] | |
| for map_crop_size in task_params.map_crop_sizes: | |
| map_crop_size_ops.append(tf.constant(map_crop_size, dtype=tf.int32, shape=(2,))) | |
| with tf.name_scope('check_size'): | |
| is_single_step = tf.equal(tf.unstack(tf.shape(m.ego_map_ops[0]), num=5)[1], 1) | |
| fr_ops = []; value_ops = []; | |
| fr_intermediate_ops = []; value_intermediate_ops = []; | |
| crop_value_ops = []; | |
| resize_crop_value_ops = []; | |
| confs = []; occupancys = []; | |
| previous_value_op = None | |
| updated_state = []; state_names = []; | |
| for i in range(len(task_params.map_crop_sizes)): | |
| map_crop_size = task_params.map_crop_sizes[i] | |
| with tf.variable_scope('scale_{:d}'.format(i)): | |
| # Accumulate the map. | |
| fn = lambda ns: running_combine( | |
| m.ego_map_ops[i], | |
| m.coverage_ops[i], | |
| m.input_tensors['step']['incremental_locs'] * task_params.map_scales[i], | |
| m.input_tensors['step']['incremental_thetas'], | |
| m.input_tensors['step']['running_sum_num_{:d}'.format(i)], | |
| m.input_tensors['step']['running_sum_denom_{:d}'.format(i)], | |
| m.input_tensors['step']['running_max_denom_{:d}'.format(i)], | |
| map_crop_size, ns) | |
| running_sum_num, running_sum_denom, running_max_denom = \ | |
| tf.cond(is_single_step, lambda: fn(1), lambda: fn(num_steps*num_goals)) | |
| updated_state += [running_sum_num, running_sum_denom, running_max_denom] | |
| state_names += ['running_sum_num_{:d}'.format(i), | |
| 'running_sum_denom_{:d}'.format(i), | |
| 'running_max_denom_{:d}'.format(i)] | |
| # Concat the accumulated map and goal | |
| occupancy = running_sum_num / tf.maximum(running_sum_denom, 0.001) | |
| conf = running_max_denom | |
| # print occupancy.get_shape().as_list() | |
| # Concat occupancy, how much occupied and goal. | |
| with tf.name_scope('concat'): | |
| sh = [-1, map_crop_size, map_crop_size, task_params.map_channels] | |
| occupancy = tf.reshape(occupancy, shape=sh) | |
| conf = tf.reshape(conf, shape=sh) | |
| sh = [-1, map_crop_size, map_crop_size, task_params.goal_channels] | |
| goal = tf.reshape(m.input_tensors['step']['ego_goal_imgs_{:d}'.format(i)], shape=sh) | |
| to_concat = [occupancy, conf, goal] | |
| if previous_value_op is not None: | |
| to_concat.append(previous_value_op) | |
| x = tf.concat(to_concat, 3) | |
| # Pass the map, previous rewards and the goal through a few convolutional | |
| # layers to get fR. | |
| fr_op, fr_intermediate_op = fr_v2( | |
| x, output_neurons=args.arch.fr_neurons, | |
| inside_neurons=args.arch.fr_inside_neurons, | |
| is_training=batch_norm_is_training_op, name='fr', | |
| wt_decay=args.solver.wt_decay, stride=args.arch.fr_stride) | |
| # Do Value Iteration on the fR | |
| if args.arch.vin_num_iters > 0: | |
| value_op, value_intermediate_op = value_iteration_network( | |
| fr_op, num_iters=args.arch.vin_num_iters, | |
| val_neurons=args.arch.vin_val_neurons, | |
| action_neurons=args.arch.vin_action_neurons, | |
| kernel_size=args.arch.vin_ks, share_wts=args.arch.vin_share_wts, | |
| name='vin', wt_decay=args.solver.wt_decay) | |
| else: | |
| value_op = fr_op | |
| value_intermediate_op = [] | |
| # Crop out and upsample the previous value map. | |
| remove = args.arch.crop_remove_each | |
| if remove > 0: | |
| crop_value_op = value_op[:, remove:-remove, remove:-remove,:] | |
| else: | |
| crop_value_op = value_op | |
| crop_value_op = tf.reshape(crop_value_op, shape=[-1, args.arch.value_crop_size, | |
| args.arch.value_crop_size, | |
| args.arch.vin_val_neurons]) | |
| if i < len(task_params.map_crop_sizes)-1: | |
| # Reshape it to shape of the next scale. | |
| previous_value_op = tf.image.resize_bilinear(crop_value_op, | |
| map_crop_size_ops[i+1], | |
| align_corners=True) | |
| resize_crop_value_ops.append(previous_value_op) | |
| occupancys.append(occupancy) | |
| confs.append(conf) | |
| value_ops.append(value_op) | |
| crop_value_ops.append(crop_value_op) | |
| fr_ops.append(fr_op) | |
| fr_intermediate_ops.append(fr_intermediate_op) | |
| m.value_ops = value_ops | |
| m.value_intermediate_ops = value_intermediate_ops | |
| m.fr_ops = fr_ops | |
| m.fr_intermediate_ops = fr_intermediate_ops | |
| m.final_value_op = crop_value_op | |
| m.crop_value_ops = crop_value_ops | |
| m.resize_crop_value_ops = resize_crop_value_ops | |
| m.confs = confs | |
| m.occupancys = occupancys | |
| sh = [-1, args.arch.vin_val_neurons*((args.arch.value_crop_size)**2)] | |
| m.value_features_op = tf.reshape(m.final_value_op, sh, name='reshape_value_op') | |
| # Determine what action to take. | |
| with tf.variable_scope('action_pred'): | |
| batch_norm_param = args.arch.pred_batch_norm_param | |
| if batch_norm_param is not None: | |
| batch_norm_param['is_training'] = batch_norm_is_training_op | |
| m.action_logits_op, _ = tf_utils.fc_network( | |
| m.value_features_op, neurons=args.arch.pred_neurons, | |
| wt_decay=args.solver.wt_decay, name='pred', offset=0, | |
| num_pred=task_params.num_actions, | |
| batch_norm_param=batch_norm_param) | |
| m.action_prob_op = tf.nn.softmax(m.action_logits_op) | |
| init_state = tf.constant(0., dtype=tf.float32, shape=[ | |
| task_params.batch_size, 1, map_crop_size, map_crop_size, | |
| task_params.map_channels]) | |
| m.train_ops['state_names'] = state_names | |
| m.train_ops['updated_state'] = updated_state | |
| m.train_ops['init_state'] = [init_state for _ in updated_state] | |
| m.train_ops['step'] = m.action_prob_op | |
| m.train_ops['common'] = [m.input_tensors['common']['orig_maps'], | |
| m.input_tensors['common']['goal_loc']] | |
| m.train_ops['batch_norm_is_training_op'] = batch_norm_is_training_op | |
| m.loss_ops = []; m.loss_ops_names = []; | |
| if args.arch.readout_maps: | |
| with tf.name_scope('readout_maps'): | |
| all_occupancys = tf.concat(m.occupancys + m.confs, 3) | |
| readout_maps, probs = readout_general( | |
| all_occupancys, num_neurons=args.arch.rom_arch.num_neurons, | |
| strides=args.arch.rom_arch.strides, | |
| layers_per_block=args.arch.rom_arch.layers_per_block, | |
| kernel_size=args.arch.rom_arch.kernel_size, | |
| batch_norm_is_training_op=batch_norm_is_training_op, | |
| wt_decay=args.solver.wt_decay) | |
| gt_ego_maps = [m.input_tensors['step']['readout_maps_{:d}'.format(i)] | |
| for i in range(len(task_params.readout_maps_crop_sizes))] | |
| m.readout_maps_gt = tf.concat(gt_ego_maps, 4) | |
| gt_shape = tf.shape(m.readout_maps_gt) | |
| m.readout_maps_logits = tf.reshape(readout_maps, gt_shape) | |
| m.readout_maps_probs = tf.reshape(probs, gt_shape) | |
| # Add a loss op | |
| m.readout_maps_loss_op = tf.losses.sigmoid_cross_entropy( | |
| tf.reshape(m.readout_maps_gt, [-1, len(task_params.readout_maps_crop_sizes)]), | |
| tf.reshape(readout_maps, [-1, len(task_params.readout_maps_crop_sizes)]), | |
| scope='loss') | |
| m.readout_maps_loss_op = 10.*m.readout_maps_loss_op | |
| ewma_decay = 0.99 if is_training else 0.0 | |
| weight = tf.ones_like(m.input_tensors['train']['action'], dtype=tf.float32, | |
| name='weight') | |
| m.reg_loss_op, m.data_loss_op, m.total_loss_op, m.acc_ops = \ | |
| compute_losses_multi_or(m.action_logits_op, | |
| m.input_tensors['train']['action'], weights=weight, | |
| num_actions=task_params.num_actions, | |
| data_loss_wt=args.solver.data_loss_wt, | |
| reg_loss_wt=args.solver.reg_loss_wt, | |
| ewma_decay=ewma_decay) | |
| if args.arch.readout_maps: | |
| m.total_loss_op = m.total_loss_op + m.readout_maps_loss_op | |
| m.loss_ops += [m.readout_maps_loss_op] | |
| m.loss_ops_names += ['readout_maps_loss'] | |
| m.loss_ops += [m.reg_loss_op, m.data_loss_op, m.total_loss_op] | |
| m.loss_ops_names += ['reg_loss', 'data_loss', 'total_loss'] | |
| if args.solver.freeze_conv: | |
| vars_to_optimize = list(set(tf.trainable_variables()) - | |
| set(m.vision_ops.vars_to_restore)) | |
| else: | |
| vars_to_optimize = None | |
| m.lr_op, m.global_step_op, m.train_op, m.should_stop_op, m.optimizer, \ | |
| m.sync_optimizer = tf_utils.setup_training( | |
| m.total_loss_op, | |
| args.solver.initial_learning_rate, | |
| args.solver.steps_per_decay, | |
| args.solver.learning_rate_decay, | |
| args.solver.momentum, | |
| args.solver.max_steps, | |
| args.solver.sync, | |
| args.solver.adjust_lr_sync, | |
| args.solver.num_workers, | |
| args.solver.task, | |
| vars_to_optimize=vars_to_optimize, | |
| clip_gradient_norm=args.solver.clip_gradient_norm, | |
| typ=args.solver.typ, momentum2=args.solver.momentum2, | |
| adam_eps=args.solver.adam_eps) | |
| if args.arch.sample_gt_prob_type == 'inverse_sigmoid_decay': | |
| m.sample_gt_prob_op = tf_utils.inverse_sigmoid_decay(args.arch.isd_k, | |
| m.global_step_op) | |
| elif args.arch.sample_gt_prob_type == 'zero': | |
| m.sample_gt_prob_op = tf.constant(-1.0, dtype=tf.float32) | |
| elif args.arch.sample_gt_prob_type.split('_')[0] == 'step': | |
| step = int(args.arch.sample_gt_prob_type.split('_')[1]) | |
| m.sample_gt_prob_op = tf_utils.step_gt_prob( | |
| step, m.input_tensors['step']['step_number'][0,0,0]) | |
| m.sample_action_type = args.arch.action_sample_type | |
| m.sample_action_combine_type = args.arch.action_sample_combine_type | |
| m.summary_ops = { | |
| summary_mode: _add_summaries(m, args, summary_mode, | |
| args.summary.arop_full_summary_iters)} | |
| m.init_op = tf.group(tf.global_variables_initializer(), | |
| tf.local_variables_initializer()) | |
| m.saver_op = tf.train.Saver(keep_checkpoint_every_n_hours=4, | |
| write_version=tf.train.SaverDef.V2) | |
| return m | |