• 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)
  • 相关阅读:
    API接口服务端
    phpredis扩展
    PHP之-json转数组,支持多层嵌套json
    瀑布流
    ERROR 1130: Host xxx is not allowed to connect to this MySQL server
    让IE支持CSS3 Media Query实现响应式Web设计
    Sublime Text快捷键:
    最简单的linux内存清理方法
    16: vue + crypto-js + python前后端加密解密
    16: mint-ui移动端
  • 原文地址:https://www.cnblogs.com/cnugis/p/9317627.html
Copyright © 2020-2023  润新知