相关疑难解决方法(0)

如何选择张量流中的交叉熵损失?

分类问题,例如逻辑回归或多项逻辑回归,优化了交叉熵损失.通常,交叉熵层遵循softmax层,其产生概率分布.

在tensorflow中,至少有十几种不同的交叉熵损失函数:

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ...

哪个只适用于二进制分类,哪个适用于多类问题?你何时应该使用sigmoid而不是softmax?如何在sparse功能与别人不同,为什么仅是它softmax?

相关(更多数学导向)讨论:交叉熵丛林.

machine-learning neural-network logistic-regression tensorflow cross-entropy

76
推荐指数
3
解决办法
4万
查看次数

Keras MNIST目标向量自动转换为one-hot?

mnist当我从 Keras加载数据集时,我得到 4 个变量 -

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
Run Code Online (Sandbox Code Playgroud)

的形状x_train是(60000, 28, 28),这是有道理的,因为它包含 60,000 张 28x28 图片

的形状y_train正好(60000,)表明它是一个包含数字目标标签(0-9)的一维向量。

为了进行数字分类,神经网络通常输出一个具有十个维度的单热编码向量。我认为我需要使用to_categorical将 y 目标从数值转换为分类,以便使神经网络的形状输出与训练样本相匹配,这可能是(60000, 10)。

但在我在网上找到的一些示例中,to_categorical从未用于重塑训练向量。当神经网络的输出层y_train.shape保持不变时(60000,)

 model.add(Dense(10, activation="softmax"))
Run Code Online (Sandbox Code Playgroud)

它输出一个 10-D one-hot 向量。

然后他们简单地训练模型就y_train没有问题

model.fit(x_train, y_train, epochs=2, validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)

这怎么可能?神经网络的输出形状是否会与 不(60000, 10)兼容(60000,)?或者 Keras 是否自动将分类输出转换为数字?

编辑:更清楚地说,我知道如何对其进行一次性编码,但我的问题是为什么他们不这样做。在该示例中,网络在没有对目标类进行 one-hot 编码的情况下工作,而网络的输出显然是 one-hot 编码的。

编辑:罗辛是对的。这只是使用sparse_crossentropy损失的效果,而不是分类损失。

python neural-network keras tensorflow

5
推荐指数
1
解决办法
5652
查看次数

对于张量流中的二进制分类,成本函数总是返回零

我在tensorflow中编写了以下二进制分类程序,它是错误的.无论输入是什么,成本都会一直返回到零.我正在尝试调试一个没有从数据中学到任何东西的大型程序.我已经将至少一个bug缩小到成本函数,总是返回零.给定的程序使用一些随机输入并且具有相同的问题.self.X_train并且self.y_train最初应该从文件中读取并且该函数self.predict()具有形成前馈神经网络的更多层.

import numpy as np
import tensorflow as tf

class annClassifier():

    def __init__(self):

        with tf.variable_scope("Input"):
             self.X = tf.placeholder(tf.float32, shape=(100, 11))

        with tf.variable_scope("Output"):
            self.y = tf.placeholder(tf.float32, shape=(100, 1))

        self.X_train = np.random.rand(100, 11)
        self.y_train = np.random.randint(0,2, size=(100, 1))

    def predict(self):

        with tf.variable_scope('OutputLayer'):
            weights = tf.get_variable(name='weights',
                                      shape=[11, 1],
                                      initializer=tf.contrib.layers.xavier_initializer())
            bases = tf.get_variable(name='bases',
                                    shape=[1],
                                    initializer=tf.zeros_initializer())
            final_output = tf.matmul(self.X, weights) + bases

        return final_output

    def train(self):

        prediction = self.predict()
        cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=self.y))

        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())         
            print(sess.run(cost, …
Run Code Online (Sandbox Code Playgroud)

python artificial-intelligence machine-learning neural-network tensorflow

3
推荐指数
1
解决办法
1924
查看次数

在张量流中实现两幅图像之间的交叉熵损失

我正在尝试为完全转换网络实现两个图像之间的交叉熵损失。我的训练图像和输入图像都在 0-1 范围内。现在,我尝试仅针对一类图像实现此功能。为了说明这一点,我有不同的橙色图片,但只有橙色图片。我已经构建了模型并实现了交叉熵损失函数。

def loss_func_entropy(logits,y):
    logits=tf.reshape(logits,[BATCH_SIZE*480*640,1])
    y=tf.reshape(y,[BATCH_SIZE*480*640,1])
    print (logits.get_shape(),y.get_shape())
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=y,dim=0) )
Run Code Online (Sandbox Code Playgroud)

显然我做得不对,因为我的损失函数不断增加。需要注意的是 logits 和 y 都是二维的。我将它们重塑为单个向量并尝试进行交叉熵。

deep-learning tensorflow

2
推荐指数
1
解决办法
4727
查看次数