我想使用vgg-16的前三个卷积层来生成特征图。 但是我想使用可变图像大小的图像,即不是224x224或256x256的imagenet大小。例如480x640或任何其他随机图像尺寸。
由于卷积层与图像空间大小无关,如何使用权重来改变图像大小? 因此,我们如何使用vgg-16的预训练权重直到前三个卷积层。 请让我知道是否可行。
答案 0 :(得分:0)
As convolution layer are independent of image size
实际上,这要复杂得多。内核本身与图像大小无关,因为我们将其应用于每个像素。确实,可以重新使用这些内核的训练。
但这意味着输出大小取决于图像大小,因为这是从每个输入像素的图层中馈出的节点数。因此,即使特征提取器是独立的,密集层也不适合您的图像。
因此,您需要预处理图像以适合第一层的大小,或者从头开始重新训练密集的层。
人们谈论“转移学习”是数十年来人们在细分市场中所做的。您可以重用最好的特征提取器,然后使用这些特征训练专用模型。
答案 1 :(得分:0)
很容易重用卷积层的变量。首先,定义一个包含卷积层的图,然后恢复它们的值。以下是伪代码
def network(your_inputs):
filter1 = tf.get_variable(shape=[filter_size, filter_size, in_channel, out_channel], name="vgg16/layer1")
features = tf.nn.conv2d(your_inputs, filter1, strides=[1,1,1,1])
filter2 = tf.get_variable(shape=[filter_size, filter_size, in_channel, out_channel], name="vgg16/layer2")
features = tf.nn.conv2d(features, filter2, strides=[1,1,1,1])
restore_filters = [filter1, filter2]
...
return logits, restore_filters
outputs, restore_filters = network(inputs)
saver = tf.train.Saver(restore_filters)
saver.restore(sess, "vgg-checkpoint.ckpt")
当然,您必须将过滤器尺寸与VGG网络匹配。当变量名不同于检查点文件的变量名时,可以将Saver与字典参数一起使用。