- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在理解 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/
如前所述 here ,交叉熵不是多标签分类的合适损失函数。我的问题是“这个事实是否也适用于 softmax 的交叉熵?”。如果是,如何与this part匹配的文件。 我应该提到我的问题的范围在cnt
这两个函数之间的区别已在这篇 pytorch 帖子中描述:What is the difference between log_softmax and softmax? 是:exp(x_i) / ex
我正在使用 tensorflow 编写一个简单的逻辑回归。我发现当使用 tf.nn.softmax 时,算法收敛得更快,最终精度更高。如果切换到我自己的 softmax 实现,网络收敛速度较慢,最终精
使用 softmax 作为 tf.keras 中的连续层和使用 softmax 作为密集层的激活函数有什么区别? tf.keras.layers.Dense(10, activation=tf.nn.
keras.activations.softmax 和 keras.layers.Softmax 之间有什么区别?为什么同一个激活函数有两种定义? keras.activations.softmax:
我正在使用带有二进制交叉熵的 Sigmoid 激活函数训练一个二进制分类器,它提供了大约 98% 的良好准确度。 当我使用带有 categorical_crossentropy 的 softmax 进
我正在尝试实现类似完全卷积网络的东西,其中最后一个卷积层使用过滤器大小 1x1 并输出“分数”张量。分数张量的形状为 [Batch, height, width, num_classes]。 我的问题
我目前正在用 Java 实现我自己的神经网络。我已经实现了一些常见的激活函数,例如 Sigmoid 或 ReLU,但我不知道如何实现 Softmax。 我想要一个像这样的方法 private doub
我目前正在用 Java 实现我自己的神经网络。我已经实现了一些常见的激活函数,例如 Sigmoid 或 ReLU,但我不知道如何实现 Softmax。 我想要一个像这样的方法 private doub
我在 github 上找到了一个很好的强化学习示例,我想使用它。我的问题是输出是正态分布层(下面的代码),因为它用于连续 Action 空间,而我想将它用于离散 Action 空间,其中模型有 4 个
我已经学习了 ML,并且一直在 Andrew N.G 的 coursera 类(class)中学习 DL,每次他谈到线性分类器时,权重都只是一个一维向量。即使在分配期间,当我们将图像滚动到一维向量(像
我一直在研究斯坦福的深度学习教程,但我在其中一个练习(带有 softmax 输出层的神经网络)上遇到了问题。这是我在 R 中的实现: train <- function(training.set, l
我正在 Octave 中实现 softmax 回归。目前,我正在使用使用以下成本函数和导数的非矢量化实现。 来源:Softmax Regression 现在我想在 Octave 中实现它的矢量化版本。
我是机器学习的新手,正在学习如何在 python 中实现 softmax,我正在关注以下线程 Softmax function - python 我在做一些分析,如果我们有一个数组 batch = n
下面是我尝试计算 softmax 的一小段代码。它适用于单个阵列。但是对于更大的数字,比如 1000 等,它会爆炸 import numpy as np def softmax(x): print
例如,我有一个 CNN,它试图从 MNIST 数据集(使用 Keras 编写的代码)中预测数字。它有 10 个输出,形成 softmax 层。只有一个输出可以为真(独立于 0 到 9 的每个数字):
pytorch教程 ( https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-bli
我找到了一些 MNIST 手写字符分类问题的示例代码。代码开头如下: import tensorflow as tf # Load in the data mnist = tf.keras.datas
这是 Keras 模型的最后一层。 model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossent
在神经网络的输出层中,通常使用softmax函数来近似概率分布: 由于指数的原因,计算成本很高。为什么不简单地执行 Z 变换,使所有输出均为正,然后通过将所有输出除以所有输出之和来进行归一化? 最佳答
我是一名优秀的程序员,十分优秀!