def inception_v3_parameters(weight_decay=0.00004, stddev=0.1, batch_norm_decay=0.9997, batch_norm_epsilon=0.001): """Yields the scope with the default parameters for inception_v3. Args: weight_decay: the weight decay for weights variables. stddev: standard deviation of the truncated guassian weight distribution. batch_norm_decay: decay for the moving average of batch_norm momentums. batch_norm_epsilon: small float added to variance to avoid dividing by zero. Yields: a arg_scope with the parameters needed for inception_v3. """ # Set weight_decay for weights in Conv and FC layers. with scopes.arg_scope([ops.conv2d, ops.fc], weight_decay=weight_decay): # Set stddev, activation and parameters for batch_norm. with scopes.arg_scope([ops.conv2d], stddev=stddev, activation=tf.nn.relu, batch_norm_params={ 'decay': batch_norm_decay, 'epsilon': batch_norm_epsilon }) as arg_scope: yield arg_scope
def testVariableCollectionsWithArgScopeNested(self): with self.test_session(): with scopes.arg_scope([variables.variable], collections='A'): a = variables.variable('a', []) with scopes.arg_scope([variables.variable], collections='B'): b = variables.variable('b', []) self.assertEquals(a, tf.get_collection('A')[0]) self.assertEquals(b, tf.get_collection('B')[0])
def testVariableCollectionsWithArgScopeNonNested(self): with self.test_session(): with scopes.arg_scope([variables.variable], collections='A'): a = variables.variable('a', []) with scopes.arg_scope([variables.variable], collections='B'): b = variables.variable('b', []) variables.variable('c', []) self.assertListEqual([a], tf.get_collection('A')) self.assertListEqual([b], tf.get_collection('B'))
def testVariableRestoreWithArgScopeNested(self): with self.test_session(): with scopes.arg_scope([variables.variable], restore=True): a = variables.variable('a', []) with scopes.arg_scope([variables.variable], trainable=False, collections=['A', 'B']): b = variables.variable('b', []) c = variables.variable('c', []) self.assertListEqual([a, b, c], variables.get_variables_to_restore()) self.assertListEqual([a, c], tf.trainable_variables()) self.assertListEqual([b], tf.get_collection('A')) self.assertListEqual([b], tf.get_collection('B'))
def inference(images, num_classes, for_training=False, restore_logits=True, scope=None): """Build Inception v3 model architecture. See here for reference: http://arxiv.org/abs/1512.00567 Args: images: Images returned from inputs() or distorted_inputs(). num_classes: number of classes for_training: If set to `True`, build the inference model for training. Kernels that operate differently for inference during training e.g. dropout, are appropriately configured. restore_logits: whether or not the logits layers should be restored. Useful for fine-tuning a model with different num_classes. scope: optional prefix string identifying the ImageNet tower. Returns: Logits. 2-D float Tensor. Auxiliary Logits. 2-D float Tensor of side-head. Used for training only. """ # Parameters for BatchNorm. batch_norm_params = { # Decay for the moving averages. 'decay': BATCHNORM_MOVING_AVERAGE_DECAY, # epsilon to prevent 0s in variance. 'epsilon': 0.001, } # Set weight_decay for weights in Conv and FC layers. with arg_scope([slim.ops.conv2d, slim.ops.fc], weight_decay=0.00004): with arg_scope([slim.ops.conv2d], stddev=0.1, activation=tf.nn.relu, batch_norm_params=batch_norm_params): logits, endpoints = slim.inception_v3.inception_v3( images, dropout_keep_prob=0.8, num_classes=num_classes, is_training=for_training, restore_logits=restore_logits, scope=scope) # Add summaries for viewing model statistics on TensorBoard. _activation_summaries(endpoints) # Grab the logits associated with the side head. Employed during training. auxiliary_logits = endpoints['aux_logits'] return logits, auxiliary_logits
def testVariableWithDeviceFunction(self): class DevFn(object): def __init__(self): self.counter = -1 def __call__(self, op): self.counter += 1 return 'cpu:%d' % self.counter with self.test_session(): with scopes.arg_scope([variables.variable], device=DevFn()): a = variables.variable('a', []) b = variables.variable('b', []) c = variables.variable('c', [], device='cpu:12') d = variables.variable('d', []) with tf.device('cpu:99'): e_init = tf.constant(12) e = variables.variable('e', initializer=e_init) self.assertDeviceEqual(a.device, 'cpu:0') self.assertDeviceEqual(a.initial_value.device, 'cpu:0') self.assertDeviceEqual(b.device, 'cpu:1') self.assertDeviceEqual(b.initial_value.device, 'cpu:1') self.assertDeviceEqual(c.device, 'cpu:12') self.assertDeviceEqual(c.initial_value.device, 'cpu:12') self.assertDeviceEqual(d.device, 'cpu:2') self.assertDeviceEqual(d.initial_value.device, 'cpu:2') self.assertDeviceEqual(e.device, 'cpu:3') self.assertDeviceEqual(e.initial_value.device, 'cpu:99')
def inference(inputs, is_training=True, scope=''): batch_norm_params = {'decay': 0.99, 'epsilon': 0.001} with scopes.arg_scope([ops.conv2d, ops.fc], weight_decay=0.0005, is_training=is_training, batch_norm_params=batch_norm_params): # get features from coarse layers coarse_features = coarse_layers(inputs) coarse_features_dim = coarse_features.get_shape()[1] # width # calculate saliency scores and extract top k coarse_output = top_layers(coarse_features) coarse_h = entropy(tf.nn.softmax(coarse_output)) coarse_grads = tf.gradients(coarse_h, coarse_features, name='gradient_entropy') top_k_values, top_k_idxs, M = identify_saliency(coarse_grads[0]) with tf.control_dependencies([top_k_idxs]): top_k_idxs = tf.identity(top_k_idxs) coarse_features = tf.identity(coarse_features) # get features from fine layers fine_features, src_idxs, k_patches = extract_features(inputs, top_k_idxs, coarse_features_dim) # merge two feature maps merged, flat_coarse, flat_fine = replace_features(coarse_features, fine_features, src_idxs) raw_hint_loss = tf.reduce_sum(tf.square(flat_coarse - flat_fine), name='raw_hint_loss') # scale hint loss per example in batch # still does not match range of 5-25 shown in figure 2 in paper??? hint_loss = tf.div( raw_hint_loss, inputs.get_shape()[0].value*N_PATCHES, name='objective_hint') tf.get_variable_scope().reuse_variables() final_logits = top_layers(merged) return final_logits, hint_loss
def deconv2d( inputs, output_shape, kernel_size=5, stride=2, padding='SAME', activation=tf.nn.relu, stddev=0.02, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None, reuse=None, ): with tf.variable_op_scope([inputs], scope, 'Deconv', reuse=reuse): kernel_h, kernel_w = _two_element_tuple(kernel_size) stride_h, stride_w = _two_element_tuple(stride) num_filters_in = inputs.get_shape()[-1] num_filters_out = output_shape[-1] weights_shape = [kernel_h, kernel_w, num_filters_out, num_filters_in] weights_initializer = tf.truncated_normal_initializer(stddev=stddev) l2_regularizer = None if weight_decay and weight_decay > 0: l2_regularizer = losses.l2_regularizer(weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) deconv = tf.nn.conv2d_transpose(inputs, weights, output_shape=output_shape, strides=[1, stride_h, stride_w, 1], padding=padding) if batch_norm_params is not None: with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(deconv, **batch_norm_params) else: bias_shape = [ num_filters_out, ] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.bias_add(deconv, biases) if activation: outputs = activation(outputs) return outputs
def discrim16(inp): with arg_scope([conv2d], batch_norm_params=batch_norm_params, stddev=0.02, activation=lrelu, weight_decay=1e-5): o = conv2d(inp, num_filters_out=32, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=32, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=32, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=32, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=32, kernel_size=(3, 3), stride=1) return fc(flatten(o), num_units_out=1, activation=tf.nn.sigmoid)
def testReuseFCWithBatchNorm(self): height, width = 3, 3 with self.test_session(): images = tf.random_uniform((5, height * width * 3), seed=1) with scopes.arg_scope([ops.fc], batch_norm_params={'decay': 0.9}): net = ops.fc(images, 27, scope='fc1') net = ops.fc(net, 27, scope='fc1', reuse=True) self.assertEquals(len(variables.get_variables()), 4) self.assertEquals(len(variables.get_variables('fc1/BatchNorm')), 3)
def conv_model(inputs, is_training=True, scope=''): # summaries or losses. net = {} with tf.op_scope([inputs], scope, 'mdm_conv'): with scopes.arg_scope([ops.conv2d, ops.fc], is_training=is_training): with scopes.arg_scope([ops.conv2d], activation=tf.nn.relu, padding='VALID'): net['conv_1'] = ops.conv2d(inputs, 32, [3, 3], scope='conv_1') net['pool_1'] = ops.max_pool(net['conv_1'], [2, 2]) net['conv_2'] = ops.conv2d(net['pool_1'], 32, [3, 3], scope='conv_2') net['pool_2'] = ops.max_pool(net['conv_2'], [2, 2]) crop_size = net['pool_2'].get_shape().as_list()[1:3] net['conv_2_cropped'] = utils.get_central_crop(net['conv_2'], box=crop_size) net['concat'] = tf.concat(3, [net['conv_2_cropped'], net['pool_2']]) return net
def conv_model(inputs, is_training=True, scope=''): # summaries or losses. net = {} with tf.name_scope(scope, 'mdm_conv', [inputs]): # 给下面op_name 加前缀mdm_conv 用with 语句解决资源释放问题 with scopes.arg_scope([ops.conv2d, ops.fc], is_training=is_training): with scopes.arg_scope([ops.conv2d], activation=tf.nn.relu, padding='VALID'): net['conv_1'] = ops.conv2d(inputs, 32, [3, 3], scope='conv_1') net['pool_1'] = ops.max_pool(net['conv_1'], [2, 2]) net['conv_2'] = ops.conv2d(net['pool_1'], 32, [3, 3], scope='conv_2') net['pool_2'] = ops.max_pool(net['conv_2'], [2, 2]) # 两个卷积层 每层32个过滤器 3*3核 # 每层卷积层后有一个2*2 的最大池化层 crop_size = net['pool_2'].get_shape().as_list()[1:3] net['conv_2_cropped'] = utils.get_central_crop(net['conv_2'], box=crop_size) # 中央作物的激活与第二池化层的输出, # 通过跳转链接concat连接起来,以保留更多相关本地信息,否则使用max池化层会丢失这些信息 net['concat'] = tf.concat([net['conv_2_cropped'], net['pool_2']], 3) # axis=3 return net
def conv2d_transpose(inputs, num_filters_out, kernel_size, stride=1, padding='SAME', activation=tf.nn.relu, stddev=0.01, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None, reuse=None): with tf.variable_op_scope([inputs], scope, 'Conv_Transpose', reuse=reuse): kernel_h, kernel_w = _two_element_tuple(kernel_size) stride_h, stride_w = _two_element_tuple(stride) num_filters_in = inputs.get_shape()[-1] weights_shape = [kernel_h, kernel_w, num_filters_out, num_filters_in] weights_initializer = tf.truncated_normal_initializer(stddev=stddev) l2_regularizer = None if weight_decay and weight_decay > 0: l2_regularizer = losses.l2_regularizer(weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) h = inputs.get_shape()[1].value w = inputs.get_shape()[2].value c = inputs.get_shape()[3].value output_shape = tf.concat(0, [tf.shape(inputs)[0:1], [h*stride[0], w*stride[1], num_filters_out]]) conv = tf.nn.conv2d_transpose(inputs, weights, strides=[1, stride_h, stride_w, 1], output_shape=output_shape, padding=padding) conv.set_shape((None, h*stride[0], w*stride[1], num_filters_out)) if batch_norm_params is not None: with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(conv, **batch_norm_params) else: bias_shape = [num_filters_out,] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.bias_add(conv, biases) if activation: outputs = activation(outputs) return outputs
def testFCWithBatchNorm(self): height, width = 3, 3 with self.test_session(): images = tf.random_uniform((5, height * width * 3), seed=1) with scopes.arg_scope([ops.fc], batch_norm_params={}): net = ops.fc(images, 27) net = ops.fc(net, 27) self.assertEquals(len(variables.get_variables()), 8) self.assertEquals(len(variables.get_variables('FC/BatchNorm')), 3) self.assertEquals(len(variables.get_variables('FC_1/BatchNorm')), 3)
def testReplicaDeviceSetter(self): device_fn = tf.train.replica_device_setter(2) with tf.Graph().as_default(): with scopes.arg_scope([variables.global_step], device=device_fn): gs = variables.global_step() gs2 = variables.global_step() self.assertEquals(gs, gs2) self.assertDeviceEqual(gs.device, '/job:ps/task:0') self.assertDeviceEqual(gs.initial_value.device, '/job:ps/task:0') self.assertDeviceEqual(gs2.device, '/job:ps/task:0') self.assertDeviceEqual(gs2.initial_value.device, '/job:ps/task:0')
def testVariableWithVariableDeviceChooser(self): with tf.Graph().as_default(): device_fn = variables.VariableDeviceChooser() with scopes.arg_scope([variables.global_step], device=device_fn): gs = variables.global_step() gs2 = variables.global_step() self.assertEquals(gs, gs2) self.assertDeviceEqual(gs.device, 'cpu:0') self.assertDeviceEqual(gs.initial_value.device, gs.device) self.assertDeviceEqual(gs2.device, 'cpu:0') self.assertDeviceEqual(gs2.initial_value.device, gs2.device)
def encoder(inp, z_dim): n = 32 with arg_scope([conv2d], batch_norm_params=batch_norm_params, stddev=0.02, activation=lrelu, weight_decay=1e-5): inp = inp-0.5 o = conv2d(inp, num_filters_out=n, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=1) flat = flatten(o) #flat = flatten(avg_pool(o, kernel_size=3)) z = fc(flat, num_units_out=z_dim, activation=tf.nn.tanh)/2+.5 return z
def conv_model(inputs, is_training=True, scope=''): # summaries or losses. net = {} with tf.name_scope(scope, 'Conv_lay', [inputs]): with scopes.arg_scope([ops.conv2d, ops.fc], is_training=is_training): with scopes.arg_scope([ops.conv2d], activation=tf.nn.relu, padding='VALID'): net['conv_1'] = ops.conv2d(inputs, 32, [7, 7], scope='conv_1') net['pool_1'] = ops.max_pool(net['conv_1'], [2, 2]) net['conv_2'] = ops.conv2d(net['pool_1'], 64, [3, 3], scope='conv_2') net['pool_2'] = ops.max_pool(net['conv_2'], [2, 2]) net['conv_3'] = ops.conv2d(net['pool_2'], 64, [3, 3], scope='conv_3') net['pool_3'] = ops.max_pool(net['conv_3'], [2, 2]) net['concat'] = net['pool_3'] return net
def testReuseConvWithBatchNorm(self): height, width = 3, 3 with self.test_session(): images = tf.random_uniform((5, height, width, 32), seed=1) with scopes.arg_scope([ops.conv2d], batch_norm_params={'decay': 0.9}): net = ops.conv2d(images, 32, [3, 3], scope='Conv') net = ops.conv2d(net, 32, [3, 3], scope='Conv', reuse=True) self.assertEquals(len(variables.get_variables()), 4) self.assertEquals(len(variables.get_variables('Conv/BatchNorm')), 3) self.assertEquals(len(variables.get_variables('Conv_1/BatchNorm')), 0)
def generator_context(z): n = 32 with arg_scope([conv2d, conv2d_transpose], batch_norm_params=batch_norm_params, stddev=0.02): z = z*2-1 d = 8 z = fc(z, num_units_out=d*d*32, batch_norm_params=batch_norm_params) c = z.get_shape()[1].value / (d*d) z = tf.reshape(z, (-1, d, d, c)) o = conv2d_transpose(z, n, (3, 3), stride=(2, 2)) o = conv2d_transpose(o, n, (3, 3), stride=(2, 2)) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=4, kernel_size=(3, 3), stride=1) attended = o return attended
def generator(z): n = 32 with arg_scope([conv2d, conv2d_transpose], batch_norm_params=batch_norm_params, stddev=0.02): z = z*2-1 d = 8 z = fc(z, num_units_out=d*d*32, batch_norm_params=batch_norm_params) c = z.get_shape()[1].value / (d*d) z = tf.reshape(z, (-1, d, d, c)) o = conv2d_transpose(z, n, (3, 3), stride=(2, 2)) o = conv2d_transpose(o, n, (3, 3), stride=(2, 2)) o = conv2d(o, num_filters_out=n*2, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=1, kernel_size=(3, 3), stride=1, padding="VALID", batch_norm_params=None) out = o[:, 1:29, 1:29, :] return out
def conv_model(inputs, is_training=True, scope=''): # summaries or losses. net = {} with tf.name_scope(scope, 'rdn_conv', [inputs]): with scopes.arg_scope([ops.conv2d, ops.fc], is_training=is_training): with scopes.arg_scope([ops.conv2d], activation=tf.nn.relu, padding='VALID'): net['conv_1'] = ops.conv2d(inputs, 32, [3, 3], scope='conv_1') net['pool_1'] = ops.max_pool(net['conv_1'], [2, 2]) net['conv_2'] = ops.conv2d(net['pool_1'], 32, [3, 3], scope='conv_2') net['pool_2'] = ops.max_pool(net['conv_2'], [2, 2]) crop_size = net['pool_2'].get_shape().as_list()[1:3] net['conv_2_cropped'] = utils.get_central_crop(net['conv_2'], box=crop_size) net['concat'] = tf.concat( [net['conv_2_cropped'], net['pool_2']], 3) return net
def inference(inputs, is_training=True, scope=''): if not is_training: tf.get_variable_scope().reuse_variables() batch_norm_params = {'decay': 0.99, 'epsilon': 0.001} with scopes.arg_scope([ops.conv2d, ops.fc], weight_decay=0.0005, is_training=is_training, batch_norm_params=batch_norm_params): coarse_features = coarse_layers(inputs) final_logits = top_layers(coarse_features) return final_logits, tf.constant(0.0)
def encoder(inp, z_dim): #n = 32 with arg_scope([conv2d, fc], batch_norm_params=batch_norm_params, stddev=0.02, activation=lrelu, weight_decay=1e-5): with tf.device("/gpu:%d"%FLAGS.gpu_num): inp = inp-0.5 o = conv2d(inp, num_filters_out=32, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=32, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=64, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=64, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=128, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=128, kernel_size=(3, 3), stride=1) flat = flatten(o) z = fc(flat, num_units_out=z_dim, activation=None) # normalized between -2 and 2 because of batchnorm return tf.nn.sigmoid(z * 2)
def inference(inputs, is_training=True, scope=''): if not is_training: tf.get_variable_scope().reuse_variables() batch_norm_params = {'decay': 0.99, 'epsilon': 0.001} #batch_norm_params = None with scopes.arg_scope([ops.conv2d, ops.fc], weight_decay=0.0005, is_training=is_training, batch_norm_params=batch_norm_params): fine_features = fine_layers(inputs) final_logits = top_layers(fine_features) return final_logits, tf.constant(0.0)
def discriminator(inp): n = 32 with arg_scope([conv2d], batch_norm_params=batch_norm_params, stddev=0.02, activation=lrelu, weight_decay=1e-5): inp = inp-0.5 o = conv2d(inp, num_filters_out=n, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=n*2, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n*2, kernel_size=(3, 3), stride=1) flat = flatten(o) #flat = flatten(avg_pool(o, kernel_size=3)) prob = fc(flat, num_units_out=1, activation=tf.nn.sigmoid) #prob = tf.Print(prob, [prob]) return prob
def testDeviceFn(self): class DevFn(object): def __init__(self): self.counter = -1 def __call__(self, op): self.counter += 1 return '/cpu:%d' % self.counter with tf.Graph().as_default(): with scopes.arg_scope([variables.global_step], device=DevFn()): gs = variables.global_step() gs2 = variables.global_step() self.assertDeviceEqual(gs.device, '/cpu:0') self.assertEquals(gs, gs2) self.assertDeviceEqual(gs2.device, '/cpu:0')
def cppn_func(inp, context, z): with arg_scope([fc], batch_norm_params=batch_norm_params, stddev=0.02): z = z*2 - 1 #n = 64 n = 32 h = inp[:, :, 0:1] w = inp[:, :, 1:2] r_h = sin_bank(h, 64, length=3) fc_h = three_fc(r_h, num_units_out=n) r_w = sin_bank(w, 64, length=3) fc_w = three_fc(r_w, num_units_out=n) d = tf.sqrt((h-0.5)**2 + (w-0.5)**2) r_d = sin_bank(d, 64, length=3) fc_d = three_fc(r_d, num_units_out=n) #fc_inp = three_fc(inp-0.5, num_units_out=n) pi = 3.1415 / 2.0 wh = tf.cos(pi) * h - tf.sin(w) r_wh = sin_bank(wh, 64, length=3) fc_wh = three_fc(r_wh, num_units_out=n) context_proc = fc(flatten(context), num_units_out=n) context_proc = tf.expand_dims(context_proc, 1) z_comb = fc(z, num_units_out=n) z_comb = tf.expand_dims(z_comb, 1) #res = (fc_h + fc_w + fc_d) * context_proc + z_comb res = (fc_h + fc_w + fc_d + fc_wh) + z_comb #res = (fc_h + fc_w + fc_d) + z_comb #res = (fc_h + fc_w + fc_d) + z_comb #res = fc_h + fc_w z_mul = fc(z, num_units_out=n) z_mul = tf.expand_dims(z_mul, 1) #res *= z_mul h = three_fc(res, num_units_out=n) h2 = three_fc(h, num_units_out=n) h3 = three_fc(h2, num_units_out=n) return three_fc(h3, num_units_out=1, batch_norm_params=None)
def encoder(inp, z_dim): #n = 32 with arg_scope([conv2d], batch_norm_params=batch_norm_params, stddev=0.02, activation=lrelu, weight_decay=1e-5): with tf.device("/gpu:%d"%FLAGS.gpu_num): inp = inp-0.5 n = 64*4 o = conv2d(inp, num_filters_out=n, kernel_size=(3, 3), stride=1) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=1) n = 128*4 o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=2) o = conv2d(o, num_filters_out=n, kernel_size=(3, 3), stride=1) flat = flatten(o) #flat = flatten(avg_pool(o, kernel_size=3)) #z = fc(flat, num_units_out=z_dim, activation=tf.nn.tanh)/2+.5 z = fc(flat, num_units_out=z_dim, activation=tf.nn.sigmoid) return z
def inference(inputs, is_training=True, scope=''): batch_norm_params = {'decay': 0.99, 'epsilon': 0.001} with scopes.arg_scope([ops.conv2d, ops.fc], weight_decay=0.0005, is_training=is_training, batch_norm_params=batch_norm_params): # get features from coarse layers coarse_features = coarse_layers(inputs) coarse_features_dim = coarse_features.get_shape()[1] # width # calculate saliency scores and extract top k coarse_output = top_layers(coarse_features) coarse_h = entropy(tf.nn.softmax(coarse_output)) coarse_grads = tf.gradients(coarse_h, coarse_features, name='gradient_entropy') top_k_values, top_k_idxs, M = identify_saliency(coarse_grads[0]) with tf.control_dependencies([top_k_idxs]): top_k_idxs = tf.identity(top_k_idxs) coarse_features = tf.identity(coarse_features) # get features from fine layers fine_features, src_idxs, k_patches = extract_features( inputs, top_k_idxs, coarse_features_dim) # merge two feature maps merged, flat_coarse, flat_fine = replace_features( coarse_features, fine_features, src_idxs) raw_hint_loss = tf.reduce_sum(tf.square(flat_coarse - flat_fine), name='raw_hint_loss') # scale hint loss per example in batch # still does not match range of 5-25 shown in figure 2 in paper??? hint_loss = tf.div(raw_hint_loss, inputs.get_shape()[0].value * N_PATCHES, name='objective_hint') tf.get_variable_scope().reuse_variables() final_logits = top_layers(merged) return final_logits, hint_loss
def testVariableGPUPlacement(self): with tf.Graph().as_default(): device_fn = variables.VariableDeviceChooser(placement='gpu:0') with scopes.arg_scope([variables.variable], device=device_fn): a = variables.variable('a', []) b = variables.variable('b', []) c = variables.variable('c', [], device='cpu:12') d = variables.variable('d', []) with tf.device('cpu:99'): e_init = tf.constant(12) e = variables.variable('e', initializer=e_init) # The values below highlight how the VariableDeviceChooser puts initial # values on the same device as the variable job. self.assertDeviceEqual(a.device, '/gpu:0') self.assertDeviceEqual(a.initial_value.device, a.device) self.assertDeviceEqual(b.device, '/gpu:0') self.assertDeviceEqual(b.initial_value.device, b.device) self.assertDeviceEqual(c.device, '/cpu:12') self.assertDeviceEqual(c.initial_value.device, c.device) self.assertDeviceEqual(d.device, '/gpu:0') self.assertDeviceEqual(d.initial_value.device, d.device) self.assertDeviceEqual(e.device, '/gpu:0') self.assertDeviceEqual(e.initial_value.device, '/cpu:99')
def conv2d(inputs, num_filters_out, kernel_size, stride=1, padding='SAME', activation=tf.nn.relu, stddev=0.01, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None, reuse=None): """Adds a 2D convolution followed by an optional batch_norm layer. conv2d creates a variable called 'weights', representing the convolutional kernel, that is convolved with the input. If `batch_norm_params` is None, a second variable called 'biases' is added to the result of the convolution operation. Args: inputs: a tensor of size [batch_size, height, width, channels]. num_filters_out: the number of output filters. kernel_size: a list of length 2: [kernel_height, kernel_width] of of the filters. Can be an int if both values are the same. stride: a list of length 2: [stride_height, stride_width]. Can be an int if both strides are the same. Note that presently both strides must have the same value. padding: one of 'VALID' or 'SAME'. activation: activation function. stddev: standard deviation of the truncated guassian weight distribution. bias: the initial value of the biases. weight_decay: the weight decay. batch_norm_params: parameters for the batch_norm. If is None don't use it. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. reuse: whether or not the layer and its variables should be reused. To be able to reuse the layer scope must be given. Returns: a tensor representing the output of the operation. """ with tf.variable_op_scope([inputs], scope, 'Conv', reuse=reuse): kernel_h, kernel_w = _two_element_tuple(kernel_size) stride_h, stride_w = _two_element_tuple(stride) num_filters_in = inputs.get_shape()[-1] weights_shape = [kernel_h, kernel_w, num_filters_in, num_filters_out] weights_initializer = tf.truncated_normal_initializer(stddev=stddev) l2_regularizer = None if weight_decay and weight_decay > 0: l2_regularizer = losses.l2_regularizer(weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) conv = tf.nn.conv2d(inputs, weights, [1, stride_h, stride_w, 1], padding=padding) if batch_norm_params is not None: with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(conv, **batch_norm_params) else: bias_shape = [num_filters_out,] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.bias_add(conv, biases) if activation: outputs = activation(outputs) return outputs
def conv2d(inputs, num_filters_out, kernel_size, stride=1, padding='SAME', activation=tf.nn.relu, initializer='normal', stddev=0.01, weights=0.0, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None): """Adds a 2D convolution followed by an optional batch_norm layer. conv2d creates a variable called 'weights', representing the convolutional kernel, that is convolved with the input. If `batch_norm_params` is None, a second variable called 'biases' is added to the result of the convolution operation. Args: inputs: a tensor of size [batch_size, height, width, channels]. num_filters_out: the number of output filters. kernel_size: a 2-D list comprising of the height and width of the filters. stride: the stride in height and width of the convolution. padding: one of 'VALID' or 'SAME'. activation: activation function. stddev: standard deviation of the truncated guassian weight distribution. bias: the initial value of the biases. weight_decay: the weight decay. batch_norm_params: parameters for the batch_norm. If is None don't use it. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. Returns: a tensor representing the output of the operation. Raises: ValueError: if 'kernel_size' is not a 2-D list. """ if len(kernel_size) != 2: raise ValueError('kernel_size must be a 2-D list.') with tf.variable_op_scope([inputs], scope, 'Conv'): num_filters_in = inputs.get_shape()[-1] weights_shape = [kernel_size[0], kernel_size[1], num_filters_in, num_filters_out] if initializer == 'normal': weights_initializer = tf.truncated_normal_initializer(stddev=stddev) elif initializer == 'constant': weights_initializer = tf.constant_initializer(weights) l2_regularizer = lambda t: losses.l2_loss(t, weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) conv = tf.nn.conv2d(inputs, weights, [1, stride, stride, 1], padding=padding) if batch_norm_params is not None: with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(conv, **batch_norm_params) else: bias_shape = [num_filters_out,] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.bias_add(conv, biases) if activation: outputs = activation(outputs) return outputs
def conv2d(inputs, num_filters_out, kernel_size, stride=1, padding='SAME', activation=tf.nn.relu, stddev=0.01, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None, reuse=None): """Adds a 2D convolution followed by an optional batch_norm layer. conv2d creates a variable called 'weights', representing the convolutional kernel, that is convolved with the input. If `batch_norm_params` is None, a second variable called 'biases' is added to the result of the convolution operation. Args: inputs: a tensor of size [batch_size, height, width, channels]. num_filters_out: the number of output filters. kernel_size: a list of length 2: [kernel_height, kernel_width] of of the filters. Can be an int if both values are the same. stride: a list of length 2: [stride_height, stride_width]. Can be an int if both strides are the same. Note that presently both strides must have the same value. padding: one of 'VALID' or 'SAME'. activation: activation function. stddev: standard deviation of the truncated guassian weight distribution. bias: the initial value of the biases. weight_decay: the weight decay. batch_norm_params: parameters for the batch_norm. If is None don't use it. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. reuse: whether or not the layer and its variables should be reused. To be able to reuse the layer scope must be given. Returns: a tensor representing the output of the operation. """ with tf.variable_op_scope([inputs], scope, 'Conv', reuse=reuse): kernel_h, kernel_w = _two_element_tuple(kernel_size) stride_h, stride_w = _two_element_tuple(stride) num_filters_in = inputs.get_shape()[-1] weights_shape = [kernel_h, kernel_w, num_filters_in, num_filters_out] weights_initializer = tf.truncated_normal_initializer(stddev=stddev) l2_regularizer = None if weight_decay and weight_decay > 0: l2_regularizer = losses.l2_regularizer(weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) conv = tf.nn.conv2d(inputs, weights, [1, stride_h, stride_w, 1], padding=padding) if batch_norm_params is not None: with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(conv, **batch_norm_params) else: bias_shape = [ num_filters_out, ] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.bias_add(conv, biases) if activation: outputs = activation(outputs) return outputs
def fc(inputs, num_units_out, activation=tf.nn.relu, stddev=0.01, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None, reuse=None): """Adds a fully connected layer followed by an optional batch_norm layer. FC creates a variable called 'weights', representing the fully connected weight matrix, that is multiplied by the input. If `batch_norm` is None, a second variable called 'biases' is added to the result of the initial vector-matrix multiplication. Args: inputs: a [B x N] tensor where B is the batch size and N is the number of input units in the layer. num_units_out: the number of output units in the layer. activation: activation function. stddev: the standard deviation for the weights. bias: the initial value of the biases. weight_decay: the weight decay. batch_norm_params: parameters for the batch_norm. If is None don't use it. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. reuse: whether or not the layer and its variables should be reused. To be able to reuse the layer scope must be given. Returns: the tensor variable representing the result of the series of operations. """ with tf.variable_op_scope([inputs], scope, 'FC', reuse=reuse): num_units_in = inputs.get_shape()[1] weights_shape = [num_units_in, num_units_out] weights_initializer = tf.truncated_normal_initializer(stddev=stddev) l2_regularizer = None if weight_decay and weight_decay > 0: l2_regularizer = losses.l2_regularizer(weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) if batch_norm_params is not None: outputs = tf.matmul(inputs, weights) with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(outputs, **batch_norm_params) else: bias_shape = [ num_units_out, ] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.xw_plus_b(inputs, weights, biases) if activation: outputs = activation(outputs) return outputs
def conv2d(inputs, num_filters_out, kernel_size, stride=1, padding='SAME', activation=tf.nn.relu, initializer='normal', stddev=0.01, weights=0.0, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None): """Adds a 2D convolution followed by an optional batch_norm layer. conv2d creates a variable called 'weights', representing the convolutional kernel, that is convolved with the input. If `batch_norm_params` is None, a second variable called 'biases' is added to the result of the convolution operation. Args: inputs: a tensor of size [batch_size, height, width, channels]. num_filters_out: the number of output filters. kernel_size: a 2-D list comprising of the height and width of the filters. stride: the stride in height and width of the convolution. padding: one of 'VALID' or 'SAME'. activation: activation function. stddev: standard deviation of the truncated guassian weight distribution. bias: the initial value of the biases. weight_decay: the weight decay. batch_norm_params: parameters for the batch_norm. If is None don't use it. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. Returns: a tensor representing the output of the operation. Raises: ValueError: if 'kernel_size' is not a 2-D list. """ if len(kernel_size) != 2: raise ValueError('kernel_size must be a 2-D list.') with tf.variable_op_scope([inputs], scope, 'Conv'): num_filters_in = inputs.get_shape()[-1] weights_shape = [ kernel_size[0], kernel_size[1], num_filters_in, num_filters_out ] if initializer == 'normal': weights_initializer = tf.truncated_normal_initializer( stddev=stddev) elif initializer == 'constant': weights_initializer = tf.constant_initializer(weights) l2_regularizer = lambda t: losses.l2_loss(t, weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) conv = tf.nn.conv2d(inputs, weights, [1, stride, stride, 1], padding=padding) if batch_norm_params is not None: with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(conv, **batch_norm_params) else: bias_shape = [ num_filters_out, ] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.bias_add(conv, biases) if activation: outputs = activation(outputs) return outputs
def train(dataset): """Train on dataset for a number of steps.""" with tf.Graph().as_default(), tf.device('/cpu:0'): # Create a variable to count the number of train() calls. This equals the # number of batches processed * FLAGS.num_gpus. global_step = tf.get_variable('global_step', [], initializer=tf.constant_initializer(0), trainable=False) # Calculate the learning rate schedule. num_batches_per_epoch = (dataset.num_examples_per_epoch() / FLAGS.batch_size) decay_steps = int(num_batches_per_epoch * FLAGS.num_epochs_per_decay) # Decay the learning rate exponentially based on the number of steps. lr = tf.train.exponential_decay(FLAGS.initial_learning_rate, global_step, decay_steps, FLAGS.learning_rate_decay_factor, staircase=True) # Create an optimizer that performs gradient descent. #opt = tf.train.RMSPropOptimizer(lr, RMSPROP_DECAY, # momentum=RMSPROP_MOMENTUM, # epsilon=RMSPROP_EPSILON) opt = tf.train.GradientDescentOptimizer(learning_rate=lr) # Get images and labels for ImageNet and split the batch across GPUs. assert FLAGS.batch_size % FLAGS.num_gpus == 0, ( 'Batch size must be divisible by number of GPUs') split_batch_size = int(FLAGS.batch_size / FLAGS.num_gpus) # Override the number of preprocessing threads to account for the increased # number of GPU towers. num_preprocess_threads = FLAGS.num_preprocess_threads * FLAGS.num_gpus images, labels = image_processing.distorted_inputs( dataset, num_preprocess_threads=num_preprocess_threads) input_summaries = copy.copy(tf.get_collection(tf.GraphKeys.SUMMARIES)) # Number of classes in the Dataset label set plus 1. # Label 0 is reserved for an (unused) background class. num_classes = dataset.num_classes() + 1 # Split the batch of images and labels for towers. images_splits = tf.split(axis=0, num_or_size_splits=FLAGS.num_gpus, value=images) labels_splits = tf.split(axis=0, num_or_size_splits=FLAGS.num_gpus, value=labels) # Calculate the gradients for each model tower. tower_grads = [] reuse_variables = None for i in range(FLAGS.num_gpus): with tf.device('/gpu:%d' % i): with tf.name_scope('%s_%d' % (inception.TOWER_NAME, i)) as scope: # Force all Variables to reside on the CPU. with arg_scope([slim.variables.variable], device='/cpu:0'): # Calculate the loss for one tower of the ImageNet model. This # function constructs the entire ImageNet model but shares the # variables across all towers. loss = _tower_loss(images_splits[i], labels_splits[i], num_classes, scope, reuse_variables) # Reuse variables for the next tower. reuse_variables = True # Retain the summaries from the final tower. summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, scope) # Retain the Batch Normalization updates operations only from the # final tower. Ideally, we should grab the updates from all towers # but these stats accumulate extremely fast so we can ignore the # other stats from the other towers without significant detriment. batchnorm_updates = tf.get_collection( slim.ops.UPDATE_OPS_COLLECTION, scope) # Calculate the gradients for the batch of data on this ImageNet # tower. grads = opt.compute_gradients(loss) # Keep track of the gradients across all towers. tower_grads.append(grads) # We must calculate the mean of each gradient. Note that this is the # synchronization point across all towers. grads = _average_gradients(tower_grads) # Add a summaries for the input processing and global_step. summaries.extend(input_summaries) # Add a summary to track the learning rate. summaries.append(tf.summary.scalar('learning_rate', lr)) # Add histograms for gradients. for grad, var in grads: if grad is not None: summaries.append( tf.summary.histogram(var.op.name + '/gradients', grad)) # Apply the gradients to adjust the shared variables. apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) # Add histograms for trainable variables. for var in tf.trainable_variables(): summaries.append(tf.summary.histogram(var.op.name, var)) # Track the moving averages of all trainable variables. # Note that we maintain a "double-average" of the BatchNormalization # global statistics. This is more complicated then need be but we employ # this for backward-compatibility with our previous models. variable_averages = tf.train.ExponentialMovingAverage( inception.MOVING_AVERAGE_DECAY, global_step) # Another possibility is to use tf.slim.get_variables(). variables_to_average = (tf.trainable_variables() + tf.moving_average_variables()) variables_averages_op = variable_averages.apply(variables_to_average) # Group all updates to into a single train op. batchnorm_updates_op = tf.group(*batchnorm_updates) train_op = tf.group(apply_gradient_op, variables_averages_op, batchnorm_updates_op) # Create a saver. saver = tf.train.Saver(tf.global_variables()) # Build the summary operation from the last tower summaries. summary_op = tf.summary.merge(summaries) # Build an initialization operation to run below. init = tf.global_variables_initializer() # Start running operations on the Graph. allow_soft_placement must be set to # True to build towers on GPU, as some of the ops do not have GPU # implementations. sess = tf.Session(config=tf.ConfigProto( allow_soft_placement=True, log_device_placement=FLAGS.log_device_placement)) sess.run(init) if FLAGS.pretrained_model_checkpoint_path: assert tf.gfile.Exists(FLAGS.pretrained_model_checkpoint_path) variables_to_restore = tf.get_collection( slim.variables.VARIABLES_TO_RESTORE) restorer = tf.train.Saver(variables_to_restore) restorer.restore(sess, FLAGS.pretrained_model_checkpoint_path) print('%s: Pre-trained model restored from %s' % (datetime.now(), FLAGS.pretrained_model_checkpoint_path)) # Start the queue runners. tf.train.start_queue_runners(sess=sess) summary_writer = tf.summary.FileWriter(FLAGS.train_dir, graph=sess.graph) for step in range(FLAGS.max_steps): start_time = time.time() _, loss_value = sess.run([train_op, loss]) duration = time.time() - start_time assert not np.isnan(loss_value), 'Model diverged with loss = NaN' if step % 10 == 0: examples_per_sec = FLAGS.batch_size / float(duration) format_str = ( '%s: step %d, loss = %.2f (%.1f examples/sec; %.3f ' 'sec/batch)') print(format_str % (datetime.now(), step, loss_value, examples_per_sec, duration)) if step % 100 == 0: summary_str = sess.run(summary_op) summary_writer.add_summary(summary_str, step) # Save the model checkpoint periodically. if step % 500 == 0 or (step + 1) == FLAGS.max_steps: checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt') saver.save(sess, checkpoint_path, global_step=step)
def cppn_func(inp, z): with arg_scope([fc], #batch_norm_params=batch_norm_params, stddev=0.02): z = z*2 - 1 #n = 32 n = 128 length = 20 h = inp[:, :, 0:1] w = inp[:, :, 1:2] r_h = sin_bank(h, 64, length=length) fc_h = three_fc(r_h, num_units_out=n) r_w = sin_bank(w, 64, length=length) fc_w = three_fc(r_w, num_units_out=n) d = tf.sqrt((h-0.5)**2 + (w-0.5)**2) r_d = sin_bank(d, 64, length=length) fc_d = three_fc(r_d, num_units_out=n) pi = 3.1415 n_angles = 64 length = 20 theta = tf.get_variable("rotations", dtype=tf.float32, shape=[n_angles,], initializer=tf.random_uniform_initializer(0.0, pi*2)) wh = tf.cos(theta) * h - tf.sin(theta)*w r_wh = sin_bank(wh, n_angles, length=length) fc_wh = three_fc(r_wh, num_units_out=n) length = 50 n_angles = 64 theta = tf.get_variable("rotations2", dtype=tf.float32, shape=[n_angles,], initializer=tf.random_uniform_initializer(0.0, pi*2)) wh_hf = tf.cos(theta) * h - tf.sin(theta)*w r_wh_hf = sin_bank(wh_hf, n_angles, length=length) fc_wh_hf = three_fc(r_wh_hf, num_units_out=n) n_angles = 128 trainable = True z_angle = fc(z, num_units_out=n_angles, activation=None, stddev=0.1, trainable=trainable)*10 z_angle = tf.expand_dims(z_angle, 1) z_scale = fc(z, num_units_out=n_angles, activation=None, stddev=0.1, trainable=trainable)*10 z_scale = tf.expand_dims(z_scale, 1) z_shift = fc(z, num_units_out=n_angles, activation=None, stddev=0.1, trainable=trainable)*10 z_shift = tf.expand_dims(z_shift, 1) rot_z = tf.cos(z_angle) * h - tf.sin(z_angle)*w fc_zangle = tf.sin(rot_z*z_scale + z_shift) fc_zangle_proj = three_fc(fc_zangle, num_units_out=n) z_angle = fc(z, num_units_out=n_angles, activation=None, stddev=0.1, trainable=trainable)*10 z_angle = tf.expand_dims(z_angle, 1) z_scale = fc(z, num_units_out=n_angles, activation=None, stddev=0.1, trainable=trainable)*4 z_scale = tf.expand_dims(z_scale, 1) z_shift = fc(z, num_units_out=n_angles, activation=None, stddev=0.1, trainable=trainable)*4 z_shift = tf.expand_dims(z_shift, 1) rot_z = tf.cos(z_angle) * h - tf.sin(z_angle)*w fc_zangle = tf.sin(rot_z*z_scale + z_shift) fc_zangle_proj_large = three_fc(fc_zangle, num_units_out=n) z_comb = fc(z, num_units_out=n) z_comb = tf.expand_dims(z_comb, 1) #res = (fc_h + fc_w + fc_d) * context_proc + z_comb #res = (fc_h + fc_w + fc_d + fc_wh) + z_comb #res = (fc_wh + fc_wh_hf) + z_comb #res = (fc_wh + fc_wh_hf + fc_d + fc_zangle_proj) + z_comb #res = (fc_zangle_proj + fc_zangle_proj_large) + z_comb res = (fc_wh + fc_wh_hf + fc_d + fc_zangle_proj + fc_zangle_proj_large) + z_comb #res = (fc_h + fc_w + fc_d) + z_comb #res = (fc_h + fc_w + fc_d) + z_comb #res = fc_h + fc_w z_mul = fc(z, num_units_out=n) z_mul = tf.expand_dims(z_mul, 1) #res *= z_mul with arg_scope([fc], batch_norm_params=batch_norm_params, stddev=0.02): n = 64 h = three_fc(res, num_units_out=n) h2 = three_fc(h, num_units_out=n) #h3 = three_fc(h2, num_units_out=n) return three_fc(h2, num_units_out=3, batch_norm_params=None) * 0.5 + 0.5
def batch_norm(inputs, decay=0.999, scale=False, epsilon=0.001, moving_vars='moving_vars', activation=None, is_training=True, trainable=True, restore=True, scope=None): """Adds a Batch Normalization layer. Args: inputs: a tensor of size [batch_size, height, width, channels] or [batch_size, channels]. decay: decay for the moving average. scale: If True, multiply by gamma. If False, gamma is not used. When the next layer is linear (also e.g. ReLU), this can be disabled since the scaling can be done by the next layer. epsilon: small float added to variance to avoid dividing by zero. moving_vars: collection to store the moving_mean and moving_variance. activation: activation function. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. Returns: a tensor representing the output of the operation. """ inputs_shape = inputs.get_shape() with tf.variable_op_scope([inputs], scope, 'BatchNorm'): axis = range(len(inputs_shape) - 1) params_shape = inputs_shape[-1:] with scopes.arg_scope([variables.variable], restore=restore): # Allocate parameters for the beta and gamma of the normalization. beta = variables.variable('beta', params_shape, initializer=tf.zeros_initializer, trainable=trainable) if scale: gamma = variables.variable('gamma', params_shape, initializer=tf.ones, trainable=trainable) else: gamma = None # Create moving_mean and moving_variance add them to moving_vars and # GraphKeys.MOVING_AVERAGE_VARIABLES collections. with scopes.arg_scope([variables.variable], trainable=False, collections=[ moving_vars, tf.GraphKeys.MOVING_AVERAGE_VARIABLES ]): moving_mean = variables.variable( 'moving_mean', params_shape, initializer=tf.zeros_initializer) moving_variance = variables.variable('moving_variance', params_shape, initializer=tf.ones) if is_training: # Calculate the moments based on the individual batch. mean, variance = tf.nn.moments(inputs, axis) update_moving_mean = moving_averages.assign_moving_average( moving_mean, mean, decay) tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_mean) update_moving_variance = moving_averages.assign_moving_average( moving_variance, variance, decay) tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_variance) else: # Just use the moving_mean and moving_variance. mean = moving_mean variance = moving_variance # Normalize the activations. outputs = tf.nn.batch_normalization(inputs, mean, variance, beta, gamma, epsilon) outputs.set_shape(inputs.get_shape()) if activation: outputs = activation(outputs) return outputs
def cppn_func(inp, context, z): with arg_scope([fc], batch_norm_params=batch_norm_params, stddev=0.02): z = z*2 - 1 n = 32 n = 64 n = 128 length = 20 h = inp[:, :, 0:1] w = inp[:, :, 1:2] r_h = sin_bank(h, 64, length=length) fc_h = three_fc(r_h, num_units_out=n) r_w = sin_bank(w, 64, length=length) fc_w = three_fc(r_w, num_units_out=n) d = tf.sqrt((h-0.5)**2 + (w-0.5)**2) r_d = sin_bank(d, 64, length=length) fc_d = three_fc(r_d, num_units_out=n) #fc_inp = three_fc(inp-0.5, num_units_out=n) pi = 3.1415 n_angles = 128 length = 20 theta = tf.get_variable("rotations", dtype=tf.float32, shape=[n_angles,], initializer=tf.random_uniform_initializer(0.0, pi*2)) wh = tf.cos(theta) * h - tf.sin(theta)*w r_wh = sin_bank(wh, n_angles, length=length) fc_wh = three_fc(r_wh, num_units_out=n) length = 100 n_angles = 64 theta = tf.get_variable("rotations2", dtype=tf.float32, shape=[n_angles,], initializer=tf.random_uniform_initializer(0.0, pi*2)) wh_hf = tf.cos(theta) * h - tf.sin(theta)*w r_wh_hf = sin_bank(wh_hf, n_angles, length=length) fc_wh_hf = three_fc(r_wh_hf, num_units_out=n) context_proc = fc(flatten(context), num_units_out=n) context_proc = tf.expand_dims(context_proc, 1) z_comb = fc(z, num_units_out=n) z_comb = tf.expand_dims(z_comb, 1) #res = (fc_h + fc_w + fc_d) * context_proc + z_comb #res = (fc_h + fc_w + fc_d + fc_wh) + z_comb #res = (fc_wh + fc_wh_hf) + z_comb res = (fc_wh + fc_wh_hf + fc_d) + z_comb #res = (fc_h + fc_w + fc_d) + z_comb #res = (fc_h + fc_w + fc_d) + z_comb #res = fc_h + fc_w z_mul = fc(z, num_units_out=n) z_mul = tf.expand_dims(z_mul, 1) #res *= z_mul h = three_fc(res, num_units_out=n) h2 = three_fc(h, num_units_out=n) h3 = three_fc(h2, num_units_out=n) return three_fc(h3, num_units_out=3, batch_norm_params=None)
def testDevice(self): with tf.Graph().as_default(): with scopes.arg_scope([variables.global_step], device='/gpu:0'): gs = variables.global_step() self.assertDeviceEqual(gs.device, '/gpu:0')
def fc(inputs, num_units_out, activation=tf.nn.relu, initializer='normal', stddev=0.01, weights=0.0, bias=0.0, weight_decay=0, batch_norm_params=None, is_training=True, trainable=True, restore=True, scope=None): """Adds a fully connected layer followed by an optional batch_norm layer. FC creates a variable called 'weights', representing the fully connected weight matrix, that is multiplied by the input. If `batch_norm` is None, a second variable called 'biases' is added to the result of the initial vector-matrix multiplication. Args: inputs: a [B x N] tensor where B is the batch size and N is the number of input units in the layer. num_units_out: the number of output units in the layer. activation: activation function. stddev: the standard deviation for the weights. bias: the initial value of the biases. weight_decay: the weight decay. batch_norm_params: parameters for the batch_norm. If is None don't use it. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. Returns: the tensor variable representing the result of the series of operations. """ with tf.variable_op_scope([inputs], scope, 'FC'): num_units_in = inputs.get_shape()[1] weights_shape = [num_units_in, num_units_out] if initializer == 'normal': weights_initializer = tf.truncated_normal_initializer(stddev=stddev) elif initializer == 'constant': weights_initializer = tf.constant_initializer(weights) l2_regularizer = lambda t: losses.l2_loss(t, weight_decay) weights = variables.variable('weights', shape=weights_shape, initializer=weights_initializer, regularizer=l2_regularizer, trainable=trainable, restore=restore) if batch_norm_params is not None: outputs = tf.matmul(inputs, weights) with scopes.arg_scope([batch_norm], is_training=is_training, trainable=trainable, restore=restore): outputs = batch_norm(outputs, **batch_norm_params) else: bias_shape = [num_units_out,] bias_initializer = tf.constant_initializer(bias) biases = variables.variable('biases', shape=bias_shape, initializer=bias_initializer, trainable=trainable, restore=restore) outputs = tf.nn.xw_plus_b(inputs, weights, biases) if activation: outputs = activation(outputs) return outputs
def batch_norm(inputs, decay=0.999, scale=False, epsilon=0.001, moving_vars='moving_vars', activation=None, is_training=True, trainable=True, restore=True, scope=None): """Adds a Batch Normalization layer. Args: inputs: a tensor of size [batch_size, height, width, channels] or [batch_size, channels]. decay: decay for the moving average. scale: If True, multiply by gamma. If False, gamma is not used. When the next layer is linear (also e.g. ReLU), this can be disabled since the scaling can be done by the next layer. epsilon: small float added to variance to avoid dividing by zero. moving_vars: collection to store the moving_mean and moving_variance. activation: activation function. is_training: whether or not the model is in training mode. trainable: whether or not the variables should be trainable or not. restore: whether or not the variables should be marked for restore. scope: Optional scope for variable_op_scope. Returns: a tensor representing the output of the operation. """ inputs_shape = inputs.get_shape() with tf.variable_op_scope([inputs], scope, 'BatchNorm'): axis = range(len(inputs_shape) - 1) params_shape = inputs_shape[-1:] with scopes.arg_scope([variables.variable], restore=restore): # Allocate parameters for the beta and gamma of the normalization. beta = variables.variable('beta', params_shape, initializer=tf.zeros_initializer, trainable=trainable) if scale: gamma = variables.variable('gamma', params_shape, initializer=tf.ones, trainable=trainable) else: gamma = None # Create moving_mean and moving_variance add them to moving_vars and # GraphKeys.MOVING_AVERAGE_VARIABLES collections. with scopes.arg_scope([variables.variable], trainable=False, collections=[ moving_vars, tf.GraphKeys.MOVING_AVERAGE_VARIABLES]): moving_mean = variables.variable('moving_mean', params_shape, initializer=tf.zeros_initializer) moving_variance = variables.variable('moving_variance', params_shape, initializer=tf.ones) if is_training: # Calculate the moments based on the individual batch. mean, variance = tf.nn.moments(inputs, axis) update_moving_mean = moving_averages.assign_moving_average( moving_mean, mean, decay) tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_mean) update_moving_variance = moving_averages.assign_moving_average( moving_variance, variance, decay) tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_variance) else: # Just use the moving_mean and moving_variance. mean = moving_mean variance = moving_variance # Normalize the activations. outputs = tf.nn.batch_normalization( inputs, mean, variance, beta, gamma, epsilon) outputs.set_shape(inputs.get_shape()) if activation: outputs = activation(outputs) return outputs
def inception_v3(inputs, dropout_keep_prob=0.8, num_classes=1000, is_training=True, restore_logits=True, scope=''): """Latest Inception from http://arxiv.org/abs/1512.00567. "Rethinking the Inception Architecture for Computer Vision" Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, Zbigniew Wojna Args: inputs: a tensor of size [batch_size, height, width, channels]. dropout_keep_prob: dropout keep_prob. num_classes: number of predicted classes. is_training: whether is training or not. restore_logits: whether or not the logits layers should be restored. Useful for fine-tuning a model with different num_classes. scope: Optional scope for name_scope. Returns: a list containing 'logits', 'aux_logits' Tensors. """ # end_points will collect relevant activations for external use, for example # summaries or losses. end_points = {} with tf.name_scope(scope, 'inception_v3', [inputs]): with scopes.arg_scope( [ops.conv2d, ops.fc, ops.batch_norm, ops.dropout], is_training=is_training): with scopes.arg_scope([ops.conv2d, ops.max_pool, ops.avg_pool], stride=1, padding='VALID'): # 299 x 299 x 3 end_points['conv0'] = ops.conv2d(inputs, 32, [3, 3], stride=2, scope='conv0') # 149 x 149 x 32 end_points['conv1'] = ops.conv2d(end_points['conv0'], 32, [3, 3], scope='conv1') # 147 x 147 x 32 end_points['conv2'] = ops.conv2d(end_points['conv1'], 64, [3, 3], padding='SAME', scope='conv2') # 147 x 147 x 64 end_points['pool1'] = ops.max_pool(end_points['conv2'], [3, 3], stride=2, scope='pool1') # 73 x 73 x 64 end_points['conv3'] = ops.conv2d(end_points['pool1'], 80, [1, 1], scope='conv3') # 73 x 73 x 80. end_points['conv4'] = ops.conv2d(end_points['conv3'], 192, [3, 3], scope='conv4') # 71 x 71 x 192. end_points['pool2'] = ops.max_pool(end_points['conv4'], [3, 3], stride=2, scope='pool2') # 35 x 35 x 192. net = end_points['pool2'] # Inception blocks with scopes.arg_scope([ops.conv2d, ops.max_pool, ops.avg_pool], stride=1, padding='SAME'): # mixed: 35 x 35 x 256. with tf.variable_scope('mixed_35x35x256a'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 64, [1, 1]) with tf.variable_scope('branch5x5'): branch5x5 = ops.conv2d(net, 48, [1, 1]) branch5x5 = ops.conv2d(branch5x5, 64, [5, 5]) with tf.variable_scope('branch3x3dbl'): branch3x3dbl = ops.conv2d(net, 64, [1, 1]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 32, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch5x5, branch3x3dbl, branch_pool ]) end_points['mixed_35x35x256a'] = net # mixed_1: 35 x 35 x 288. with tf.variable_scope('mixed_35x35x288a'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 64, [1, 1]) with tf.variable_scope('branch5x5'): branch5x5 = ops.conv2d(net, 48, [1, 1]) branch5x5 = ops.conv2d(branch5x5, 64, [5, 5]) with tf.variable_scope('branch3x3dbl'): branch3x3dbl = ops.conv2d(net, 64, [1, 1]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 64, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch5x5, branch3x3dbl, branch_pool ]) end_points['mixed_35x35x288a'] = net # mixed_2: 35 x 35 x 288. with tf.variable_scope('mixed_35x35x288b'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 64, [1, 1]) with tf.variable_scope('branch5x5'): branch5x5 = ops.conv2d(net, 48, [1, 1]) branch5x5 = ops.conv2d(branch5x5, 64, [5, 5]) with tf.variable_scope('branch3x3dbl'): branch3x3dbl = ops.conv2d(net, 64, [1, 1]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 64, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch5x5, branch3x3dbl, branch_pool ]) end_points['mixed_35x35x288b'] = net # mixed_3: 17 x 17 x 768. with tf.variable_scope('mixed_17x17x768a'): with tf.variable_scope('branch3x3'): branch3x3 = ops.conv2d(net, 384, [3, 3], stride=2, padding='VALID') with tf.variable_scope('branch3x3dbl'): branch3x3dbl = ops.conv2d(net, 64, [1, 1]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3]) branch3x3dbl = ops.conv2d(branch3x3dbl, 96, [3, 3], stride=2, padding='VALID') with tf.variable_scope('branch_pool'): branch_pool = ops.max_pool(net, [3, 3], stride=2, padding='VALID') net = tf.concat( axis=3, values=[branch3x3, branch3x3dbl, branch_pool]) end_points['mixed_17x17x768a'] = net # mixed4: 17 x 17 x 768. with tf.variable_scope('mixed_17x17x768b'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 192, [1, 1]) with tf.variable_scope('branch7x7'): branch7x7 = ops.conv2d(net, 128, [1, 1]) branch7x7 = ops.conv2d(branch7x7, 128, [1, 7]) branch7x7 = ops.conv2d(branch7x7, 192, [7, 1]) with tf.variable_scope('branch7x7dbl'): branch7x7dbl = ops.conv2d(net, 128, [1, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 128, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 128, [1, 7]) branch7x7dbl = ops.conv2d(branch7x7dbl, 128, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [1, 7]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 192, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch7x7, branch7x7dbl, branch_pool ]) end_points['mixed_17x17x768b'] = net # mixed_5: 17 x 17 x 768. with tf.variable_scope('mixed_17x17x768c'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 192, [1, 1]) with tf.variable_scope('branch7x7'): branch7x7 = ops.conv2d(net, 160, [1, 1]) branch7x7 = ops.conv2d(branch7x7, 160, [1, 7]) branch7x7 = ops.conv2d(branch7x7, 192, [7, 1]) with tf.variable_scope('branch7x7dbl'): branch7x7dbl = ops.conv2d(net, 160, [1, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 160, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 160, [1, 7]) branch7x7dbl = ops.conv2d(branch7x7dbl, 160, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [1, 7]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 192, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch7x7, branch7x7dbl, branch_pool ]) end_points['mixed_17x17x768c'] = net # mixed_6: 17 x 17 x 768. with tf.variable_scope('mixed_17x17x768d'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 192, [1, 1]) with tf.variable_scope('branch7x7'): branch7x7 = ops.conv2d(net, 160, [1, 1]) branch7x7 = ops.conv2d(branch7x7, 160, [1, 7]) branch7x7 = ops.conv2d(branch7x7, 192, [7, 1]) with tf.variable_scope('branch7x7dbl'): branch7x7dbl = ops.conv2d(net, 160, [1, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 160, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 160, [1, 7]) branch7x7dbl = ops.conv2d(branch7x7dbl, 160, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [1, 7]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 192, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch7x7, branch7x7dbl, branch_pool ]) end_points['mixed_17x17x768d'] = net # mixed_7: 17 x 17 x 768. with tf.variable_scope('mixed_17x17x768e'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 192, [1, 1]) with tf.variable_scope('branch7x7'): branch7x7 = ops.conv2d(net, 192, [1, 1]) branch7x7 = ops.conv2d(branch7x7, 192, [1, 7]) branch7x7 = ops.conv2d(branch7x7, 192, [7, 1]) with tf.variable_scope('branch7x7dbl'): branch7x7dbl = ops.conv2d(net, 192, [1, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [1, 7]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [7, 1]) branch7x7dbl = ops.conv2d(branch7x7dbl, 192, [1, 7]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 192, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch7x7, branch7x7dbl, branch_pool ]) end_points['mixed_17x17x768e'] = net # Auxiliary Head logits aux_logits = tf.identity(end_points['mixed_17x17x768e']) with tf.variable_scope('aux_logits'): aux_logits = ops.avg_pool(aux_logits, [5, 5], stride=3, padding='VALID') aux_logits = ops.conv2d(aux_logits, 128, [1, 1], scope='proj') # Shape of feature map before the final layer. shape = aux_logits.get_shape() aux_logits = ops.conv2d(aux_logits, 768, shape[1:3], stddev=0.01, padding='VALID') aux_logits = ops.flatten(aux_logits) aux_logits = ops.fc(aux_logits, num_classes, activation=None, stddev=0.001, restore=restore_logits) end_points['aux_logits'] = aux_logits # mixed_8: 8 x 8 x 1280. # Note that the scope below is not changed to not void previous # checkpoints. # (TODO) Fix the scope when appropriate. with tf.variable_scope('mixed_17x17x1280a'): with tf.variable_scope('branch3x3'): branch3x3 = ops.conv2d(net, 192, [1, 1]) branch3x3 = ops.conv2d(branch3x3, 320, [3, 3], stride=2, padding='VALID') with tf.variable_scope('branch7x7x3'): branch7x7x3 = ops.conv2d(net, 192, [1, 1]) branch7x7x3 = ops.conv2d(branch7x7x3, 192, [1, 7]) branch7x7x3 = ops.conv2d(branch7x7x3, 192, [7, 1]) branch7x7x3 = ops.conv2d(branch7x7x3, 192, [3, 3], stride=2, padding='VALID') with tf.variable_scope('branch_pool'): branch_pool = ops.max_pool(net, [3, 3], stride=2, padding='VALID') net = tf.concat( axis=3, values=[branch3x3, branch7x7x3, branch_pool]) end_points['mixed_17x17x1280a'] = net # mixed_9: 8 x 8 x 2048. with tf.variable_scope('mixed_8x8x2048a'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 320, [1, 1]) with tf.variable_scope('branch3x3'): branch3x3 = ops.conv2d(net, 384, [1, 1]) branch3x3 = tf.concat( axis=3, values=[ ops.conv2d(branch3x3, 384, [1, 3]), ops.conv2d(branch3x3, 384, [3, 1]) ]) with tf.variable_scope('branch3x3dbl'): branch3x3dbl = ops.conv2d(net, 448, [1, 1]) branch3x3dbl = ops.conv2d(branch3x3dbl, 384, [3, 3]) branch3x3dbl = tf.concat( axis=3, values=[ ops.conv2d(branch3x3dbl, 384, [1, 3]), ops.conv2d(branch3x3dbl, 384, [3, 1]) ]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 192, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch3x3, branch3x3dbl, branch_pool ]) end_points['mixed_8x8x2048a'] = net # mixed_10: 8 x 8 x 2048. with tf.variable_scope('mixed_8x8x2048b'): with tf.variable_scope('branch1x1'): branch1x1 = ops.conv2d(net, 320, [1, 1]) with tf.variable_scope('branch3x3'): branch3x3 = ops.conv2d(net, 384, [1, 1]) branch3x3 = tf.concat( axis=3, values=[ ops.conv2d(branch3x3, 384, [1, 3]), ops.conv2d(branch3x3, 384, [3, 1]) ]) with tf.variable_scope('branch3x3dbl'): branch3x3dbl = ops.conv2d(net, 448, [1, 1]) branch3x3dbl = ops.conv2d(branch3x3dbl, 384, [3, 3]) branch3x3dbl = tf.concat( axis=3, values=[ ops.conv2d(branch3x3dbl, 384, [1, 3]), ops.conv2d(branch3x3dbl, 384, [3, 1]) ]) with tf.variable_scope('branch_pool'): branch_pool = ops.avg_pool(net, [3, 3]) branch_pool = ops.conv2d(branch_pool, 192, [1, 1]) net = tf.concat(axis=3, values=[ branch1x1, branch3x3, branch3x3dbl, branch_pool ]) end_points['mixed_8x8x2048b'] = net # Final pooling and prediction with tf.variable_scope('logits'): shape = net.get_shape() net = ops.avg_pool(net, shape[1:3], padding='VALID', scope='pool') # 1 x 1 x 2048 net = ops.dropout(net, dropout_keep_prob, scope='dropout') net = ops.flatten(net, scope='flatten') # 2048 logits = ops.fc(net, num_classes, activation=None, scope='logits', restore=restore_logits) # 1000 end_points['logits'] = logits end_points['predictions'] = tf.nn.softmax( logits, name='predictions') return logits, end_points