【问题标题】:how to initialize a Variable tensor for the weight matrix in a keras model?如何在 keras 模型中初始化权重矩阵的变量张量?
【发布时间】:2020-08-30 16:22:25
【问题描述】:

我正在尝试使用张量变量作为 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、截断法线等)。我可以采取的另一种方法是显式定义计算,而不是使用 keras.Layer。

非常感谢

【问题讨论】:

    标签: tensorflow keras initialization keras-layer


    【解决方案1】:

    您的代码在启用 Eager Execution 后工作。

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

    将此添加到文件的顶部。

    有关工作代码,请参阅this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 2017-03-12
      相关资源
      最近更新 更多