tensorflow实现sphereFace网络(20层CNN)

#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)
原文地址:https://www.cnblogs.com/cnugis/p/9317627.html