我想使用vgg-16的前三个卷积层来生成特征映射 . 但我想用它来改变图像大小,即不像224x224或256x256的imagenet大小 . 如480x640或任何其他randome图像尺寸 .
由于卷积层与图像空间大小无关,如何使用权重来改变图像大小?那么我们如何使用预先训练的权重vgg-16到前三个卷积层 . 如果可能,请告诉我 .
As convolution layer are independent of image size
实际上它比那更复杂 . 内核本身与图像大小无关,因为我们将其应用于每个像素 . 事实上,这些内核的培训可以重复使用 .
但这意味着输出大小取决于图像大小,因为这是每个输入像素从图层中馈出的节点数 . 因此,即使特征提取器是独立的,密集层也不适合您的图像 .
因此,您需要预处理图像以适应第一层的大小,或者从头开始重新训练密集层 .
当人们谈论“转移学习”时,人们在分割方面已经做了几十年 . 您可以重用最佳特征提取器,然后训练具有这些特征的专用模型 .
很容易重用卷积层的变量 . 首先,定义包含卷积图层的图形,然后恢复它们的值 . 以下是伪代码
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与字典参数一起使用 .
2 回答
As convolution layer are independent of image size
实际上它比那更复杂 . 内核本身与图像大小无关,因为我们将其应用于每个像素 . 事实上,这些内核的培训可以重复使用 .
但这意味着输出大小取决于图像大小,因为这是每个输入像素从图层中馈出的节点数 . 因此,即使特征提取器是独立的,密集层也不适合您的图像 .
因此,您需要预处理图像以适应第一层的大小,或者从头开始重新训练密集层 .
当人们谈论“转移学习”时,人们在分割方面已经做了几十年 . 您可以重用最佳特征提取器,然后训练具有这些特征的专用模型 .
很容易重用卷积层的变量 . 首先,定义包含卷积图层的图形,然后恢复它们的值 . 以下是伪代码
当然,您必须将过滤器大小与VGG网络匹配 . 当变量名与检查点文件的名称不同时,可以将Saver与字典参数一起使用 .