在 Keras 中创造恒定的价值

Posted

技术标签:

【中文标题】在 Keras 中创造恒定的价值【英文标题】:Creating constant value in Keras 【发布时间】:2018-03-10 00:00:54 【问题描述】:

我正在尝试在 keras 模型中创建一个常量变量。到目前为止我所做的是将它作为输入传递。但它始终是一个常数,所以我希望它是一个常数。(每个示例的输入是[1,2,3...50] => 所以我使用np.tile(np.array(range(50)),(len(X_input))) 为每个示例重现它)

所以现在我有:

constant_input = Input(shape=(50,), dtype='int32', name="constant_input")

给出张量:Tensor("constant_input", shape(?,50), dtype=int32)

现在尝试将其作为常量:

np_constant = np.array(list(range(50))).reshape(1, 50)
tf_constant = K.constant(np_constant)
tensor_constant = Input(tensor=tf_constant, shape=(50,), dtype='int32', name="constant_input")

给出张量:Tensor("constant_input", shape(50,1),dtype=float32)

但我想要的是每批要缩放的常数,也就是说张量的形状应该是(?, 50),和Input的使用方式一样。

有可能吗?

【问题讨论】:

【参考方案1】:

你不能有一个可变大小的常量。常数始终具有相同的值。您可以做的是拥有(1, 50) 常量,然后使用K.tile 在TensorFlow 中平铺它。最好使用np.arange 而不是np.array(list(range(50))。比如:

from keras.layers.core import Lambda
import keras.backend as K

def operateWithConstant(input_batch):
    tf_constant = K.constant(np.arange(50).reshape((1, 50)))
    batch_size = K.shape(input_batch)[0]
    tiled_constant = K.tile(tf_constant, (batch_size, 1))
    # Do some operation with tiled_constant and input_batch
    result = ...
    return result

input_batch = Input(...)
input_operated = Lambda(operateWithConstant)(input_batch)
# continue...

【讨论】:

感谢您的回答。它似乎创建了所需的尺寸,但是当我调用Model() 时,它给出了Graph disconnected: cannot obtain value for tensor 的错误。我不确定它是否与此有关,或者因为我正在尝试创建两个 Models。使用Input(问题中描述的第一种方法)时不会发生此错误。 @MpizosDimitris 是的,我想您必须将操作放入Lambda 之类的某个层中,我已经更新了答案。 您能否通过使用 tiled_constantinput_batch 执行 Dot() 来更新该答案。如果我没记错的话,结果张量应该是(?, 1)。但是我不能让它工作。

以上是关于在 Keras 中创造恒定的价值的主要内容,如果未能解决你的问题,请参考以下文章

麦肯锡新报告《在元宇宙创造价值》, 2030 年元宇宙的价值可能会增长到 5 万亿美元

在 JSON 1.0 而不是 1 中创造价值

转:如何跳出效率陷阱,重新定义工作?

转:如何跳出效率陷阱,重新定义工作?

首席数据官什么是首席数据官? 从数据中创造商业价值的领导者

jmeter使用数据库创造批量数据