我正在尝试使用Tensorflow进行分类的一个非常简单的例子。而不是使用单热矢量,tf.nn.softmax和带有logits的crossentropy损失。我想使用0/1标签的离散情况。 NN模型的输出将为0或1.因此我做了像这样的y_ = tf.nn.sigmoid(tf.matmul(hidden,weight2)+ bias2) y_ = tf.cast(tf.greaterequal(y,0.5),tf.float32)所以这会给出0或1的张量。但是当我尝试训练时,这给了我一个错误,说没有提供梯度。这是完整的代码。 https://gist.github.com/kris-singh/54aecbc1d61f1d7d79a43ae2bfac8516我的问题是,我想做的是,有没有可能?如果是的话怎么样?
答案 0 :(得分:0)
我认为评论回答了问题。
答案 1 :(得分:0)
您绝对可以训练网络,但您需要删除投射操作员。在那里使用sigmoid允许网络反向传播来自分类训练示例的错误。如果要对预测器中出现的预测进行二值化以分析准确性,您绝对可以这样做,但不能作为网络体系结构的集成部分。
这种方法实际上很常见 - 对于多类架构,softmax层产生的概率向量就是网络训练的概率向量。当使用它来预测类时,通常你会看到人们采用输出的概率向量并将其强制转换为单热矢量(或者只使用argmax获取最大预测值的索引)。但是为了反向传播工作,它必须能够在输出处计算误差的梯度,这排除了使用舍入(或任何其他此类步长函数)作为网络的组成部分。