相关疑难解决方法(0)

Keras binary_crossentropy vs categorical_crossentropy性能?

我正在尝试培训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

130
推荐指数
7
解决办法
14万
查看次数

根据caffe中的"badness"来计算损失值

我想根据训练期间"当前预测"与"正确标签"的接近/远距离来缩放每个图像的损失值.例如,如果正确的标签是"猫"并且网络认为它是"狗",那么惩罚(损失)应该小于网络认为它是"汽车"的情况.

我正在做的方式如下:

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损失一样?

如果有人能给我一些指示,我们将不胜感激.

neural-network deep-learning caffe conv-neural-network

7
推荐指数
1
解决办法
1736
查看次数

为什么 Keras/tensorflow 的 sigmoid 和交叉熵精度低?

我有以下简单的神经网络(只有 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 …

python classification keras tensorflow cross-entropy

7
推荐指数
2
解决办法
6273
查看次数

在Keras(Tensorflow后端)中使用binary_crossentropy损失

在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)

keras tensorflow

6
推荐指数
1
解决办法
6338
查看次数