当前位置: 首页 > 知识库问答 >
问题:

使用深度学习的多类多标签分类问题中损失函数的计算过程是什么?

龙亮
2023-03-14

数据集说明:

(1)X_train:(6000,4)形状

(2)y_train:(6000,4)形状

(3)X_validation:(2000,4)形状

(4) y_验证:(2000,4)形状

(5)X_test:(2000,4)形状

(6) y_检验:(2000,4)形状

这里显示了X和Y之间的关系

对于单标签分类,最后一层的激活函数为Softmax,损失函数为categorical_crossentrop。我知道损失函数的数学计算方法。

并且对于多类多标签分类问题,最后一层的激活函数为sigmoid,损失函数binary_crossentrop。我想知道损失函数的数学数据口径是如何工作的

如果你让我知道,对我会有很大的帮助。

def MinMaxScaler(data):
  numerator = data - np.min(data)
  denominator = np.max(data) - np.min(data)
  return numerator / (denominator + 1e-5)


kki = pd.read_csv(filename,names=['UE0','UE1','UE2','UE3','selected_UE0','selected_UE1','selected_UE2','selected_UE3'])

print(kki)

def LoadData(file):
  xy = np.loadtxt(file, delimiter=',', dtype=np.float32)
  print("Data set length:", len(xy))
  tr_set_size = int(len(xy) * 0.6)
  xy[:, 0:-number_of_UEs] = MinMaxScaler(xy[:, 0:-number_of_UEs]) #number_of_UES : 4

  X_train = xy[:tr_set_size, 0: -number_of_UEs] #6000 row
  y_train = xy[:tr_set_size, number_of_UEs:number_of_UEs*2]

  X_valid = xy[tr_set_size:int((tr_set_size/3) + tr_set_size), 0:-number_of_UEs]
  y_valid = xy[tr_set_size:int((tr_set_size/3) + tr_set_size), number_of_UEs:number_of_UEs *2]

  X_test = xy[int((tr_set_size/3) + tr_set_size):, 0:-number_of_UEs]
  y_test = xy[int((tr_set_size/3) + tr_set_size):, number_of_UEs:number_of_UEs*2]

  print("Training X shape:", X_train.shape)
  print("Training Y shape:", y_train.shape)
  print("validation x shape:", X_valid.shape)
  print("validation y shape:", y_valid.shape)
  print("Test X shape:", X_test.shape)
  print("Test Y shape:", y_test.shape)
  return X_train, y_train, X_valid, y_valid, X_test, y_test, tr_set_size


X_train, y_train, X_valid, y_valid, X_test, y_test, tr_set_size = LoadData(filename)

model = Sequential()
model.add(Dense(64,activation='relu', input_shape=(X_train.shape[1],)))
model.add(Dense(46, activation='relu'))
model.add(Dense(24, activation='relu')) 
model.add(Dense(12, activation='relu'))
model.add(Dense(4, activation= 'sigmoid'))

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

hist = model.fit(X_train, y_train, epochs=5, batch_size=1, verbose= 1, validation_data=(X_valid, y_valid), callbacks= es)

这是一个学习的过程,即使重复历史,准确性也不会提高。

Epoch 1/10

6000/6000 [==============================] - 14s 2ms/step - loss: 0.2999 - accuracy: 0.5345 - val_loss: 0.1691 - val_accuracy: 0.5465
Epoch 2/10

6000/6000 [==============================] - 14s 2ms/step - loss: 0.1554 - accuracy: 0.4883 - val_loss: 0.1228 - val_accuracy: 0.4710
Epoch 3/10

6000/6000 [==============================] - 14s 2ms/step - loss: 0.1259 - accuracy: 0.4710 - val_loss: 0.0893 - val_accuracy: 0.4910
Epoch 4/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.1094 - accuracy: 0.4990 - val_loss: 0.0918 - val_accuracy: 0.5540
Epoch 5/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.0967 - accuracy: 0.5223 - val_loss: 0.0671 - val_accuracy: 0.5405
Epoch 6/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.0910 - accuracy: 0.5198 - val_loss: 0.0836 - val_accuracy: 0.5380
Epoch 7/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.0870 - accuracy: 0.5348 - val_loss: 0.0853 - val_accuracy: 0.5775
Epoch 8/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.0859 - accuracy: 0.5518 - val_loss: 0.0515 - val_accuracy: 0.6520
Epoch 9/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.0792 - accuracy: 0.5508 - val_loss: 0.0629 - val_accuracy: 0.4350
Epoch 10/10

6000/6000 [==============================] - 13s 2ms/step - loss: 0.0793 - accuracy: 0.5638 - val_loss: 0.0632 - val_accuracy: 0.6270

共有1个答案

段干恺
2023-03-14

错误1-y\u列y\u验证y\u测试的形状应分别为(6000,)(2000,)(2000,)

错误2-对于多类分类,损失应该是categorical_crossentropy,激活应该是softmax。所以,改变这两行,像这样:

model.add(Dense(4, activation= 'softmax'))

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

建议-为什么要自己拆分数据?使用scikit学习训练测试\u分割。此代码将为您提供适当的拆分:

from sklearn.model_selection import train_test_split

x, x_test, y, y_test = train_test_split(xtrain, labels, test_size=0.2, train_size=0.8)
x_train, x_validation, y_train, y_validation = train_test_split(x, y, test_size = 0.25, train_size =0.75)
 类似资料:
  • 问题内容: 假设我具有以下参数的网络: 全卷积网络的语义分割 损失=加权二进制交叉熵(但可以是任何损失函数,都没有关系) 5类-输入是图像,地面真理是二进制掩码 批次大小= 16 现在,我知道损耗是通过以下方式计算的:关于每个类别,将二进制交叉熵应用于图像中的每个像素。因此,基本上每个像素都有5个损耗值 此步骤后会发生什么? 当我训练我的网络时,它只显示一个时期的单个损失值。产生单个值需要发生许多

  • 也许这是一个过于笼统的问题,但谁能解释什么会导致卷积神经网络发散? 规格: 我正在使用Tensorflow的iris_training模型和我自己的一些数据,并不断获得 错误:张量流:模型因损失=NaN而发散。 追踪。。。 tensor flow . contrib . learn . python . learn . monitors . nanlosduring training error:

  • 每次将一个类别作为正类,其余类别作为负类。此时共有(N个分类器)。在测试的时候若仅有一个分类器预测为正类,则对应的类别标记为最终的分类结果。 【例】当有4个类别的时候,每次把其中一个类别作为正类别,其余作为负类别,共有4种组合,对于这4中组合进行分类器的训练,我们可以得到4个分类器。对于测试样本,放进4个分类器进行预测,仅有一个分类器预测为正类,于是取这个分类器的结果作为预测结果,分类器2预测的结果是类别2,于是这个样本便属于类别

  • 校验者: @溪流-十四号 @大魔王飞仙 翻译者: @v Warning All classifiers in scikit-learn do multiclass classification out-of-the-box. You don’t need to use the sklearn.multiclass module unless you want to experiment with

  • 我正在y_test并y_pred混淆矩阵。我的数据用于多标签分类,因此行值是一种热编码。 我的数据有30个标签,但在输入混淆矩阵后,输出只有11行和列,这让我很困惑。我想我应该有一辆30X30的。 它们的格式是numpy数组。(y\u test和y\u pred是我使用dataframe.values将其转换为numpy数组的数据帧) y\U测试。形状 y_test y\u预测。形状 y\u预测

  • 本文向大家介绍Python编程深度学习计算库之numpy,包括了Python编程深度学习计算库之numpy的使用技巧和注意事项,需要的朋友参考一下 NumPy是python下的计算库,被非常广泛地应用,尤其是近来的深度学习的推广。在这篇文章中,将会介绍使用numpy进行一些最为基础的计算。 NumPy vs SciPy NumPy和SciPy都可以进行运算,主要区别如下 最近比较热门的深度学习,比