gpt4 book ai didi

python - 如何从softmax层中提取权重?

转载 作者:行者123 更新时间:2023-12-01 09:25:47 25 4
gpt4 key购买 nike

我在理解 Keras 中权重矩阵的输出形状时遇到问题。

我有一个简单的 BiLSTM,如下所示:

model = Sequential()
model.add(Embedding(vocab_size, embedding_size, input_length=55, weights=[pretrained_weights]))
model.add(Bidirectional(LSTM(units=embedding_size)))
model.add(Dense(5926, activation='softmax')) # number of classes

print(model.summary())

weights = model.layers[-1].get_weights()
print(weights)
print(len(weights))
print(weights[0][0].shape)
print(weights[0][0])

for e in zip(model.layers[-1].trainable_weights, model.layers[-1].get_weights()):
print('Param %s:\n%s' % (e[0],e[1]))

model.compile(loss='categorical_crossentropy',
optimizer = RMSprop(lr=0.0005),
metrics=['accuracy'])

model.fit(np.array(X_train), np.array(y_train), epochs=100, validation_data=(np.array(X_val), np.array(y_val)))

如果我打印最后一层权重的形状,我会得到:

Param <tf.Variable 'dense_14/kernel:0' shape=(200, 5926) dtype=float32_ref>:

所以形状是 (200, 5926)。

这是我的网络中神经元的数量除以类别的数量。我想找到一种方法来提取与每个预测相关的权重,因为这样我需要更新权重矩阵。

我的测试集由 680 个句子组成,其中每个句子有 1 个标签。预测具有以下形式:

predictions = model.predict(np.array(X_test))
# shape predictions = (680, 5926)

有没有办法从 softmax 层提取每个预测的权重(形状=(680,5926)?比如:

predictions = [probability_class_1, probability_class_2,......, probability_class_5926] 
weights = [weight_class_1, weight_class_2, ......., weight_class_5926]

最佳答案

您可能应该使用第二个输入,其中的掩码告诉哪些动词对应哪些句子,并执行简单的元素乘法:

sentenceInputs = Input((sentenceLength,))
desiredVerbs = Input((5926,))

sentenceOutputs = Embedding(vocab_size, embedding_size, input_length=55, weights=[pretrained_weights])(sentenceInputs)
sentenceOutputs = Bidirectional(LSTM(units=embedding_size))(sentenceOutputs)

sentenceOuptuts = Dense(5926)(sentenceOutputs)
selectedOutputs = Multiply()([sentenceOutputs, desiredVerbs])
selectedOutputs = Activation('softmax')(selectedOutputs)

model = Model([sentenceInputs,desiredVerbs], selectedOutputs)

现在,创建一个包含所需动词的数组:

desired = np.zeros((X_train.shape[0], 5926))

#for each sentence, make the desired verbs be one:
desired[sentenceIndex, verbIndex] = 1.

#now, how you're going to do this is up to you

#if they're the same for all sentences:
verbs = [selectedVerbIndex1, selectedVerbIndex2, ...... ]
for verbIndex in verbs:
desired[:, verbIndex] = 1.

并适合两个输入:

model.fit([np.array(X_train), desired], np.array(y_train), ......)
<小时/>

fit中使用class_weight参数:

您可以尝试使用您的原始模型(不遵循上述建议)并在 fit 方法中使用参数 class_weight

不过,这会有点不同。您将无法在预测时选择动词,只能在训练时选择。您将无法为不同的句子选择不同的动词。其他动词永远不会接受任何训练(也许带有 Dense(5) 的模型会更有趣?)

我也不太确定这里的权重是否可以为零。

verbWeights = { i: 0. for i in range(5926) }

desiredVerbs = [verbIndex1, verbIndex2, .... ]
for verb in desiredVerbs:
verbWeights[verb] = 1.

model.fit(X_train, y_train, class_weight = desiredVerbs, ....)

关于python - 如何从softmax层中提取权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50410189/

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