【问题标题】:TensorFlow: Using tf.global_variables_initializer() after partially loading pre-trained weightsTensorFlow:部分加载预训练权重后使用 tf.global_variables_initializer()
【发布时间】:2018-03-26 11:27:02
【问题描述】:

我构建了一个模型,它使用预训练的 VGG-16 作为基础网络,然后在其上添加了几层。

在训练时,我的模型部分包含属于预训练 VGG-16 的变量,即已经初始化的变量(整个模型正在从 SavedModel 协议缓冲区加载),部分包含未初始化的变量我添加的图层。

在开始训练之前,我必须初始化在预训练的 VGG-16 之上添加的层的变量。我通过运行tf.global_variables_initializer() 来做到这一点。

问题来了:

如果tf.global_variables_initializer() 初始化所有全局变量,为什么不使用它们的初始化值覆盖预训练的权重?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    事实上,它确实覆盖了预训练的权重:

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import backend
    
    session = tf.Session ()
    backend.set_session (session)
    with session.as_default ():
        net = keras.applications.InceptionV3 (input_shape = (3, 299, 299))
        print ('weights before: ', net.get_layer ('conv2d_1').get_weights ())
    
        session.run (tf.global_variables_initializer ())
    
        print ('weights after: ', net.get_layer ('conv2d_1').get_weights ())
    

    输出:

    weights before:  [array([[[[ 7.42468759e-02,  7.99097791e-02, -1.20985091e-01, ...,
          -2.42504068e-02, -8.17770883e-03, -7.11583123e-02],
         [ 5.46021610e-02,  1.13289319e-01,  3.99106629e-02, ...,
           2.37093717e-02, -6.01868033e-02, -1.08440826e-02],
         [ 1.00897752e-01,  1.96732566e-01,  8.93706456e-02, ...,
           1.19806841e-01, -9.84039158e-02, -7.20797330e-02],
    
    weights after:  [array([[[[-7.92664364e-02, -5.87778017e-02, -9.76844281e-02, ...,
           9.62431133e-02,  7.16331154e-02, -3.22120935e-02],
         [-6.17715716e-03, -6.95393384e-02,  9.68316942e-02, ...,
           5.01702428e-02,  8.89533758e-02,  9.80506092e-02],
         [-1.89049393e-02, -4.31398787e-02, -9.45695043e-02, ...,
           7.52686858e-02,  7.27956891e-02, -3.26380134e-03],
    

    要克服这个问题,请将自定义变量放在单独的集合中:

    my_variables_collection = tf.get_collection ('my_variables')
    
    t = tf.Variable (0.0, name='adam_t', trainable=False)
    tf.add_to_collection ('my_variables', t)
    
    m = tf.Variable (backend.zeros ((3, 299, 299)), name='adam_m', trainable=False)
    tf.add_to_collection ('my_variables', m)
    
    # only initialize variables from my list:
    session.run (tf.variables_initializer (my_variables_collection))
    

    【讨论】:

      【解决方案2】:

      在变量初始化程序对我有用之前和之后保存和加载权重

      weights=model.get_weights
      sess=tf.Session()
      K.set_session(sess)
      sess.run(tf.global_variables_initializer ())
      model.set_weights(weights)
      print(np.argmax(sess.run(model(preprocessed_input))))
      

      【讨论】:

      • 谢谢,我觉得应该是 TensorFlow v1 的 model.get_weights()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2020-08-16
      • 2018-10-08
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多