我们从Python开源项目中,提取了以下3个代码示例,用于说明如何使用tensorflow.contrib.slim.variable()。
def tiny(net, classes, num_anchors, training=False, center=True): def batch_norm(net): net = slim.batch_norm(net, center=center, scale=True, epsilon=1e-5, is_training=training) if not center: net = tf.nn.bias_add(net, slim.variable('biases', shape=[tf.shape(net)[-1]], initializer=tf.zeros_initializer())) return net scope = __name__.split('.')[-2] + '_' + inspect.stack()[0][3] net = tf.identity(net, name='%s/input' % scope) with slim.arg_scope([slim.layers.conv2d], kernel_size=[3, 3], weights_initializer=tf.truncated_normal_initializer(stddev=0.1), normalizer_fn=batch_norm, activation_fn=leaky_relu), slim.arg_scope([slim.layers.max_pool2d], kernel_size=[2, 2], padding='SAME'): index = 0 channels = 16 for _ in range(5): net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) net = slim.layers.max_pool2d(net, scope='%s/max_pool%d' % (scope, index)) index += 1 channels *= 2 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) net = slim.layers.max_pool2d(net, stride=1, scope='%s/max_pool%d' % (scope, index)) index += 1 channels *= 2 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) net = slim.layers.conv2d(net, num_anchors * (5 + classes), kernel_size=[1, 1], activation_fn=None, scope='%s/conv' % scope) net = tf.identity(net, name='%s/output' % scope) return scope, net
def darknet(net, classes, num_anchors, training=False, center=True): def batch_norm(net): net = slim.batch_norm(net, center=center, scale=True, epsilon=1e-5, is_training=training) if not center: net = tf.nn.bias_add(net, slim.variable('biases', shape=[tf.shape(net)[-1]], initializer=tf.zeros_initializer())) return net scope = __name__.split('.')[-2] + '_' + inspect.stack()[0][3] net = tf.identity(net, name='%s/input' % scope) with slim.arg_scope([slim.layers.conv2d], kernel_size=[3, 3], normalizer_fn=batch_norm, activation_fn=leaky_relu), slim.arg_scope([slim.layers.max_pool2d], kernel_size=[2, 2], padding='SAME'): index = 0 channels = 32 for _ in range(2): net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) net = slim.layers.max_pool2d(net, scope='%s/max_pool%d' % (scope, index)) index += 1 channels *= 2 for _ in range(2): net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels / 2, kernel_size=[1, 1], scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) net = slim.layers.max_pool2d(net, scope='%s/max_pool%d' % (scope, index)) index += 1 channels *= 2 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels / 2, kernel_size=[1, 1], scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels / 2, kernel_size=[1, 1], scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) passthrough = tf.identity(net, name=scope + '/passthrough') net = slim.layers.max_pool2d(net, scope='%s/max_pool%d' % (scope, index)) index += 1 channels *= 2 # downsampling finished net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels / 2, kernel_size=[1, 1], scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels / 2, kernel_size=[1, 1], scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) index += 1 with tf.name_scope(scope): _net = reorg(passthrough) net = tf.concat([_net, net], 3, name='%s/concat%d' % (scope, index)) net = slim.layers.conv2d(net, channels, scope='%s/conv%d' % (scope, index)) net = slim.layers.conv2d(net, num_anchors * (5 + classes), kernel_size=[1, 1], activation_fn=None, scope='%s/conv' % scope) net = tf.identity(net, name='%s/output' % scope) return scope, net
def _average_gradients(tower_grads, include_square=False): """Calculate the average gradient for each shared variable across all towers. Note that this function provides a synchronization point across all towers. Args: tower_grads: List of lists of (gradient, variable) tuples. The outer list is over individual gradients. The inner list is over the gradient calculation for each tower. Returns: List of pairs of (gradient, variable) where the gradient has been averaged across all towers. """ average_grads = [] average_grads_square = [] for grad_and_vars in zip(*tower_grads): # Note that each grad_and_vars looks like the following: # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) grads = [] none_count = 0 for g, v in grad_and_vars: if g == None: none_count = none_count + 1 continue # Add 0 dimension to the gradients to represent the tower. expanded_g = tf.expand_dims(g, 0) # Append on a 'tower' dimension which we will average over below. grads.append(expanded_g) if none_count==0: # Average over the 'tower' dimension. grad_cat = tf.concat(0, grads) grad = tf.reduce_mean(grad_cat, 0) # Keep in mind that the Variables are redundant because they are shared # across towers. So .. we will just return the first tower's pointer to # the Variable. v = grad_and_vars[0][1] grad_and_var = (grad, v) average_grads.append(grad_and_var) if include_square: grad2 = tf.mul(grad_cat, grad_cat, name="square_gradient") grad2 = tf.reduce_mean(grad2, 0) average_grads_square.append((grad2, v)) elif none_count == len(grad_and_vars): print("None gradient for %s" % (grad_and_vars[0][1].op.name)) else: raise ValueError("None gradient error") if include_square: return average_grads, average_grads_square else: return average_grads