Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义权重初始化tensorflow tf.layers.dense_Python_Python 3.x_Tensorflow_Deep Learning - Fatal编程技术网

Python 自定义权重初始化tensorflow tf.layers.dense

Python 自定义权重初始化tensorflow tf.layers.dense,python,python-3.x,tensorflow,deep-learning,Python,Python 3.x,Tensorflow,Deep Learning,我正在尝试将自定义初始值设定项设置为tf.layers.dense,在这里,我使用我已有的权重矩阵初始化kernel\u初始值设定项 u_1 = tf.placeholder(tf.float32, [784, 784]) first_layer_u = tf.layers.dense(X_, n_params, activation=None, kernel_initializer=u_1,

我正在尝试将自定义初始值设定项设置为
tf.layers.dense
,在这里,我使用我已有的权重矩阵初始化
kernel\u初始值设定项

u_1 = tf.placeholder(tf.float32, [784, 784])
first_layer_u = tf.layers.dense(X_, n_params, activation=None, 
                              kernel_initializer=u_1,
                              bias_initializer=tf.keras.initializers.he_normal())
这是一个抛出错误,表示
ValueError:如果初始值设定项是常量,请不要指定形状。


将占位符分配给
内核\u初始值设定项是个问题还是我遗漏了什么?

至少有两种方法可以实现这一点:

1创建自己的图层

  W1 = tf.Variable(YOUR_WEIGHT_MATRIX, name='Weights')
  b1 = tf.Variable(tf.zeros([YOUR_LAYER_SIZE]), name='Biases') #or pass your own
  h1 = tf.add(tf.matmul(X, W1), b1)
2使用
tf.常数\u初始值设定项

init = tf.constant_initializer(YOUR_WEIGHT_MATRIX)
l1 = tf.layers.dense(X, o, kernel_initializer=init)

我认为您可以定义自己的初始值设定项函数。该函数需要有3个参数:
shape
dtype
、和
partition\u info
。它应该返回一个
tf.Tensor
,用于初始化权重。因为你有一个
numpy
数组,我想你可以用
tf.constant
来创建这个张量。例如:

def custom_initializer(shape_list, dtype, partition_info):
    # Use np.ones((7, 3)) as an example
    return tf.constant(np.ones((7, 3)))
然后您可以将其传递给
内核\初始值设定项
。如果所有尺寸都匹配,它应该可以工作。我举了一个例子,使用
估计器
构建模型,并使用
LoggingTensorHook
在每个步骤记录
密集/内核
。您应该能够看到重量已正确启动

编辑:
我刚刚发现使用
tf.constant\u初始值设定项将更好。它被用在英语中。你可以做
kernel\u initializer=tf.constant\u initializer(np.ones((7,3))

乔纳森的答案在conv上也对我有用-

kernel_in = np.random.uniform(100,1000,(filter_width, filter_height, input_channels, output_channels)).astype(np.float32)
init = tf.constant_initializer(kernel_in)
def model(x):
    x = tf.layers.conv2d(x, filters=3, kernel_size=1, strides=1, kernel_initializer=init)

kernel_initializer是“权重矩阵的initializer函数”,因此在其中放置占位符是没有意义的there@JonathanR我可以传递一个
numpy
数组吗?我得到这个,我曾想过使用
tf.layers.dense
来实现此功能。我更新了答案,向您展示了如何使用dense layerlo实现此功能。我是密度层上的tf.constant_初始化器(你的_WEIGHT_矩阵,dtype=tf.float32)来初始化我的权重,但是,初始化300万个权重需要5秒。使用您的方法大约需要4.2秒。有没有更快的方法?我只需要对训练集进行一次评估并保存错误,这花费了将近50%的时间,只需构建一个网络,测试它,然后删除它你的权重矩阵更新了吗?使内核成为一个
tf.constant
会使它不可学习吗?总是等于它的初始值吗?我怀疑这是OP的意图。@mikkola我刚刚发现TensorFlow(更新了我的答案)中有一个
tf.constant\u初始值设定项。如果我理解正确,它用于初始化内核,但不会“锁定”它。我只有间接的证据:1)我的gist示例表明内核确实每一步都在改变。2) 
tf.constant\u initializer
用于中,我认为该示例并不打算使
bias
恒定。是的,使用
tf.constant\u initializer
是正确的方法。@mikkola只是为了澄清,
tf.constant\u initializer
肯定是更好的方法。但是根据,
tf.constant\u初始值设定项
返回一个可调用的
constant
类,该类实际返回
tf.constant
。如果人们想做比
tf更重要的事情,那么
custom\u initializer
是有效的。常量\u initializer
可以做。但是,我正在使用它,初始化一个300万权重的网络需要将近5秒的时间。有没有更快的方法?顺便说一句:接受的答案需要4秒钟,但仍然太多:它占用了我算法的50%时间。