首页 > 解决方案 > 有没有办法将神经网络层中的每个节点乘以特定值?(凯拉斯)

问题描述

我正在尝试修改“用于可区分特征选择和重建的具体自动编码器”的工作。

这是用于选择重要变量的输入层之后的具体选择器层的 Keras 代码。

如果你看下面的代码,返回值 Y 成为 X 和 K.transpose(self.selections) 的内积,内积值与节点数一样多。

class ConcreteSelect(Layer):
def __init__(self, output_dim, start_temp = 10.0, min_temp = 0.1, alpha = 0.99999, **kwargs):
    self.output_dim = output_dim
    self.start_temp = start_temp
    self.min_temp = K.constant(min_temp)
    self.alpha = K.constant(alpha)
    super(ConcreteSelect, self).__init__(**kwargs)
    
def build(self, input_shape):
    self.temp = self.add_weight(name = 'temp', shape = [], initializer = Constant(self.start_temp), trainable = False)
    self.logits = self.add_weight(name = 'logits', shape = [self.output_dim, input_shape[1]], initializer = glorot_normal(), trainable = True)
    super(ConcreteSelect, self).build(input_shape)
    
def call(self, X, training = None):
    uniform = K.random_uniform(self.logits.shape, K.epsilon(), 1.0)
    gumbel = -K.log(-K.log(uniform))
    temp = K.update(self.temp, K.maximum(self.min_temp, self.temp * self.alpha))
    noisy_logits = (self.logits + gumbel) / temp
    samples = K.softmax(noisy_logits)
    discrete_logits = K.one_hot(K.argmax(self.logits), self.logits.shape[1])

    self.selections = K.in_train_phase(samples, discrete_logits, training)
    Y = K.dot(X, K.transpose(self.selections))
    return Y

def compute_output_shape(self, input_shape):
    return (input_shape[0], self.output_dim)

这可以用图形表示为 image1,其中 K.transpose(self.selections) 表示为 m。

图像1

但我想要的只是 K.transpose(self.selections) 的一个向量,

并将每个输入值 (X) 和 K.transpose(self.selections) 值相乘,然后发送到每个节点,如 image2 所示。(一个输入一个连接)

图2

正如您可能猜到的那样,我是 keras 的新手,需要一些帮助。如果您需要进一步澄清我的问题,我会告诉您。

标签: pythontensorflowkerasautoencoder

解决方案


推荐阅读