使用 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 时间序列预测

Tensorflow Keras - 训练时准确率高,预测时准确率低

TensorFlow基本使用

TensorFlow基本使用

TensorFlow基本使用