使用 Keras/Tensorflow 对神经网络输出进行分组

数据挖掘 神经网络 喀拉斯 张量流
2021-09-28 12:53:46

我正在尝试对我的神经网络的输出进行分组,以便让它们执行单独的分类。

让我们以组由两个节点组成的示例为例,我们之前有四个输出节点,那么网络应该如下所示:

团体代表

如何使用 Keras 或 Tensorflow 实现这一目标?我在想我需要实现一个自定义层并在其中进行操作,但我想知道是否有使用 Keras 功能 API(或更低级别的 Tensorflow ?)的更简单的解决方案:)

2个回答

使用keras 功能 API将为您提供所需的东西。

我假设您当前正在使用标准的 keras 顺序模型 API,它更简单,但也将您限制为单个管道。使用函数式 API 时,您确实需要跟踪输入和输出,而不仅仅是定义层。

对于您问题中的示例:

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

# Left side sub-model:
L1 = Input(shape=(2,))
L2 = Dense(2, activation='softmax')(L1)

# Right side sub-model:
R1 = Input(shape=(2,))
R2 = Dense(2, activation='softmax')(R1)

# Combining them together:
merge = concatenate([L2, R2])

# Some additional layers working on the combined layer:
merged_layer_1 = Dense(4, activation='relu')(merge)

# Output Layer:
output = Dense(2, activation='softmax')(hidden1)

# Defining the model:
my_model = Model(inputs=[L1, R1], outputs=output)

层的深度是由组成的,但你应该得到大致的想法。

这是另一个类似于Mark.F 的答案的 Keras 代码片段,但拆分方向相反(从初始输入开始并拆分为两个输出分支,每个分支都有自己的 softmax)。

from keras.layers import Dense, Input, Softmax, Concatenate, concatenate
from keras.models import Model, Sequential
import numpy as np

input_layer = Input(shape=(3,))
middle_layer = Dense(4, activation="sigmoid")(input_layer)

split_one = Dense(2, activation="sigmoid")(middle_layer)
output_one = Softmax()(split_one)

split_two = Dense(2, activation="sigmoid")(middle_layer)
output_two = Softmax()(split_two)

merged = concatenate([output_one, output_two])
model = Model(inputs=input_layer, outputs=merged)

输出的前两个元素是第一个分支的结果,后两个是第二个分支的结果。您还需要在训练时连接两个分支的真实标签。