gpt4 book ai didi

machine-learning - 如何使用屏蔽层修复 keras 中 LSTM 的激活层尺寸

转载 作者:行者123 更新时间:2023-11-30 09:18:57 26 4
gpt4 key购买 nike

查看 following gist 后,并进行一些基本测试,我尝试使用 keras 中的 LSTM 创建一个 NER 系统。我正在使用生成器并调用 fit_generator

这是我的基本 keras 模型:

model = Sequential([
Embedding(input_dim=max_features, output_dim=embedding_size, input_length=maxlen, mask_zero=True),
Bidirectional(LSTM(hidden_size, return_sequences=True)),
TimeDistributed(Dense(out_size)),
Activation('softmax')
])
model.compile(loss='binary_crossentropy', optimizer='adam')

我的输入尺寸看起来正确:

>>> generator = generate()
>>> i,t = next(generator)
>>> print( "Inputs: {}".format(model.input_shape))
>>> print( "Outputs: {}".format(model.output_shape))
>>> print( "Actual input: {}".format(i.shape))
Inputs: (None, 3949)
Outputs: (None, 3949, 1)
Actual input: (45, 3949)

但是当我打电话时:

model.fit_generator(generator, steps_per_epoch=STEPS_PER_EPOCH, epochs=EPOCHS)

我似乎收到以下错误:

ValueError: 
Error when checking target:
expected activation_1 to have 3 dimensions,
but got array with shape (45, 3949)

我看过 similar issues 的其他一些例子,这让我相信我需要在 Activation() 之前 Flatten() 我的输入,但如果这样做,我会收到以下错误。

Layer flatten_1 does not support masking, 
but was passed an input_mask:
Tensor("embedding_37/NotEqual:0", shape=(?, 3949), dtype=bool)

根据之前的问题,我的生成器在功能上相当于:

def generate():
maxlen=3949
while True:
inputs = np.random.randint(55604, size=maxlen)
targets = np.random.randint(2, size=maxlen)
yield inputs, targets

我并不认为我需要扁平化并且我愿意接受其他建议。

最佳答案

您只需返回序列的最后一个元素 (return_sequences=False):

model = Sequential([
Embedding(input_dim=max_features, output_dim=embedding_size, input_length=maxlen, mask_zero=True),
Bidirectional(LSTM(hidden_size)),
Dense(out_size),
Activation('softmax')
])

或者删除掩码 (mask_zero=False) 以便能够使用 Flatten:

model = Sequential([
Embedding(input_dim=max_features, output_dim=embedding_size, input_length=maxlen),
Bidirectional(LSTM(hidden_size, return_sequences=True)),
TimeDistributed(Dense(out_size)),
Flatten(),
Activation('softmax')
])

*请注意,输出将为 out_size x maxlen

我认为你想要第一个选择。

编辑1:查看示例图,它对每个时间步进行预测,因此它还需要softmax激活TimeDistributed。目标尺寸应为(None, maxlen, out_size):

model = Sequential([
Embedding(input_dim=max_features, output_dim=embedding_size, input_length=maxlen, mask_zero=True),
Bidirectional(LSTM(hidden_size, return_sequences=True)),
TimeDistributed(Dense(out_size)),
TimeDistributed(Activation('softmax'))
])

关于machine-learning - 如何使用屏蔽层修复 keras 中 LSTM 的激活层尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47061667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com