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

2024-04-20 16:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

数据集描述:

(1)X_列:(6000,4)

(2)y_列:(6000,4)

(3)X_验证:(2000,4)形状

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

(5)X_检验:(2000,4)

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

X和Y之间的关系显示为here

对于单标签分类,最后一层的激活函数为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条回答
网友
1楼 · 发布于 2024-04-20 16:02:07

错误1- y_trainy_validationy_test的形状应分别为(6000,)(2000,)(2000,)

错误2- 对于多类别分类,损失应为categorical_crossentropy,激活应为softmax。所以,更改这两行,如下所示:

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

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

建议- 为什么要自己拆分数据?使用scikit学习train_test_split。此代码将为您提供适当的拆分:

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)

相关问题 更多 >