2 回答
![?](http://img1.sycdn.imooc.com/54584d560001571a02200220-100-100.jpg)
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)
![?](http://img1.sycdn.imooc.com/545867280001ed6402200220-100-100.jpg)
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)
添加回答
举报