Machine learning 如何确定具有屏蔽层的keras中LSTM的激活层尺寸

Machine learning 如何确定具有屏蔽层的keras中LSTM的激活层尺寸,machine-learning,nlp,keras,Machine Learning,Nlp,Keras,在查看并完成一些基本测试之后,我尝试在keras中使用LSTM创建一个NER系统。我正在使用一个生成器并调用fit\u generator 这是我的基本keras模型: model = Sequential([ Embedding(input_dim=max_features, output_dim=embedding_size, input_length=maxlen, mask_zero=True), Bidirectional(LSTM(hidden_size, retur

在查看并完成一些基本测试之后,我尝试在
keras
中使用LSTM创建一个NER系统。我正在使用一个生成器并调用
fit\u 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)
我看到了一些其他的示例,这使我相信我需要在
激活()之前
展平()

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\u sequences=False
):

或者移除遮罩(
mask\u zero=False
),以便能够使用
展平

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\u size x maxlen

我想你想要第一个选择

编辑1:查看示例图,它会对每个时间步进行预测,因此它还需要softmax激活
TimeDistributed
。目标尺寸应为
(无、最大、超出尺寸)


您或者只需要返回序列的最后一个元素(
return\u sequences=False
):

或者移除遮罩(
mask\u zero=False
),以便能够使用
展平

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\u size x maxlen

我想你想要第一个选择

编辑1:查看示例图,它会对每个时间步进行预测,因此它还需要softmax激活
TimeDistributed
。目标尺寸应为
(无、最大、超出尺寸)


你能给我们提供一个
generator
code吗?我用一个生成相同维度随机数组的生成器更新了问题。你能给我们提供一个
generator
code吗?我用一个生成相同维度随机数组的生成器更新了问题。如果我尝试执行第一个选项,然后删除
return\u sequences=True
TimeDistributed
,然后在检查目标时,我将得到
错误:预期激活\u 1具有形状(无,1),但获得具有形状(453949)的数组。
错误表示输出是
(无,1)
,但目标大小是
(无,3949)
,假设
out\u size=1
maxlen=3949
,我认为您有第二个选择
out\u size x maxlen
。另外,您确定要激活softmax吗?抱歉,我不熟悉NER系统,但是如果您有网络图,我可以帮助您获得正确的输出。需要屏蔽值,因为传入的向量是填充的,如图所示。更新了我的答案,如果我尝试执行第一个选项,请确保检查目标形状(maxlen,out_size),然后删除
return\u sequences=True
TimeDistributed
,然后在检查目标时,我将得到
错误:预期激活\u 1具有形状(无,1),但获得具有形状(453949)的数组。
错误表示输出是
(无,1)
,但目标大小是
(无,3949)
,假设
out\u size=1
maxlen=3949
,我认为您有第二个选择
out\u size x maxlen
。另外,您确定要激活softmax吗?抱歉,我不熟悉NER系统,但是如果您有网络图,我可以帮助您获得正确的输出。需要屏蔽值,因为传入的向量是填充的,如图所示。更新了我的答案,请确保检查目标形状(maxlen,out\u 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'))
])