Keras中的多示例模型

jaxagkaj  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(179)

我有一个多示例数据集,我想使用Keras的Functional API来预测示例类别和(派生的)行李标签。简单的示例预测很有效,从中获取行李标签也很有效。但由于行李标签在模型之外,结果似乎不是最优的。
我的想法如下:
1.对于袋子中的每个示例,启动模型的一个单独分支。
1.在通过其分支运行每个示例之后,连接结果。
1.连接后,根据概率预测袋子标签
到目前为止,我已经写了-这里,n_instances是每个包的示例数,n_feat是每个示例的特征数,n_classes是一个示例/包可能属于的类别数。

from keras.layers import *

inputs = []
instance_layer = [None] * n_instances

for i in range(n_instances):
    inp = Input(shape=n_feat)
    inputs.append(inp)
    instance_layer[i] = Dense(units=256, activation='ReLU')(inp)
    instance_layer[i] = Dense(units=128, activation='ReLU')(instance_layer[i])
    instance_layer[i] = Dense(units=64, activation='ReLU')(instance_layer[i])
    instance_layer[i] = Dense(units=n_classes + 1, activation='sigmoid')(instance_layer[i])  # output to be converted to one-hot vector

output_tensor = Concatenate()(instance_layer)

"""
Code to go from concatenated tensor to a single bag prediction
"""

model = tf.keras.models.Model(inputs, output_tensor)

问题:

  • 在我看来,好像每个示例都看到一个单独的模型,而我希望保持模型相同
  • Concatenate()生成长度为n_instances * n_classes的Tensor,而我感兴趣的是形状为(n_instances,n_classes)的Tensor,我更喜欢使用CategoricalCrossEntropy作为损失函数。
  • 关于如何从示例预测的Tensor到袋子预测,有什么建议吗?
8iwquhpp

8iwquhpp1#

为了子孙后代:

instance_model = tf.keras.models.Sequential([
    Dense(units=256, name='fc_256', activation='ReLU', input_dim=n_feat),
    Dense(units=128, name='fc_128', activation='ReLU'),
    Dense(units=64, name='fc_64', activation='ReLU'),
    Dense(units=n_classes+1, name='label_predictions', activation='sigmoid')
])

然后将其 Package 在TimeDistributed层中,该层返回具有 * n_instances * 行和 * n_classes +1 * 列的Tensor,用于 * n_instances * 行和 * n_feat * 列的输入Tensor。* n_instances * 在此处是变量,因此输入形状中为None:

inputs = Input(shape=(None, n_feat), name="input")
instance_output = TimeDistributed(instance_model)(inputs)

# Condense into bag prediction
bag_output = GlobalAveragePooling1D(name="pooling")(instance_output)

model = tf.keras.models.Model(inputs, bag_output)

相关问题