2 回答

TA貢獻1802條經驗 獲得超10個贊
如果您有 18 個類別,則 的形狀y_train
應該是(392436, 18)
。您可以tf.one_hot
為此使用:
import tensorflow as tf y_train = tf.one_hot(y_train, depth=len(labels))
如果您從一列中獲取值,我懷疑這不是“多標簽”,而是多類。一個樣本真的可以屬于多個類別嗎?如果沒有,您還需要更改其他一些內容。例如,您需要 softmax 激活:
model.add(Dense(len(labels), activation='softmax'))
還有分類交叉熵損失:
model.compile(loss='categorical_crossentropy', optimizer=sgd)

TA貢獻1856條經驗 獲得超11個贊
你的標簽是一維的......如果你的目標是操作多標簽任務,你需要對它們進行一次性編碼。您可以簡單地使用
tf.keras.utils.to_categorical(y, num_classes)
通過這種方式,您可以將目標從 (n_sample) 轉換為 (n_sample, num_classes)
如果這是一個簡單的多類問題,那么您有以下兩種可能性:
1 種可能性)如果您有 1D 整數編碼目標,您可以使用sparse_categorical_crossentropy帶有softmax激活的損失函數來生成概率
n_class = 3
n_features = 100
n_sample = 1000
X = np.random.randint(0,10, (n_sample,n_features))
y = np.random.randint(0,n_class, n_sample)
inp = Input((n_features,))
x = Dense(128, activation='relu')(inp)
out = Dense(n_class, activation='softmax')(x)
model = Model(inp, out)
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = model.fit(X, y, epochs=3)
pred = np.argmax(model.predict(X), 1)
2 種可能性)如果您對目標進行了 one-hot 編碼以獲得 2D 形狀(n_samples, num_classes),則可以categorical_crossentropy與softmax激活一起使用來生成概率
n_class = 3
n_features = 100
n_sample = 1000
X = np.random.randint(0,10, (n_sample,n_features))
y = tf.keras.utils.to_categorical(np.random.randint(0,n_class, n_sample))
inp = Input((n_features,))
x = Dense(128, activation='relu')(inp)
out = Dense(n_class, activation='softmax')(x)
model = Model(inp, out)
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
history = model.fit(X, y, epochs=3)
pred = np.argmax(model.predict(X), 1)
添加回答
舉報