我正在尝试编写一个简单的模型来执行以下操作。我希望我的模型接受输入,然后使用内核和偏差向量作为可训练参数,通过线性激活(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并将其应用于输入以进行计算。)