Python 手动计算分类准确度不需要';与keras给出的答案不符

Python 手动计算分类准确度不需要';与keras给出的答案不符,python,machine-learning,keras,neural-network,tensorflow2.0,Python,Machine Learning,Keras,Neural Network,Tensorflow2.0,我在解释Kerasmodel.fit()方法的输出时遇到问题 设置 print(tf.version.VERSION) # 2.3.0 print(keras.__version__) # 2.4.0 对于三级分类问题,我有一个简单的前馈模型: def获取基线mlp(信号长度): 输入张量=keras.layers.input(信号长度,name=“输入”) 稠密_1=keras.layers.flatte()(输入_张量) 致密层=keras.layers.dense(名称='dense_1

我在解释Keras
model.fit()方法的输出时遇到问题

设置

print(tf.version.VERSION) # 2.3.0
print(keras.__version__) # 2.4.0
对于三级分类问题,我有一个简单的前馈模型:

def获取基线mlp(信号长度):
输入张量=keras.layers.input(信号长度,name=“输入”)
稠密_1=keras.layers.flatte()(输入_张量)
致密层=keras.layers.dense(名称='dense_1',活化='relu',单位=500)(致密层1)
致密层1=keras.layers.density(name='density_2',activation='relu',units=500)(致密层1)
致密层1=keras.layers.density(name='density_3',activation='relu',units=500)(致密层1)
稠密\u 1=keras.layers.density(name='density\u 4',activation='softmax',units=3,bias\u initializer='零')(稠密\u 1)
model=keras.models.model(输入=输入张量,输出=[densite\u 1])
model.summary()
回归模型
我的训练数据是单变量时间序列,我的输出是长度为3的一个热编码向量(我的分类问题中有3个类)

模型编译如下:

mlp_base.compile(optimizer=optimizer, 
                           loss='categorical_crossentropy',
                           metrics=['categorical_accuracy'])
我有一个功能,可以通过两种方法手动计算预测的准确性:

def get_精度(模型、真x、真y):
res=模型预测(真x)
分辨率=np.rint(分辨率)
右=0
对于范围内的i(len(true_y[:,0]):
如果np.array_相等(res[i,:],true_y[i,:]):
#打印(res[i,:],tr_y[i,:])
右+=1
其他:
通过
tot=len(真值[:,0])
打印('真实-总计',右,总计)
打印('acc:{}'。格式((右/tot)))
打印()
打印('方法2-分类')
res=模型预测(真x)
res=np.argmax(res,轴=-1)
真y=np.argmax(真y轴=-1)
右=0
对于范围内的i(len(true_y)):
如果res[i]==true\u y[i]:
右+=1
其他:
通过
tot=len(真值)
打印('真实-总计',右,总计)
打印('acc:{}'。格式((右/tot)))
问题

在训练结束时,输出的分类准确度与我使用自定义函数得到的分类准确度不匹配

培训产出:

Model: "functional_17"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           [(None, 9000)]            0         
_________________________________________________________________
flatten_8 (Flatten)          (None, 9000)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 500)               4500500   
_________________________________________________________________
dense_2 (Dense)              (None, 500)               250500    
_________________________________________________________________
dense_3 (Dense)              (None, 500)               250500    
_________________________________________________________________
dense_4 (Dense)              (None, 3)                 1503      
=================================================================
Total params: 5,003,003
Trainable params: 5,003,003
Non-trainable params: 0
-------------------------------------------------------------------
Fit model on training data
Epoch 1/2
20/20 [==] - 0s 14ms/step - loss: 1.3796 categorical_accuracy: 0.3250 - val_loss: 0.9240 - 
Epoch 2/2
20/20 [==] - 0s 8ms/step - loss: 0.8131 categorical_accuracy: 0.6100 - val_loss: 1.2811

精度函数的输出:

True / total 169 200
acc: 0.845

 method 2
True / total 182 200
acc: 0.91
为什么我会得到错误的结果?我的准确性实现有错吗

更新 按desertnaut建议更正设置仍不起作用

fit的输出:

1/3时代
105/105[=]-1s 9ms/步-损失:1.7666-分类准确率:0.2980
纪元2/3
105/105[=]-1s 6ms/步-损失:1.2380-分类精度:0.4432
纪元3/3
105/105[=]-1s 5ms/步-损失:1.0318-分类精度:0.5989
如果我使用keras的分类准确度函数,我仍然会得到不同的结果

cat_acc=keras.metrics.category准确性()
cat附件更新状态(tr_y2,y_pred)
打印(cat_acc.result().numpy())#输出:0.7211079

有趣的是,如果我使用上述方法计算验证精度,我会得到一致的输出。

对您的精度计算不太确定(似乎没有必要进行卷积,对于
循环,我们总是喜欢向量计算而不是
),但您的代码有两个问题可能会影响结果(甚至让它们变得毫无意义)

第一个问题是,由于您处于多类设置中,您应该使用
loss='classifical'u crossentropy'
,而不是
,来编译您的模型;检查自己的答案,看看当您以这种方式混合损失和精度时会发生什么(另外,这里的“二进制精度”是绝对没有意义的)


第二个问题是您错误地将
activation='sigmoid'
用于最后一层:因为您处于多类(而不是多标签)中使用标签设置一个热编码,最后一层中的激活应该是
softmax
,而不是
sigmoid

谢谢,错误的设置是我的功能中计算精度不匹配的原因(方法2)和keras的一个。使用相同的设置,但使用二进制交叉熵、sigmoid作为最后一层激活和二进制精度存在不匹配。精度函数的(卷积)第一部分有什么问题?这是计算二进制分类设置精度的正确方法吗?提前感谢:)@MickHardins如前所述,在这种情况下,我们不对循环使用
,而是使用向量和数组运算;您应该能够仅使用数组方法(如
argmax
mean
等)计算~5行的精度。请参阅相应的示例以获得一些启示。如果答案解决了您的问题,请接受我已经更新了这个问题,因为这个问题似乎还没有解决。