多类logistic回归Tensorflow 2.0

多类logistic回归Tensorflow 2.0,tensorflow,logistic-regression,tensorflow2.0,Tensorflow,Logistic Regression,Tensorflow2.0,我目前正在学习使用Tensoflow 2.0中的logistic回归进行多类分类。我认为我建立的模型是正确的,但在训练期间,我不断地得到0.333损失和66.67%的准确率。我相信损失应该减少,虽然每个时代的准确度都会提高,但无论发生什么情况,它都是一样的 有人能告诉我我的模特怎么了吗?为什么它没有收敛 def logisticRegression2(x,weight,bias): lr = tf.add(tf.matmul(x,weight),bias) #return sig

我目前正在学习使用Tensoflow 2.0中的logistic回归进行多类分类。我认为我建立的模型是正确的,但在训练期间,我不断地得到0.333损失和66.67%的准确率。我相信损失应该减少,虽然每个时代的准确度都会提高,但无论发生什么情况,它都是一样的

有人能告诉我我的模特怎么了吗?为什么它没有收敛

def logisticRegression2(x,weight,bias):
    lr = tf.add(tf.matmul(x,weight),bias)
    #return sigmoid fun
    #return tf.nn.signmoid(lr)
    return lr

def crossEntropy2(yTrue,yPredicted):
    loss = tf.nn.softmax(yPredicted)
    # reduce_mean: Computes the mean of elements across dimensions of a tensor.
    return tf.reduce_mean(loss)

def getAccuracy2(y_true, y_pred):
    y_true = tf.cast(y_true, dtype=tf.int64)
    preds = tf.cast(tf.argmax(y_pred, axis=0), dtype=tf.int64)
    preds = tf.equal(y_true, preds)
    return tf.reduce_mean(tf.cast(preds, dtype=tf.float64))


def gradientDescent2(x,y,weight,bias):
    with tf.GradientTape() as tape:
        yPredicted = logisticRegression2(x,weight,bias)
        lossValue = crossEntropy2(y,yPredicted)
        return tape.gradient(lossValue, [weight,bias] )

learningRate = 0.01
batchSize = 128
n_batches = 10000
optimizer2 = tf.optimizers.SGD(learningRate)


dataset2 = tf.data.Dataset.from_tensor_slices((trX, trY))
dataset2 = dataset2.repeat().shuffle(xTrain.shape[0]).batch(batchSize)

weight = tf.Variable(tf.zeros([4,3], dtype = tf.float64))
bias = tf.Variable(tf.zeros([3], dtype = tf.float64))
以下是我的培训循环:

predicted = []
for i, (xx2,xy2) in enumerate(dataset2.take(10000), 1):
    gradient = gradientDescent2(xx2,xy2,weight,bias)
    optimizer2.apply_gradients(zip(gradient,[weight,bias]))

    yPredicted = logisticRegression2(xx2,weight,bias)
    loss = crossEntropy2(xy2,yPredicted)
    accuracy = getAccuracy2(xy2,yPredicted)
    print("Batch number: %i, loss: %f, accuracy: %f" % (i, loss, accuracy*100))
输出:

Batch number: 1, loss: 0.333333, accuracy: 66.666667
Batch number: 2, loss: 0.333333, accuracy: 66.666667
Batch number: 3, loss: 0.333333, accuracy: 66.666667

Batch number: 9998, loss: 0.333333, accuracy: 66.666667
Batch number: 9999, loss: 0.333333, accuracy: 66.666667
Batch number: 10000, loss: 0.333333, accuracy: 66.666667

我使用的是UCI的Iris数据集。显然,代码中交叉熵的实现不完整/不正确。你只是在预测值上应用SoftMax,根本不考虑真正的标签!今天,好的,你推荐像softmax\u cross\u熵或sigmoid\u cross\u熵这样的东西吗?因为你在做多类分类,你需要使用。请注意,此函数本身应用softmax,因此您不应事先在logits上应用softmax。此外,真正的标签应该是一个热编码的。@今天我尝试了softmax\u cross\u entropy\u和带有yPredicted和一个热编码yTrue标签的\u logits,获得了0%的准确率。我使用的是UCI的Iris数据集。显然,代码中交叉熵的实现不完整/正确。你只是在预测值上应用SoftMax,根本不考虑真正的标签!今天,好的,你推荐像softmax\u cross\u熵或sigmoid\u cross\u熵这样的东西吗?因为你在做多类分类,你需要使用。请注意,此函数本身应用softmax,因此您不应事先在logits上应用softmax。此外,真正的标签应该是一个热编码的。@今天我尝试了softmax\u cross\u entropy\u和带有yPredicted和一个热编码yTrue标签的\u logits,一致获得了0%的准确率