在成本函数中包括与预期模型输出的偏差

时间:2019-04-19 19:20:00

标签: python tensorflow keras

我正在尝试编写一个简单的模型来执行以下操作。我希望我的模型接受输入,然后使用内核和偏差向量作为可训练参数,通过线性激活(K.bias_add(K.dot(x,self.kernel),self.bias))进行常规前馈输出。我还希望模型包括估计输出的参数x_out(也是可训练的)。该模型的目标是输出参数x_out作为输出,但将norm(W * x + b-x_out)作为惩罚项包含在成本函数中。我曾尝试使用包装器函数来解决此问题,但由于此而导致的自定义丢失,但到目前为止尚未成功。

from keras import backend as K
from keras.layers import Layer

class MyFeedforward(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyFeedforward, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        self.bias = self.add_weight(name='bias',
                                     shape=(self.output_dim,),
                                     initializer='uniform',
                                     trainable=True)
        super(MyFeedforward, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        #return K.bias_add(K.dot(x, self.zeros), self.output_estimate)
        return K.bias_add(K.dot(x, self.kernel), self.bias)
    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)
from keras import backend as K
from keras.layers import Layer

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.zeros = self.add_weight(name='zeros', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='Zeros',
                                      trainable=False)
        self.output_estimate = self.add_weight(name='output_estimate',
                                     shape=(self.output_dim,),
                                     initializer='uniform',
                                     trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        return K.bias_add(K.dot(x, self.zeros), self.output_estimate)
        #return K.bias_add(K.dot(x, self.kernel), self.bias)
    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

from keras.models import  Model
from keras import layers
from keras import Input

input_tensor = layers.Input(shape=(784,))
output_estimate = MyLayer(10,)(input_tensor)
calculated_output = MyFeedforward(10,)(input_tensor)

model = Model(input_tensor, [calculated_output, output_estimate])
model.summary()

我希望在成本函数中同时使用MyFeedforward层(计算K.bias_add(K.dot(x,kernel),bias))和MyLayer(仅输出估计的输出x_out)。最终目标是在训练数据和x_out的输出之间优化诸如categorical_crossentropy之类的东西,其中x_out和实际输出的平方偏差为(K.sum(K.square(x_out-K.bias_add(K.dot(x,内核),偏差))。如果我可以在不设置单独的层的情况下做到这一点,那么效果会很好。

我尝试用一​​个包装器来设置自定义损失函数和一个多头模型(一个用于x_out层,一个用于普通层),但是看来我最终无法访问常规执行此操作时的图层输出。 (我需要另一层的y_pred,或者需要访问输入,以便可以获取layer.kernel和layer.bias并将其应用于输入以进行计算。)

0 个答案:

没有答案