VGG16模型设置全局列表parameters = [ ]
先自己写一个与VGG16结构相同的类,再把下载的训练好的参数导入我们的模型。
# 我们通过对每一层设置trainable=True/False进行了模型微调
class vgg16:
def __init__(self, imgs):
self.parameters = [] # 在类的初始化时加入全局列表,将所需共享的参数加入进来
self.imgs = imgs
self.conv_layers()
self.fc_layers()
self.probs = tf.nn.softmax(self.fc8) # self.probs表示返回/输出
def saver(self):
return tf.train.Saver()
def maxpool(self, name, input_data):
out = tf.nn.max_pool(input_data, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME", name=name)
# out = tf.nn.maxpool(input_data,[1,2,2,1],[1,2,2,1],padding="SAME",name=name) # max_pool ?
# out = tf.nn.max_pool2d(input_data,[1,2,2,1],[1,2,2,1],padding="SAME",name=name)
return out
def conv(self, name, input_data, out_channel, trainable=False): # 参数变动
in_channel = input_data.get_shape()[-1]
with tf.variable_scope(name):
kernel = tf.get_variable("weights", [3, 3, in_channel, out_channel], dtype=tf.float32, trainable=False)
biases = tf.get_variable("biases", [out_channel], dtype=tf.float32, trainable=False)
conv_res = tf.nn.conv2d(input_data, kernel, [1, 1, 1, 1], padding="SAME")
res = tf.nn.bias_add(conv_res, biases)
out = tf.nn.relu(res, name=name)
self.parameters += [kernel, biases] # 将卷积层定义的参数(kernel,biases)加入列表
return out
def fc(self, name, input_data, out_channel, trainable=True):
shape = input_data.get_shape().as_list()
if len(shape) == 4:
size = shape[-1]