我正在尝试创建一个可能有点非传统的模型来实现自定义训练算法。
模型所基于的结构是一个由所有密集层组成的网络。为了具体起见:我首先想到一个网络,该网络将形状矢量(784,)作为输入(平坦的MNIST数据),将其通过具有Relu激活功能的多个普通Dense层馈送,最后是一个Dense层以Softmax激活作为输出,给出10个类别的概率。
我要实现的新颖之处在于,除了每个Dense层中的常规可训练参数(内核和偏差)之外,我还希望关联两个(也是可训练的)参数:输入估计和输出估计。输入估计值应为给定图层输出的形状,并且输出估计值应与图层输出的形状相同。
我希望模型实际计算的内容:将通常认为的密集层的“调用”函数(Activations.Relu(K.bias_add(K.dot(tensor1,tensor2)))应用到输入估计中参数(而不是训练批次),然后返回输入估算值和输出估算值之间的差,然后,计算当前层的输出估算值与下一层的输入估算值之间的差(如果存在下一层) )。我需要模型将所有这些差异作为列表返回(我相信以后可以在一些复杂的成本函数中使用它)。
这个想法是,每一层的“调用”功能仅取决于其自身的参数和下一层中的固定参数,因此它们应该并行计算。
很抱歉,这有点冗长,但是我已经苦苦挣扎了一段时间,想知道Keras自定义图层API是否是完成此任务的正确工具,或者使用TensorFlow本身是否能为我提供更好的服务。 / p>
(如果您成功地遵循了我所说的,并且想知道如何使用批处理中的“培训数据”:上述“差异”将受到惩罚,而我未明确提及的差异之一)是将模型第一层的输入估计值与平均输入向量进行比较。我在上面没有提到,因为我认为计算起来很困难。