分享一段可以用于测试tensorflow网络结构的代码;
通常我们在修改网络结构的时候,例如改变网络层数、输入输出尺寸,都需要去探索网络的结构是如何的,以及修改完以后能不能正常使用网络,那么就需要网络的测试代码来对于原有网络中的结构进行一点一点的测试以及修改尝试;
基本的神经网络单元包括有输入尺寸、定义卷积核、定义激活函数、定义卷积层、定义padding以及输出的尺寸,也可能涉及标准化等操作,可以如下面的代码所示,对于这些内容进行修改,并且可以将自己网络中的结构替换过来,以进行网络结构的测试;
import os
import sys
import tensorflow as tf
import numpy as np
FLAGS = tf.app.flags.FLAGS
BN_EPSILON = 0.001
def create_variables(name, shape, initializer=tf.contrib.layers.xavier_initializer(), is_fc_layer=False): # 定义变量
'''
:param name: A string. The name of the new variable
:param shape: A list of dimensions
:param initializer: User Xavier as default.
:param is_fc_layer: Want to create fc layer variable? May use different weight_decay for fc
layers.
:return: The created variable
'''
## TODO: to allow different weight decay to fully connected layer and conv layer
regularizer = tf.contrib.layers.l2_regularizer(scale=0.0001)
new_variables = tf.get_variable(name, shape=shape, initializer=initializer,
regularizer=regularizer)
return new_variables
def batch_normalization_layer(input_layer, dimension): # 进行批标准化,每一层在输入到神经元之前先输入到BN层中
'''
Helper function to do batch normalziation
:param input_layer: 4D tensor
:param dimension: input_layer.get_shape().as_list()[-1]. The depth of the 4D tensor
:return: the 4D tensor after being normalized
'''
mean, variance = tf.nn.moments(input_layer, axes=[0, 1, 2])
beta = tf.get_variable('beta', dimension, tf.float32,
initializer=tf.constant_initializer(0.0, tf.float32))
gamma = tf.get_variable('gamma', dimension, tf.float32,
initializer=tf.constant_initializer(1.0, tf.float32))
bn_layer = tf.nn.batch_normalization(input_layer, mean, variance, beta, gamma, BN_EPSILON)
return bn_layer
input = tf.Variable(tf.random_normal([128,224,224,16]))
filter = tf.Variable(tf.random_normal([3,3,16,16]))
op1 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')
in_channel = op1.get_shape().as_list()[-1]
bn_layer = batch_normalization_layer(op1, in_channel)
relu_layer = tf.nn.relu(bn_layer)
filter = create_variables(name='conv', shape=[3,3,16,16])
conv_layer = tf.nn.conv2d(relu_layer, filter, strides=[1, 1, 1, 1], padding='SAME')
padded_input = op1
output = conv_layer + padded_input
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print('*' * 20 + ' op1 ' + '*' * 20)
result=sess.run(output)
print(result.shape)