keras / theano loss或op使用完整的网络

时间:2017-03-02 15:37:59

标签: theano keras

我正在寻找一种方法来实现以下网络结构(目前使用Keras,但可能是theano):

假设我们给出了一些简单的网络,但是不可能直接根据此输出计算所需的损耗,而是需要另一个操作,并且将根据此操作的输出定义损耗。但是,此操作不仅需要网络的输出,还需要完整的网络对象(例如,其渐变)。

如何做到这一点?我认为操作可以在网络顶部的自定义层中执行,也可以在自定义丢失功能中执行 - 但对于这两种版本,我都看不到访问整个网络的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

假设我们给出了一些简单的网络,但是不可能直接根据此输出计算所需的损耗,而是需要另一个操作,并且将根据此操作的输出定义损耗。但是,此操作不仅需要网络的输出,还需要完整的网络对象(例如,其渐变)。

说,你有以下型号。

path = path.TrimEnd(new char[] { '\\' });

例如,现在要删除此模型的最后一层,它实际上是为输入图像预测一个类别(长度为1000的向量,因为imagenet有1000个类别)。

import keras.applications.vgg16 as vgg16

model = vgg16.VGG16(weights='imagenet')
model.summary()

现在,让我们为这个模型添加一个线性层(输出大小为10),并使用修改过的神经网络模型的输出。

# Remove last Linear/Dense layer.
model.layers.pop()
model.outputs = [model.layers[-1].output]
model.layers[-1].outbound_nodes = []
model.summary()

您将获得一个矢量(长度为10)作为此模型的输出。

您可以使用model.add(Dense(10, activation='softmax')) model.summary() model.compile()函数编译和训练模型。您可以设置要用于训练模型的损失函数类型。