如何为keras模型中的权重矩阵初始化可变张量?

how to initialize a Variable tensor for the weight matrix in a keras model?

我正在尝试使用张量变量作为 keras 层中的权重..

我知道我可以改用 numpy 数组,但我想提供张量的原因是我希望我的权重矩阵是 SparseTensor 类型。

这是我到目前为止编写的一个小示例:

def model_keras(seed, new_hidden_size_list=None):

    number_of_layers = 1
    hidden_size = 512
    hidden_size_list = [hidden_size] * number_of_layers
    input_size = 784
    output_size = 10

    if new_hidden_size_list is not None:
        hidden_size_list = new_hidden_size_list

    weight_input = tf.Variable(tf.random.normal([784, 512], mean=0.0, stddev=1.0))
    bias_input = tf.Variable(tf.random.normal([512], mean=0.0, stddev=1.0))
    weight_output = tf.Variable(tf.random.normal([512, 10], mean=0.0, stddev=1.0))

    # This gives me an error when trying to use in kernel_initializer and       bias_initializer in the keras model
    weight_initializer_input = tf.initializers.variables([weight_input])
    bias_initializer_input = tf.initializers.variables([bias_input])
    weight_initializer_output = tf.initializers.variables([weight_output])

    # This works fine
    #weight_initializer_input = tf.initializers.lecun_uniform(seed=None)
    #bias_initializer_input = tf.initializers.lecun_uniform(seed=None)
    #weight_initializer_output = tf.initializers.lecun_uniform(seed=None)

    print(weight_initializer_input, bias_initializer_input, weight_initializer_output)

    model = keras.models.Sequential()
    for index in range(number_of_layers):
        if index == 0:
            # input layer
            model.add(keras.layers.Dense(hidden_size_list[index], activation=nn.selu, use_bias=True,
                                       kernel_initializer=weight_initializer_input, 
                                    bias_initializer=bias_initializer_input,
                                    input_shape=(input_size,)))
        else:
             model.add(keras.layers.Dense(hidden_size_list[index], activation=nn.selu, use_bias=True,
                                    kernel_initializer=weight_initializer_hidden, 
                                    bias_initializer=bias_initializer_hidden))

# output layer
    model.add(keras.layers.Dense(output_size, use_bias=False, kernel_initializer=weight_initializer_output))
    model.add(keras.layers.Activation(nn.softmax))

return model

我正在使用 tensorflow 1.15。

知道如何使用自定义(用户定义的)张量变量作为初始化器而不是预设方案(例如 Glorot、Truncated Normal 等)。我可以采用的另一种方法是显式定义计算而不是使用 keras.Layer.

非常感谢

您的代码在启用即时执行后可以正常工作。

import tensorflow as tf
tf.compat.v1.enable_eager_execution()

将此添加到文件的顶部。

有关工作代码,请参阅 this