繁体   English   中英

无法弄清楚为什么我只能从预测函数中得到一个值?

[英]Can't figure out why I'm only getting one value from predict function?

我已经使用keras层构建并训练了顺序二进制分类模型。 在我开始使用predict方法之前,一切似乎都可以正常工作。 这个函数开始给我一个怪异的指数值,而不是两个类的概率。 这是我训练后在模型上使用预测方法后得到的

这个分类模型有两个类别,假设是猫还是狗,所以我期望结果类似于[99.9999,0.0001],暗示它是猫。 我不确定如何解释我回来的价值。

这是我的代码:

# Get the data.
    (train_texts, train_labels), (val_texts, val_labels) = data
    train_labels = np.asarray(train_labels).astype('float32')
    val_labels = np.asarray(val_labels).astype('float32')

    # Vectorizing data
    train_texts,val_texts, word_index = vectorize_data.sequence_vectorize(
        train_texts, val_texts)

    # Building the model architecture( adding layers to the model)
    model = build_model.simple_model_layers(train_texts.shape[1:])

    # Setting and compiling with the features like the optimizer, loss and metrics functions
    model = build_model.simple_model_compile(model=model)

    # This is when the learning happens
    history = model.fit(train_texts,
                        train_labels,
                        epochs=EPOCHS,
                        validation_data=(val_texts, val_labels),
                        verbose=VERBOSE_OFF, batch_size=BATCH_SIZE)

    print('Validation accuracy: {acc}, loss: {loss}'.format(
        acc=history['val_acc'][-1], loss=history['val_loss'][-1]))

    # loading data to predict on
    test_text = any
    with open('text_req.pickle', 'rb') as pickle_file:
        test_text = pickle.load(pickle_file)


    print('Lets make a prediction of this requirement:')
    prediction = model.predict(test_text, batch_size=None, verbose=0, steps=None)
    print(prediction)

这是简单模型函数的样子:

model = models.Sequential()
    model.add(Dense(26, activation='relu', input_shape=input_shape))
    model.add(Dense(16, activation='relu'))
    model.add(Dense(10, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    return model

渐变目标函数:optimizer ='adam',损失='binary_crossentropy'

样本数据为String类型,我使用padding和all将其转换为1和0的恒定大小矩阵。 这些功能具有两个类别,因此标签仅是1和0。全部用于数据。 在我看来,数据似乎不是问题,它可能比我忽略但未能认识到的数据更琐碎。

谢谢大家,最后一个问题已解决,但是我需要对此有更好的理解:

我读到sigmoid返回所有可能类的概率,所有概率应加起来为1。我得到的值是:

Validation accuracy: 0.792168688343232, loss: 2.8360600299145804
Let's make a prediction of this requirement:

    [[2.7182817, 1.       ]
     [2.7182817, 1.       ]
     [1.,        2.7182817]
     [1. ,       2.7182817]]

它们的总和不等于1,并且将这些值视为1,否则对其构成的直观性不够。

您的模型只有一个输出。 如果将训练标签的cat设置为0,将dog设置为1,则意味着如果输出为[[2.977094e-12]] ,则网络[[2.977094e-12]]猫。 如果您希望像预期的那样获得两个类的概率,则需要按如下所示更改模型的输出:

model = models.Sequential()
model.add(Dense(26, activation='relu', input_shape=input_shape))
model.add(Dense(16, activation='relu'))
model.add(Dense(10, activation='relu')
model.add(Dense(2, activation='softmax'))

猫和狗的标签也需要分别更改为[1, 0][0, 1]

我想澄清一下,您不会得到一个怪异的指数值,而只是得到了一个怪异的值。 E是x10的科学记数法,因此您基本上得到2.7 x 10 ^ -12。 我很乐意提供帮助,但是我无法检查您的数据或模型。 我试图对您的代码的某些部分进行Google搜索,希望能找到一些澄清,但似乎无法找出这两行的含义:

model = build_model.simple_model_layers(train_texts.shape[1:])
model = build_model.simple_model_compile(model=model)

我不知道已经建立了什么网络,我想至少知道损失函数和完整的最后一层,这已经很困难了。 您还确定数据正确吗?

编辑:

sigmoid不会执行您描述的操作,softmax会执行此操作。 Sigmoid通常用作多标签分类,因为它可以将多个标签检测为True。 乙状结肠输出可能看起来像[0.99,0.3],它具有分别查看每个标签的能力。 另一方面,Softmax却不是,softmax看起来像[0.99,0.01],所有概率的总和始终为1。

这就解决了混乱,现在关于您的输出,我不知道那是什么,它应该在1到0之间,除非我在这里丢失了一些东西。

为了回答您向K. Streutker提出的数据问题:神经网络的目标是在新数据上创建输入的标签。 如果需要概率分布,则还需要添加一个。 每个图像都应带有标签[1,0]和狗[0,1],或随意翻转。 然后,一旦训练好模型,便可以为您提供两个有意义的输出。 损失函数(很可能是交叉熵)会使用这些标签和模型的输出,并尝试使随时间的差异最小化。 因此,这就是您所需要的:

图片(狗)->模型->损失->优化器,用于更新权重

标签([0,1])------------------┘

然后预测会像这样

图片->模型->标签

希望我能有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM