Keras-了解示例

时间:2019-12-03 16:48:41

标签: keras deep-learning

我目前正在尝试通过重点研究Keras和《用Python-Keras进行深度学习》一书来学习深度学习。

我确实有一个例子-我确实了解代码,但不了解结果-我需要您的帮助。该示例是关于分析Keras中包含的imdB数据集的电影评论。代码如下:

def vectorize_sequences(sequences,dimension=10000):
    results=np.zeros((len(sequences),dimension))
    for i, sequence in enumerate(sequences):
        results[i,sequence]=1.
    return results

X_train=vectorize_sequences(train_data)
X_test=vectorize_sequences(test_data)
y_train=np.asarray(train_labels)
y_test=np.asarray(test_labels)

model=models.Sequential()
model.add(layers.Dense(16,activation="relu",input_shape=(10000,)))
model.add(layers.Dense(16,activation="relu"))
model.add(layers.Dense(1,activation="sigmoid"))
model.compile(optimizer="rmsprop",loss="binary_crossentropy",metrics=["accuracy"])

history=model.fit(X_train,y_train,epochs=4,batch_size=512)

在解释中写道,“最后一层将使用S型激活,以便输出一个概率,该概率指示样本具有目标“ 1”的可能性”

我知道S型函数的范围是[0,1]。假设我的网络输出为0.6 为什么我可以说这个值赋予目标为“ 1”而不是目标为“ 0”的可能性?

我有点卡住,需要一些帮助:)

1 个答案:

答案 0 :(得分:1)

输出内容的解释取决于您在培训期间使用的标签。因此train_labelstest_labels的结论是0和1。
在训练过程中,对网络进行优化以产生与输入序列相对应的正确标签。因此,如果您的输出为0或1,则网络会给出可靠的分类。但是,如果您的输出是0.5,网络完全不确定您的输入所属的类。

现在,我们假设您的输入对应于类1。在输出为0.6的情况下,该类可能为1,但置信度只有60%。它描述的概率是1类,因为输出1是对其标签输入的正确解释。如果输出为0,则由于标签为1,因此它将是输入的最差分类。因此,最后该值对应于范围从0到1的值,而越接近1,则分类越好-因此到底是概率。
但是请记住,只有在您知道输入属于类1的情况下,此定义才成立。如果它属于类0的一部分,则必须将先前的定义转过来。

最后,您有两个选择。首先,您可以按原样使用这些值,并将其视为输入对应于其中一个类的概率。其次,您可以引入一个阈值-在这种情况下,将其设置为0.5是有意义的-并说,如果您大于阈值,则将输入归类为1类,否则归为0类。输出越接近0.5最后,网络只是猜测课程。

阈值的选择最终会直接影响网络的性能。例如,可以使用ROC曲线(https://en.wikipedia.org/wiki/Receiver_operating_characteristic)对此进行评估。