我正在尝试培训CNN按主题对文本进行分类.当我使用binary_crossentropy时,我得到~80%acc,而categorical_crossentrop我得到~50%acc.
我不明白为什么会这样.这是一个多类问题,这是否意味着我必须使用分类,二进制结果是没有意义的?
model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
filter_length=4,
border_mode='valid',
activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)
然后
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
要么
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud) machine-learning neural-network deep-learning conv-neural-network keras
我想根据训练期间"当前预测"与"正确标签"的接近/远距离来缩放每个图像的损失值.例如,如果正确的标签是"猫"并且网络认为它是"狗",那么惩罚(损失)应该小于网络认为它是"汽车"的情况.
我正在做的方式如下:
1-我定义了标签之间距离的矩阵,
2-将该矩阵作为底层传递给"softmaxWithLoss"图层,
3将每个log(prob)乘以该值以根据不良情况缩放损失forward_cpu
但是我不知道该怎么做backward_cpu.我知道渐变(bottom_diff)必须改变但不太确定,如何在这里加入比例值.根据数学,我必须按比例缩放渐变(因为它只是一个比例),但不知道如何.
此外,似乎在caffe中有loosLayer被称为"InfoGainLoss"非常相似的工作如果我没有弄错,但是这一层的后面部分有点令人困惑:
bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j] / prob;
Run Code Online (Sandbox Code Playgroud)
我不确定为什么infogain_mat[]要分开prob而不是乘以!如果我使用单位矩阵infogain_mat是不是它应该像前向和后向的softmax损失一样?
如果有人能给我一些指示,我们将不胜感激.
我有以下简单的神经网络(只有 1 个神经元)来测试Keras的sigmoid激活和计算精度binary_crossentropy:
model = Sequential()
model.add(Dense(1, input_dim=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
为了简化测试,我手动设置唯一权重为1,偏置为0,然后用2点训练集评估模型{(-a, 0), (a, 1)},即
y = numpy.array([0, 1])
for a in range(40):
x = numpy.array([-a, a])
keras_ce[a] = model.evaluate(x, y)[0] # cross-entropy computed by keras/tensorflow
my_ce[a] = np.log(1+exp(-a)) # My own computation
Run Code Online (Sandbox Code Playgroud)
我的问题: 我发现由 Keras keras_ce/Tensorflow 计算的二元交叉熵 ( ) 达到了大约1.09e-7什么时候的下限a。16,如下图(蓝线)。随着“a”不断增长,它不会进一步减少。这是为什么?
该神经网络只有 1 个神经元,其权重设置为 1,偏差为 0。使用 2 点训练集{(-a, 0), (a, 1)},binary_crossentropy只需
-1/2 [ log(1 …
在Keras文档中的培训示例中,
https://keras.io/getting-started/sequential-model-guide/#training
使用binary_crossentropy,并在网络的最后一层添加了乙状结肠激活,但是是否有必要在网络的最后一层中加入乙状结肠?正如我在源代码中发现的:
def binary_crossentropy(output, target, from_logits=False):
"""Binary crossentropy between an output tensor and a target tensor.
Arguments:
output: A tensor.
target: A tensor with the same shape as `output`.
from_logits: Whether `output` is expected to be a logits tensor.
By default, we consider that `output`
encodes a probability distribution.
Returns:
A tensor.
"""
# Note: nn.softmax_cross_entropy_with_logits
# expects logits, Keras expects probabilities.
if not from_logits:
# transform back to logits
epsilon = _to_tensor(_EPSILON, output.dtype.base_dtype) …Run Code Online (Sandbox Code Playgroud)