我正在寻找一种方法来实现以下网络结构(目前使用Keras,但可能是theano):
假设我们给出了一些简单的网络,但是不可能直接根据此输出计算所需的损耗,而是需要另一个操作,并且将根据此操作的输出定义损耗。但是,此操作不仅需要网络的输出,还需要完整的网络对象(例如,其渐变)。
如何做到这一点?我认为操作可以在网络顶部的自定义层中执行,也可以在自定义丢失功能中执行 - 但对于这两种版本,我都看不到访问整个网络的方法。有什么建议吗?
答案 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()
函数编译和训练模型。您可以设置要用于训练模型的损失函数类型。