使用 TimeDistributed 包装器未捕获 Keras 功能 API 层名称

数据挖掘 Python 深度学习 喀拉斯 lstm rnn
2022-03-03 01:07:08
class Net2:
    @staticmethod
    def build_cat_branch(inputs,category_size):
        x = TimeDistributed(Dense(category_size))(inputs)
        x = Activation('softmax', name="cat_output")(x)
        return x

    @staticmethod
    def build_t_branch(inputs):
        x = TimeDistributed(Dense(1, activation='relu', name="t_output"))(inputs)
        return x

    @staticmethod
    def build_full_model(timestep_len,hidden_size,category_size,num_features,dropout,rec_drop):
        inputs = Input(shape=(timestep_len,num_features),name="Input")
        bn = BatchNormalization()(inputs)
        lstm = LSTM(hidden_size, return_sequences=True, dropout=dropout, recurrent_dropout=rec_drop,name="LSTM")(bn)
        bn2 = BatchNormalization()(lstm)
        cat_branch = Net2.build_cat_branch(bn2,category_size)
        t_branch = Net2.build_t_branch(bn2)
        model = Model(inputs=inputs,outputs=[cat_branch,t_branch],name="Net2")
        return model

当我尝试编译这个模型时,我得到:

ValueError:损失字典中的未知条目:“t_output”。只需要以下键:['cat_output', 'time_distributed_2']

(在我的模型摘要中,我命名为“t_output”的层改名为“time_distributed_2”)

所以,基本上,我的问题是 TD 包装器发生了什么导致 name 属性不是 build_t_branch 函数返回的对象的一部分?显然,“cat_output”名称存储正确,因为损失字典可以识别它,但是我在 TimeDistributed 包装器中的输出层没有保存用户定义的层名称。我知道我可以通过将所有层定义在一个没有“分支”函数的单个函数中来解决这个问题,但这不是这里的重点。这是 Keras 中的错误吗?如果没有上述修复,有什么办法可以解决这个问题?

1个回答

原因是您应该命名 TD 而不是 Dense。小心使用支架。将其更改为:

x = TimeDistributed(密集(1,激活='relu'),名称=“t_output”)(输入)