代码之家  ›  专栏  ›  技术社区  ›  Stupid420

如何在tensorflow中使用for loop和xavier初始化简单深度神经网络的权重?

  •  0
  • Stupid420  · 技术社区  · 8 年前

    我正在尝试使用tensorflow中的以下代码初始化多层神经网络的权重。

    def initialize_parameters(layers_dims):
        parameters = {}
        tf.set_random_seed(1)                  
    
        L = len(layers_dims)
    
        for l in range(1, L):
            parameters['W' + str(l)] = tf.get_variable("parameters['W' + str(l)]", [layers_dims[l],layers_dims[l-1]], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
            parameters['b' + str(l)] = tf.get_variable("parameters['b' + str(l)]", [layers_dims[l],1], initializer = tf.zeros_initializer())
        return parameters
    

    我调用这个函数的方式是

    layers_dims = [100,1]
    tf.reset_default_graph()
    with tf.Session() as sess:
      parameters = initialize_parameters(layers_dims)
    

    我得到一个错误,上面说 tf.get.variable 无法将变量的名称作为 parameters['W' + str(l)] . 相反,当我使用这样的名称时 W1 b1 ,工作正常。

    我的目标是初始化我的“L”层神经网络,并将参数存储在名为parameters的字典中。

    有什么办法吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   nessuno    8 年前

    您将python需要执行的代码放入字符串中。只要解决这个问题,你就会没事的。

    parameters['W' + str(l)] = tf.get_variable("parameters['W' + str(l)]", [layers_dims[l],layers_dims[l-1]], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    parameters['b' + str(l)] = tf.get_variable("parameters['b' + str(l)]", [layers_dims[l],1], initializer = tf.zeros_initializer())
    

    在这里,您在python变量处赋值 parameters['W' + str(l)] (python正确计算为 parameters["W1"], parameters["W2"] 等等)名为tensorflow的变量 "parameters['b' + str(l)]" . 如您所见,名称是一个常量字符串。

    相反,您必须让python评估 parameters['b' + str(l)]

    因此,只需删除构成字符串的双引号 “参数['b'+str(l)]” python解释器将执行的串联操作。您还必须删除 parameters 字典查找,因为它是错误的(您正在字典中查找尚未出现的某个键)。

    parameters['W' + str(l)] = tf.get_variable('W' + str(l), [layers_dims[l],layers_dims[l-1]], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    parameters['b' + str(l)] = tf.get_variable('b' + str(l), [layers_dims[l],1], initializer = tf.zeros_initializer())
    
        2
  •  0
  •   jkschin    8 年前

    太长,读不下去了 :您的变量名无效,因为TensorFlow会检查它是否为有效名称。

    您得到的错误是:

    ValueError: 'parameters['W' + str(l)]' is not a valid scope name
    

    如果您再次跟踪它,您会注意到它引发了以下错误:

    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 3172, in name_scope
        raise ValueError("'%s' is not a valid scope name" % name)
    

    然后可以检查主TensorFlow代码库 on line 3603 here . 如果您阅读此功能并进一步向下滚动至 line 3671 ,您会看到导致此错误的正则表达式:

    NOTE: This constructor validates the given `name`. Valid scope
    names match one of the following regular expressions:
        [A-Za-z0-9.][A-Za-z0-9_.\\-/]* (for scopes at the root)
        [A-Za-z0-9_.\\-/]* (for other scopes)
    

    这就是“W1”或“b1”起作用的原因。