python 神经网络损失 = 'categorical_crossentropy' vs 'binary_crossentropy' isse

Posted

技术标签:

【中文标题】python 神经网络损失 = \'categorical_crossentropy\' vs \'binary_crossentropy\' isse【英文标题】:python neural network loss = 'categorical_crossentropy' vs 'binary_crossentropy' issepython 神经网络损失 = 'categorical_crossentropy' vs 'binary_crossentropy' isse 【发布时间】:2021-12-24 20:02:51 【问题描述】:

我为某个 csv 创建了一个神经网络,将神经网络值保存到一个 h5 文件中,并通过提供给我的检查器进行检查。目前,我通过将 to_categorical 应用于数据的目标命中(1 = 目标命中,0 = 未命中)列来运行它,以获取它是否命中。我尝试过的另一种方法是获取目标命中列,完成 1 - 目标命中并使用

 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

这应该相当于 to_categorical 但我的准确性,在其他所有内容不变的情况下降低了大约 20%,我做错了什么?

from keras.models import Sequential
from keras.layers import Dense
from google.colab import files
import pandas as pd
import numpy as np
from tensorflow.keras.utils import to_categorical

df = pd.read_csv("dataset1.csv")
print(df.head)

Lt = np.array(df['Arm length (m)'][:])
Wt = np.array(df['Ball weight (kg)'][:])
Rt = np.array(df['Ball radius (mm)'][:])
Tt = np.array(df['Air temperature (deg C)'][:])
Et = np.array(df['Spring constant (N per m)'][:])
Dt = np.array(df['Device weight (kg)'][:])
Ot = np.array(df['Target hit'][:])
XtUnscaled = np.column_stack([Lt, Wt, Rt, Tt, Et, Dt])
scaleArray = np.array([np.zeros([6,]), np.ones([6,])])
Xt = (XtUnscaled-scaleArray[0,:])/scaleArray[1,:]
y = np.array(df['Target hit'][:])
Y = to_categorical(y)
# other methodology 
# Y = 1-Ot


model = Sequential()
model.add(Dense(12, input_dim=6, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(2, activation='sigmoid'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(Xt, yt, epochs=150, batch_size=32)
_, accuracy = model.evaluate(Xt, Y)
print('Accuracy: %.2f' % (accuracy*100))

【问题讨论】:

所以你的模型在 categorical_crossentropybinary_crossentropy 下表现良好? 不,它在 Y = 1-Ot 时表现良好,最后一层有 1 个节点,编译器损失是 binary_crossentropy,Y=to_categorical(Ot) 很差,最后一层有 2 个节点,损失 = 'categorical_crossentropy" 【参考方案1】:

由于您的目标数据有两个标签,0 或 1,这是binary classification model

因此,将BinaryCrossentropy 损失用于二元(0 或 1)分类,并在最后一层使用model.add(Dense(1, activation='sigmoid')),因为sigmoid 激活函数始终返回介于 0 和 1 之间的值。

CategoricalCrossentropy 有两个或多个标签类时使用的损失函数。

【讨论】:

以上是关于python 神经网络损失 = 'categorical_crossentropy' vs 'binary_crossentropy' isse的主要内容,如果未能解决你的问题,请参考以下文章

NN:神经网络学习,常见激活和损失函数的Python实现

《Python 深度学习》刷书笔记 Chapter 8 Part-3 神经网络风格转移

对数损失函数(Logarithmic Loss Function)的原理和 Python 实现

深度学习-Keras-层及损失函数

深度学习-Keras-层及损失函数

神经网络中的损失函数正则化和 Dropout 并手写代码实现