【问题标题】:How can I I initialize the weights in slim.conv2d() with the value of existing model如何使用现有模型的值初始化 slim.conv2d() 中的权重
【发布时间】:2017-10-04 14:55:40
【问题描述】:

我用slim.conv2d来搭建VGG-net

with slim.arg_scope([slim.conv2d, slim.max_pool2d], padding='SAME'):
    conv1_1 = slim.conv2d(img, 64, [3, 3], scope='conv1')
    conv1_2 = slim.conv2d(conv1_1, 64, [3, 3], scope='conv1_1')
    pool1 = slim.max_pool2d(conv1_2, [2, 2], 2, scope='pool1_2')

    conv2_1 = slim.conv2d(pool1, 128, [3, 3], 1, scope='conv2_1')
    conv2_2 = slim.conv2d(conv2_1, 128, [3, 3], 1, scope='conv2_2')
    pool2 = slim.max_pool2d(conv2_2, [2, 2], 2, scope='pool2')

    conv3_1 = slim.conv2d(pool2, 256, [3, 3], 1, scope='conv3_1')
    conv3_2 = slim.conv2d(conv3_1, 256, [3, 3], 1, scope='conv3_2')
    conv3_3 = slim.conv2d(conv3_2, 256, [3, 3], 1, scope='conv3_3')
    pool3 = slim.max_pool2d(conv3_3, [2, 2], 2, scope='pool3')

    conv4_1 = slim.conv2d(pool3, 512, [3, 3], scope='conv4_1')
    # print conv4_1.shape
    conv4_2 = slim.conv2d(conv4_1, 512, [3, 3], scope='conv4_2')
    conv4_3 = slim.conv2d(conv4_2, 512, [3, 3], scope='conv4_3')  # 38

如果我想从现有的 VGG 模型中初始化 conv1conv2 的变量。

我该怎么做?

【问题讨论】:

    标签: python tensorflow tf-slim vgg-net


    【解决方案1】:

    我假设您有现有 VGG 模型的检查点。

    使用 TF Slim 执行此操作的一种方法是从检查点恢复,但在检查点中的变量名称和模型中的变量之间指定自定义映射。在此处查看 cmets:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/slim/python/slim/learning.py#L146

    【讨论】:

      【解决方案2】:

      我已将 slim.conv2d 替换为 tf.nn.conv2d(input, kernel...),其中内核是使用 tf.get_variable 创建的,并使用 tf.assign 进行分配。

      【讨论】:

        【解决方案3】:

        您还可以使用Assign_from_Values如下所示: Github - Initialize layers.convolution2d from numpy array

        sess = tf.Session()
        with sess.as_default():
        
            init = tf.global_variables_initializer()
            sess.run(init)
        
            path = pathlib.Path('./assets/classifier_weights.npz')
            if(path.is_file()):
                print("Initilize Weights from Numpy Array")
                init_weights = np.load(path)
                assign_op, feed_dict_init = slim.assign_from_values({
                    'conv1/weights' : init_weights['conv1_w'],
                })
                sess.run(assign_op, feed_dict_init)
        

        【讨论】:

          猜你喜欢
          • 2019-10-30
          • 1970-01-01
          • 2016-06-29
          • 2018-11-09
          • 2020-09-20
          • 1970-01-01
          • 1970-01-01
          • 2020-06-22
          • 1970-01-01
          相关资源
          最近更新 更多