使用 tensorflow keras 预测 5 个不同类别的标签
Posted
技术标签:
【中文标题】使用 tensorflow keras 预测 5 个不同类别的标签【英文标题】:Predicting a label of 5 different classes with tensorflow keras 【发布时间】:2021-07-24 04:06:21 【问题描述】:我有以下问题,我有一个包含 3dprinter 数据的数据集,并希望使用 tensorflow nn 预测表示错误的标签。 但是,该标签从 0 到 5 - 我怎么能做到这一点?我需要五个不同的输出吗?因为据我了解分类,它只分配标签或不分配标签。
找不到任何关于这个的确切信息,可能是因为我不知道如何搜索它 - 在整个主题中相当新。
数据是单热编码或浮动的,我正在尝试使用 keras 调谐器来查找网络的超参数 - 我目前有它:
def build_model_hp(self, hp, model_type):
if model_type == 'standard':
shape = (59,)
elif model_type == 'expert':
shape = (73,)
else:
shape = (60,)
inputs = tf.keras.Input(shape=shape)
x = inputs
for i in range(hp.Int('hidden_blocks', 3, 10, default=3)):
x = tf.keras.layers.Dense(hp.Int('hidden_size_'+str(i), 16, 256, step=16, default=16), activation='relu')(x)
x = tf.keras.layers.Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5))(x)
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)
model = tf.keras.Model(inputs, outputs)
if (hp.Choice('optimizer', ['adam', 'sgd'])) == 'adam':
opt = tf.keras.optimizers.Adam(
hp.Float('learning_rate', 1e-4, 1e-2, sampling='log'))
else:
opt = tf.keras.optimizers.SGD(
hp.Float('learning_rate', 1e-4, 1e-2), nesterov=True)
model.compile(
optimizer=opt,
loss='binary_crossentropy',
metrics=['accuracy'])
return model
【问题讨论】:
【参考方案1】:如果您有 6 个标签为 0-5 的类,则将输出层从
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)
输出 = tf.keras.layers.Dense(6, activation='softmax')(x)
change your model compile code from
model.compile(
optimizer=opt,
loss='binary_crossentropy',
metrics=['accuracy'])
如果您的标签是一次性编码的,则如下所示
model.compile(
optimizer=opt,
loss='categorical_crossentropy',
metrics=['accuracy'])
如果你的标签是整数,那么使用
model.compile(
optimizer=opt,
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
在您训练模型后(假设您对标签进行热编码并使用 loss='categorical_crossentropy)然后对您的测试集进行预测
from sklearn.metrics import confusion_matrix, classification_report
classes=test_gen.class_indices.keys()
labels=test_gen.labels
y_pred=[]
y_true=[]
preds=model.predict(test_gen)
for i, p in enumerate(preds)
y_pred=np.argmax(p)
y_true=labels[i] # assumes you have a list of labels for each test file
ypred=np.array(y_pred)
ytrue=np.array(y_true)
clr = classification_report(y_true, y_pred, target_names=classes) # assumes classes is a list of your classes
print("Classification Report:\n----------------------\n", clr)
我假设您有一个生成批量测试数据的测试生成器
【讨论】:
非常感谢,metrics= ['accuracy'] 是这里最好的解决方案吗?还是我使用 categorical_accuracy 准确度还可以,但当您拥有超过 2 个类别时可能会产生误导,尤其是在您的数据集不平衡的情况下。例如,如果您有 3 个类的样本分布为 class0=10,000、class1=100 和 class2=100,那么如果您的模型方法选择 0 类,则 98% 的时间都是正确的。最好对测试集进行预测,然后使用 sklearn 分类报告来评估模型性能 我曾尝试使用 SparseTopKCategoricalAccuracy,但这给了我零测试精度......所以这显然不起作用。你对测试集的预测是什么意思?以上是关于使用 tensorflow keras 预测 5 个不同类别的标签的主要内容,如果未能解决你的问题,请参考以下文章
在 Keras 中使用 LSTM 预测股票(Python 3.7、Tensorflow 2.1.0)
使用 Keras、Tensorflow 进行具有多个时间序列维度的 RNN 时间序列预测