首页 文章

如何使用for循环和xavier初始化张量流中简单深度神经网络的权重?

提问于
浏览
0

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

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)] . 相反,当我使用像 W1b1 这样的名称时,它可以正常工作 .

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

它有什么办法吗?

2 回答

  • 1

    您将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"] 等等)上分配名为 "parameters['b' + str(l)]" 的tensorflow变量 . 如您所见,名称是一个常量字符串 .

    相反,你必须让python评估 parameters['b' + str(l)] 语句 .

    因此,只需删除双引号,使字符串 "parameters['b' + str(l)]" 成为python解释器将执行的连接操作 . 您还必须删除 parameters 字典查找,因为它还没有出现's wrong (you are looking into a dictionary for a certain key that it') .

    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())
    
  • 0

    TLDR :您的变量名称无效,因为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”的原因 .

相关问题