#coding:utf-8 import tensorflow as tf from tensorflow.python.framework import ops import numpy as np tf.reset_default_graph() #1.prelu def prelu(x, name = 'prelu'): with tf.variable_scope(name): alphas = tf.get_variable('alpha', x.get_shape()[-1], initializer=tf.constant_initializer(0.25), regularizer=l2_regularizer, dtype= tf.float32) pos = tf.nn.relu(x) neg = tf.multiply(alphas, (x - abs(x)) * 0.5) return pos + neg #2.conv with strides def first_conv(input,num_output,name): with tf.variable_scope(name): zero_init = tf.zeros_initializer() network = tf.layers.conv2d(input, num_output, kernel_size=[3, 3], strides=(2, 2), padding = 'SAME', kernel_initializer=xavier, bias_initializer=zero_init, kernel_regularizer=l2_regularizer, bias_regularizer = l2_regularizer) network = prelu(network, name=name) return network #3.conv with residual units def block(input, name, num_output): with tf.variable_scope(name): network = tf.layers.conv2d(input, num_output, kernel_size=[3, 3], strides = [1, 1],padding='SAME', kernel_initializer=tf.random_normal_initializer(stddev=0.01), use_bias=False, kernel_regularizer= l2_regularizer) network = prelu(network, name = 'name' + '1') network = tf.layers.conv2d(network, num_output, kernel_size=[3, 3], strides = [1, 1],padding='SAME', kernel_initializer=tf.random_normal_initializer(stddev=0.01), use_bias=False, kernel_regularizer= l2_regularizer) network = prelu(network, name = 'name' + '2') network = tf.add(input, network) return network #4.infer l2_regularizer = tf.contrib.layers.l2_regularizer(1.0) xavier = tf.contrib.layers.xavier_initializer_conv2d() def get_shape(tensor): static_shape = tensor.shape.as_list() dynamic_shape = tf.unstack(tf.shape(tensor)) dims = [s[1] if s[0] is None else s[0] for s in zip(static_shape,dynamic_shape)] return dims def infer(input, embedding_size=512): with tf.variable_scope('conv1_'): network = first_conv(input, 64, name = 'conv1') network = block(network, 'conv1_23', 64) with tf.variable_scope('conv2_'): network = first_conv(network, 128, name= 'conv2') network = block(network, 'conv2_23', 128) network = block(network,'conv2_45', 128) with tf.variable_scope('conv3_'): network = first_conv(network, 256, name='conv3') network = block(network, 'conv3_23', 256) network = block(network, 'conv3_45', 256) network = block(network, 'conv3_67', 256) network = block(network, 'conv3_89', 256) with tf.variable_scope('conv4_'): network = first_conv(network, 512, name='conv4') network = block(network, 'conv4_23', 512) with tf.variable_scope('feature'): dims = get_shape(network) print (dims) feature = tf.layers.dense(tf.reshape(network, [dims[0], np.prod(dims[1:])]), embedding_size, kernel_regularizer= l2_regularizer, kernel_initializer= xavier) return feature tf.reset_default_graph() image = tf.constant(np.random.normal(size=[1, 112, 96, 3]),dtype=tf.float32) feature = infer(image) print feature.get_shape() tf.summary.FileWriter('sphereface_network', tf.get_default_graph()) #测试网络是否正确搭建 给一张图片 看网络是否能够将结果向label拟合 pred = tf.layers.dense(feature, 1) print pred.get_shape() loss = tf.nn.l2_loss(pred - 1) optimizer = tf.train.GradientDescentOptimizer(0.0001).minimize(loss) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in xrange(500): pred_np, loss_np, _ = sess.run([pred, loss, optimizer]) if i % 20 == 0: print (pred_np, loss_np)