【问题标题】:Shared weight matrices between dense layers in keraskeras 中密集层之间的共享权重矩阵
【发布时间】:2019-01-23 01:19:59
【问题描述】:

我正在尝试将此 tensorflow 代码重新实现到 keras 中,我注意到此处提交的其他票证与我尝试重新创建的情绪不同。目标是在多个密集层之间共享权重矩阵。

import tensorflow as tf
# define input and weight matrices
x = tf.placeholder(shape=[None, 4], dtype=tf.float32)
w1 = tf.Variable(tf.truncated_normal(stddev=.1, shape=[4, 12]), 
                 dtype=tf.float32)
w2 = tf.Variable(tf.truncated_normal(stddev=.1, shape=[12, 2]), 
                 dtype=tf.float32)
# neural network
hidden_1 = tf.nn.tanh(tf.matmul(x, w1))
projection = tf.matmul(hidden_1, w2)
hidden_2 = tf.nn.tanh(projection)
hidden_3 = tf.nn.tanh(tf.matmul(hidden_2, tf.transpose(w2)))
y = tf.matmul(hidden_3, tf.transpose(w1))
# loss function and optimizer
loss = tf.reduce_mean(tf.reduce_sum((x - y) * (x - y), 1))
optimize = tf.train.AdamOptimizer().minimize(loss)
init = tf.initialize_all_variables()

问题是在 keras 中重新实现这些权重层作为原始层的转置。我目前正在使用 keras 功能 API 实现自己的网络

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    首先定义两个密集层:

    from keras.layers import Dense, Lambda
    import keras.backend as K
    
    dense1 = Dense(12, use_bias=False, activation='tanh')
    dense2 = Dense(2, use_bias=False, activation='tanh')
    

    然后,您可以使用例如dense1.weights[0] 从您的层访问权重。您可以将其包装在一个 lambda 层中,该层也可以转换您的权重:

    h3 = Lambda(lambda x: K.dot(x, K.transpose(dense2.weights[0])))(h2)
    

    【讨论】:

    • 谢谢你,我很感激,这就是我要找的!有没有办法用另一个密集层初始化一个密集层的权重?
    • 您可以在多个输入上重复使用密集层。否则,如果你想要两个单独的层分别更新它们的权重,你可以使用 set_weights。例如:dense2.set_weights(dense1.weights)
    • 再次感谢,您帮了大忙。
    猜你喜欢
    • 2019-08-12
    • 2019-12-06
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多