我简化了网络以使其更易于理解。原始的更复杂。在这里,在输入层之后,我有一个类别层。示例地面实况值也显示在那里,即 [1,1,1,1,0,0,0,0,0,0,0,0]
。最后一层是子类别层,它总是包含一个 1,其余的为零,即 [0,0,1,0,0,0,0,0,0]
。类别和子类别部分链接,但输入层与类别层完全链接。
这是我为它编写的代码。
input_ = Input(shape=5)
cat_layer = Dense(4*3, activation='sigmoid', name='cat')(input_)
list_of_subcat_layers = []
for idx, i in enumerate([2,4,3]):
final_subcat = Dense(i, activation = 'softmax')(cat_layer[:,idx*4:(idx+1)*4])
list_of_subcat_layers.append(final_subcat)
subcat_output = concatenate(list_of_subcat_layers, name='subcat')
model = Model(input_, [cat_layer, subcat_output])
model_cat = Model(input_, cat_layer)
model_subcat = Model(input_, subcat_output)
loss = {'cat':'categorical_crossentropy','subcat':'categorical_crossentropy'}
loss_weights = {'cat':1.,'subcat':1.}
metrics = {'cat': 'acc','subcat': 'acc'}
optimizer = Adam(learning_rate=3e-05, epsilon=1e-08)
model.compile(loss=loss, loss_weights=loss_weights, metrics=metrics, optimizer=optimizer)
但是,我的代码有问题。 “softmax”激活应该对所有子类别级别进行一次,但我认为在我的代码中,每个子类别都进行一次。怎么能一劳永逸?
还请评论模型(代码)的其他部分是否有意义。