代码示例 / 自然语言处理 / 通过主动学习进行评论分类

通过主动学习进行评论分类

作者: Darshan Deshpande
创建日期: 2021/10/29
最后修改: 2024/05/08
描述: 通过评论分类演示主动学习的优势。

在 Colab 中查看 GitHub 源代码


介绍

随着以数据为中心的机器学习的增长,主动学习在企业和研究人员中变得越来越流行。主动学习旨在逐步训练机器学习模型,使得最终模型所需的训练数据量较少,从而获得竞争力的评分。

主动学习管道的结构包括一个分类器和一个 oracle。oracle 是一个注释者,负责清理、选择、标记数据,并在需要时将其输入模型。oracle 是经过培训的个人或一组个人,确保新数据的标记一致性。

该过程从注释整个数据集中一个小子集开始,并训练一个初始模型。保存最佳模型检查点,然后在平衡测试集上进行测试。测试集必须经过仔细采样,因为整个训练过程将依赖于它。一旦我们得到初步评估分数,oracle 就会负责标记更多样本;样本数据点的数量通常由业务需求决定。此后,将新采样的数据添加到训练集中,训练过程重复进行。这个循环会一直持续,直到达到可接受的分数或满足其他业务指标。

本教程提供了主动学习原理的基本演示,通过展示一种基于比率(最小置信度)的采样策略,该策略与在整个数据集上训练的模型相比,导致整体假阳性和假阴性率更低。这种采样属于 不确定性采样 领域,其中新的数据集是根据模型对相应标签输出的不确定性进行采样的。在我们的例子中,我们对模型的假阳性和假阴性率进行比较,并基于这些比率注释新数据。

其他一些采样技术包括:

  1. 委员会采样: 使用多个模型投票选择最佳数据点进行采样
  2. 熵减少: 根据熵阈值得到的样本进行采样,选择产生最高熵分数的样本
  3. 最小边际采样: 选择最接近决策边界的数据点

导入所需库

import os

os.environ["KERAS_BACKEND"] = "tensorflow"  # @param ["tensorflow", "jax", "torch"]
import keras
from keras import ops
from keras import layers
import tensorflow_datasets as tfds
import tensorflow as tf
import matplotlib.pyplot as plt
import re
import string

tfds.disable_progress_bar()

加载和预处理数据

我们将使用 IMDB 评论数据集进行实验。此数据集共有 50,000 条评论,包括训练和测试拆分。我们将合并这些拆分并抽样我们自己的平衡训练、验证和测试集。

dataset = tfds.load(
    "imdb_reviews",
    split="train + test",
    as_supervised=True,
    batch_size=-1,
    shuffle_files=False,
)
reviews, labels = tfds.as_numpy(dataset)

print("总例数:", reviews.shape[0])
总例数: 50000

主动学习从标记一部分数据开始。对于我们将使用的比率采样技术,我们需要良好平衡的训练、验证和测试拆分。 val_split = 2500 test_split = 2500 train_split = 7500

分离负样本和正样本用于手动分层

x_positives, y_positives = reviews[labels == 1], labels[labels == 1] x_negatives, y_negatives = reviews[labels == 0], labels[labels == 0]

创建训练集、验证集和测试集

x_val, y_val = ( tf.concat((x_positives[:val_split], x_negatives[:val_split]), 0), tf.concat((y_positives[:val_split], y_negatives[:val_split]), 0), ) x_test, y_test = ( tf.concat( ( x_positives[val_split : val_split + test_split], x_negatives[val_split : val_split + test_split], ), 0, ), tf.concat( ( y_positives[val_split : val_split + test_split], y_negatives[val_split : val_split + test_split], ), 0, ), ) x_train, y_train = ( tf.concat( ( x_positives[val_split + test_split : val_split + test_split + train_split], x_negatives[val_split + test_split : val_split + test_split + train_split], ), 0, ), tf.concat( ( y_positives[val_split + test_split : val_split + test_split + train_split], y_negatives[val_split + test_split : val_split + test_split + train_split], ), 0, ), )

剩余样本池单独存储。这些样本仅在需要时进行标记

x_pool_positives, y_pool_positives = ( x_positives[val_split + test_split + train_split :], y_positives[val_split + test_split + train_split :], ) x_pool_negatives, y_pool_negatives = ( x_negatives[val_split + test_split + train_split :], y_negatives[val_split + test_split + train_split :], )

创建TF数据集以加快预取和并行处理

train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val)) test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))

pool_negatives = tf.data.Dataset.from_tensor_slices( (x_pool_negatives, y_pool_negatives) ) pool_positives = tf.data.Dataset.from_tensor_slices( (x_pool_positives, y_pool_positives) )

print(f"初始训练集大小: {len(train_dataset)}") print(f"验证集大小: {len(val_dataset)}") print(f"测试集大小: {len(test_dataset)}") print(f"未标记的负样本池: {len(pool_negatives)}") print(f"未标记的正样本池: {len(pool_positives)}")

<div class="k-default-codeblock">

初始训练集大小:15000 验证集大小:5000 测试集大小:5000 未标记的负样本池:12500 未标记的正样本池:12500

</div>
### 拟合 `TextVectorization` 层

由于我们正在处理文本数据,我们需要将文本字符串编码为向量,然后通过 `Embedding` 层传递。为了加快这个标记化过程,我们使用 `map()` 函数及其并行化功能。


```python

vectorizer = layers.TextVectorization(
    3000, standardize="lower_and_strip_punctuation", output_sequence_length=150
)
# 调整数据集
vectorizer.adapt(
    train_dataset.map(lambda x, y: x, num_parallel_calls=tf.data.AUTOTUNE).batch(256)
)


def vectorize_text(text, label):
    text = vectorizer(text)
    return text, label


train_dataset = train_dataset.map(
    vectorize_text, num_parallel_calls=tf.data.AUTOTUNE
).prefetch(tf.data.AUTOTUNE)
pool_negatives = pool_negatives.map(vectorize_text, num_parallel_calls=tf.data.AUTOTUNE)
pool_positives = pool_positives.map(vectorize_text, num_parallel_calls=tf.data.AUTOTUNE)

val_dataset = val_dataset.batch(256).map(
    vectorize_text, num_parallel_calls=tf.data.AUTOTUNE
)
test_dataset = test_dataset.batch(256).map(
    vectorize_text, num_parallel_calls=tf.data.AUTOTUNE
)

创建辅助函数

# 合并新的历史对象与旧的对象的辅助函数
def append_history(losses, val_losses, accuracy, val_accuracy, history):
    losses = losses + history.history["loss"]
    val_losses = val_losses + history.history["val_loss"]
    accuracy = accuracy + history.history["binary_accuracy"]
    val_accuracy = val_accuracy + history.history["val_binary_accuracy"]
    return losses, val_losses, accuracy, val_accuracy


# 绘图函数
def plot_history(losses, val_losses, accuracies, val_accuracies):
    plt.plot(losses)
    plt.plot(val_losses)
    plt.legend(["train_loss", "val_loss"])
    plt.xlabel("Epochs")
    plt.ylabel("Loss")
    plt.show()

    plt.plot(accuracies)
    plt.plot(val_accuracies)
    plt.legend(["train_accuracy", "val_accuracy"])
    plt.xlabel("Epochs")
    plt.ylabel("Accuracy")
    plt.show()

创建模型

我们创建一个小的双向LSTM模型。当使用主动学习时,您应确保模型架构能够对初始数据进行过拟合。 过拟合强烈暗示模型将具有足够的能力处理未来未见的数据。

def create_model():
    model = keras.models.Sequential(
        [
            layers.Input(shape=(150,)),
            layers.Embedding(input_dim=3000, output_dim=128),
            layers.Bidirectional(layers.LSTM(32, return_sequences=True)),
            layers.GlobalMaxPool1D(),
            layers.Dense(20, activation="relu"),
            layers.Dropout(0.5),
            layers.Dense(1, activation="sigmoid"),
        ]
    )
    model.summary()
    return model

在整个数据集上训练

为了展示主动学习的有效性,我们将首先在包含40,000个标记样本的整个数据集上训练模型。该模型将在后续作为比较使用。

def train_full_model(full_train_dataset, val_dataset, test_dataset):
    model = create_model()
    model.compile(
        loss="binary_crossentropy",
        optimizer="rmsprop",
        metrics=[
            keras.metrics.BinaryAccuracy(),
            keras.metrics.FalseNegatives(),
            keras.metrics.FalsePositives(),
        ],
    )

    # 我们将在每个epoch保存最佳模型,并在测试集上评估时加载最佳模型
    history = model.fit(
        full_train_dataset.batch(256),
        epochs=20,
        validation_data=val_dataset,
        callbacks=[
            keras.callbacks.EarlyStopping(patience=4, verbose=1),
            keras.callbacks.ModelCheckpoint(
                "FullModelCheckpoint.keras", verbose=1, save_best_only=True
            ),
        ],
    )

    # 绘制历史
    plot_history(
        history.history["loss"],
        history.history["val_loss"],
        history.history["binary_accuracy"],
        history.history["val_binary_accuracy"],
    )

    # 加载最佳检查点
    model = keras.models.load_model("FullModelCheckpoint.keras")

    print("-" * 100)
    print(
        "测试集评估: ",
        model.evaluate(test_dataset, verbose=0, return_dict=True),
    )
    print("-" * 100)
    return model


# 抽样完整训练数据集进行训练
full_train_dataset = (
    train_dataset.concatenate(pool_positives)
    .concatenate(pool_negatives)
    .cache()
    .shuffle(20000)
)

# 训练完整模型
full_dataset_model = train_full_model(full_train_dataset, val_dataset, test_dataset)
模型: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ 层 (类型)                     输出形状                  参数 # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ embedding (嵌入)           │ (, 150, 128)       │       384,000 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ bidirectional (双向)   │ (, 150, 64)        │        41,216 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ global_max_pooling1d            │ (, 64)             │             0 │
│ (全局最大池化1D)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (密集)                   │ (, 20)             │         1,300 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout (丢弃)               │ (, 20)             │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (密集)                 │ (, 1)              │            21 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 总参数: 426,537 (1.63 MB)
 可训练参数: 426,537 (1.63 MB)
 非可训练参数: 0 (0.00 B)
轮次 1/20

156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/步 - 二进制准确率: 0.6412 - 假阴性: 2084.3333 - 假阳性: 5252.1924 - 损失: 0.6507

轮次 1: val_loss 从 inf 改进到 0.57198, 保存模型到 FullModelCheckpoint.keras

157/157 ━━━━━━━━━━━━━━━━━━━━ 15s 79ms/步 - 二进制准确率: 0.6411 - 假阴性: 2135.1772 - 假阳性: 5292.4053 - 损失: 0.6506 - val_binary_accuracy: 0.7356 - val_false_negatives: 898.0000 - val_false_positives: 424.0000 - val_loss: 0.5720

轮次 2/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.7448 - false_negatives: 1756.2756 - false_positives: 3249.1411 - loss: 0.5416
第二轮:val_loss 从 0.57198 改进到 0.41756,正在保存模型到 FullModelCheckpoint.keras
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.7450 - false_negatives: 1783.8925 - false_positives: 3279.8101 - loss: 0.5412 - val_binary_accuracy: 0.8156 - val_false_negatives: 531.0000 - val_false_positives: 391.0000 - val_loss: 0.4176
第3轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8162 - false_negatives: 1539.7693 - false_positives: 2197.1475 - loss: 0.4254
第三轮:val_loss 从 0.41756 改进到 0.38233,正在保存模型到 FullModelCheckpoint.keras
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.8161 - false_negatives: 1562.6962 - false_positives: 2221.5886 - loss: 0.4254 - val_binary_accuracy: 0.8340 - val_false_negatives: 496.0000 - val_false_positives: 334.0000 - val_loss: 0.3823
第4轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8413 - false_negatives: 1400.6538 - false_positives: 1818.7372 - loss: 0.3837
第四轮:val_loss 从 0.38233 改进到 0.36235,正在保存模型到 FullModelCheckpoint.keras
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.8412 - false_negatives: 1421.5063 - false_positives: 1839.3102 - loss: 0.3838 - val_binary_accuracy: 0.8396 - val_false_negatives: 548.0000 - val_false_positives: 254.0000 - val_loss: 0.3623
第5轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8611 - false_negatives: 1264.5256 - false_positives: 1573.5962 - loss: 0.3468
第五轮:val_loss 未从 0.36235 改进
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 75ms/step - binary_accuracy: 0.8611 - false_negatives: 1283.0632 - false_positives: 1592.3228 - loss: 0.3468 - val_binary_accuracy: 0.8222 - val_false_negatives: 734.0000 - val_false_positives: 155.0000 - val_loss: 0.4081
第6轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8706 - false_negatives: 1186.9166 - false_positives: 1427.9487 - loss: 0.3301
第6轮:val_loss 从 0.36235 改进到 0.35041,正在保存模型到 FullModelCheckpoint.keras
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.8705 - false_negatives: 1204.8038 - false_positives: 1444.9368 - loss: 0.3302 - val_binary_accuracy: 0.8412 - val_false_negatives: 569.0000 - val_false_positives: 225.0000 - val_loss: 0.3504
第7轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8768 - false_negatives: 1162.4423 - false_positives: 1342.4807 - loss: 0.3084
第7轮:val_loss 从 0.35041 改进到 0.32680,正在保存模型到 FullModelCheckpoint.keras
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.8768 - false_negatives: 1179.5253 - false_positives: 1358.4114 - loss: 0.3085 - val_binary_accuracy: 0.8590 - val_false_negatives: 364.0000 - val_false_positives: 341.0000 - val_loss: 0.3268
第8轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step - binary_accuracy: 0.8865 - false_negatives: 1079.3206 - false_positives: 1250.2693 - loss: 0.2924
第8轮:val_loss 未从 0.32680 改进
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.8864 - false_negatives: 1094.9873 - false_positives: 1265.0632 - loss: 0.2926 - val_binary_accuracy: 0.8460 - val_false_negatives: 548.0000 - val_false_positives: 222.0000 - val_loss: 0.3432
第9轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step - binary_accuracy: 0.8912 - false_negatives: 1019.1987 - false_positives: 1189.4551 - loss: 0.2807
第9轮:val_loss 未从 0.32680 改进
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 77ms/step - binary_accuracy: 0.8912 - false_negatives: 1033.9684 - false_positives: 1203.5632 - loss: 0.2808 - val_binary_accuracy: 0.8588 - val_false_negatives: 330.0000 - val_false_positives: 376.0000 - val_loss: 0.3302
第10轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8997 - false_negatives: 968.6346 - false_positives: 1109.9103 - loss: 0.2669
轮次 10: val_loss 没有从 0.32680 改善
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.8996 - false_negatives: 983.1202 - false_positives: 1123.3418 - loss: 0.2671 - val_binary_accuracy: 0.8558 - val_false_negatives: 445.0000 - val_false_positives: 276.0000 - val_loss: 0.3413
第 11 轮/20
156/157 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.9055 - false_negatives: 937.0320 - false_positives: 1000.8589 - loss: 0.2520
第 11 轮: val_loss 没有从 0.32680 改进
157/157 ━━━━━━━━━━━━━━━━━━━━ 12s 76ms/step - binary_accuracy: 0.9055 - false_negatives: 950.3608 - false_positives: 1013.6456 - loss: 0.2521 - val_binary_accuracy: 0.8602 - val_false_negatives: 402.0000 - val_false_positives: 297.0000 - val_loss: 0.3281
第 11 轮: 提前停止
![png](/img/examples/nlp/active_learning_review_classification/active_learning_review_classification_15_1755.png) ![png](/img/examples/nlp/active_learning_review_classification/active_learning_review_classification_15_1756.png)
----------------------------------------------------------------------------------------------------

测试集评估:  {'binary_accuracy': 0.8507999777793884, 'false_negatives': 397.0, 'false_positives': 349.0, 'loss': 0.3372706174850464}
----------------------------------------------------------------------------------------------------
--- ## 通过主动学习进行训练 我们在执行主动学习时遵循的一般过程如下所示: ![主动学习](https://i.imgur.com/dmNKusp.png) 管道可以总结为五个部分: 1. 采样并标注一个小的、平衡的训练数据集 2. 在这个小子集上训练模型 3. 在一个平衡的测试集上评估模型 4. 如果模型满足业务标准,将其部署到实时设置中 5. 如果未通过标准,则根据假阳性和假阴性的比例采样一些更多样本,将它们添加到训练集中,并从步骤2重复,直到模型通过测试或所有可用数据耗尽。 对于下面的代码,我们将使用以下公式进行采样:
![比例采样](https://i.imgur.com/LyZEiZL.png) 主动学习技术广泛使用回调进行进度跟踪。我们将使用模型检查点和提前停止来进行此示例。提前停止的 `patience` 参数可以帮助减少过拟合和所需时间。我们目前将其设置为 `patience=4`,但由于模型是稳健的,如果需要,我们可以增加耐心级别。 注意:在第一次训练迭代后,我们不加载检查点。在我从事主动学习技术的经验中,这有助于模型探测新形成的损失地形。即使模型在第二次迭代中未能改进,我们仍将获得关于未来可能的假阳性和假阴性率的见解。这将帮助我们在下一个迭代中采样更好的集合,从而使模型有更大的机会提高。
def train_active_learning_models(
    train_dataset,
    pool_negatives,
    pool_positives,
    val_dataset,
    test_dataset,
    num_iterations=3,
    sampling_size=5000,
):

    # 创建用于存储指标的列表
    losses, val_losses, accuracies, val_accuracies = [], [], [], []

    model = create_model()
    # 我们将监控模型预测的假阳性和假阴性
    # 这些将决定每个主动学习循环后续的采样比率
    model.compile(
        loss="binary_crossentropy",
        optimizer="rmsprop",
        metrics=[
            keras.metrics.BinaryAccuracy(),
            keras.metrics.FalseNegatives(),
            keras.metrics.FalsePositives(),
        ],
    )

    # 定义检查点。
    # 检查点回调在整个训练过程中重用,因为它只保存最佳的整体模型。
    checkpoint = keras.callbacks.ModelCheckpoint(
        "AL_Model.keras", save_best_only=True, verbose=1
    )
    # 这里,耐心值设置为4。如果需要,可以设置得更高。
    early_stopping = keras.callbacks.EarlyStopping(patience=4, verbose=1)

    print(f"开始训练 {len(train_dataset)} 个样本")
    # 在小部分训练集上进行初始拟合
    history = model.fit(
        train_dataset.cache().shuffle(20000).batch(256),
        epochs=20,
        validation_data=val_dataset,
        callbacks=[checkpoint, early_stopping],
    )

    # 追加历史记录
    losses, val_losses, accuracies, val_accuracies = append_history(
        losses, val_losses, accuracies, val_accuracies, history
    )

    for iteration in range(num_iterations):
        # 从之前训练的模型获取预测
        predictions = model.predict(test_dataset)

        # 从输出概率生成标签
        rounded = ops.where(ops.greater(predictions, 0.5), 1, 0)

        # 评估错误分类的零和一的数量
        _, _, false_negatives, false_positives = model.evaluate(test_dataset, verbose=0)

        print("-" * 100)
        print(
            f"错误分类的零的数量: {false_negatives}, 错误分类的一的数量: {false_positives}"
        )

        # 这种主动学习技术演示了基于比例的采样,其中
        # 采样的正样本/负样本数量 = 错误分类的正样本/负样本数量 / 总的错误分类数量
        if false_negatives != 0 and false_positives != 0:
            total = false_negatives + false_positives
            sample_ratio_ones, sample_ratio_zeros = (
                false_positives / total,
                false_negatives / total,
            )
        # 如果所有样本都被正确预测,我们可以均匀采样两个类别
        else:
            sample_ratio_ones, sample_ratio_zeros = 0.5, 0.5

        print(
            f"正样本的采样比率: {sample_ratio_ones}, 负样本的采样比率: {sample_ratio_zeros}"
        )

        # 采样所需数量的正样本和负样本
        sampled_dataset = pool_negatives.take(
            int(sample_ratio_zeros * sampling_size)
        ).concatenate(pool_positives.take(int(sample_ratio_ones * sampling_size)))

        # 跳过采样的数据点以避免样本重复
        pool_negatives = pool_negatives.skip(int(sample_ratio_zeros * sampling_size))
        pool_positives = pool_positives.skip(int(sample_ratio_ones * sampling_size))

        # 将 train_dataset 与 sampled_dataset 进行连接
        train_dataset = train_dataset.concatenate(sampled_dataset).prefetch(
            tf.data.AUTOTUNE
        )

        print(f"开始训练 {len(train_dataset)} 个样本")
        print("-" * 100)

        # 我们重新编译模型以重置优化器状态并重新训练模型
        model.compile(
            loss="binary_crossentropy",
            optimizer="rmsprop",
            metrics=[
                keras.metrics.BinaryAccuracy(),
                keras.metrics.FalseNegatives(),
                keras.metrics.FalsePositives(),
            ],
        )
        history = model.fit(
            train_dataset.cache().shuffle(20000).batch(256),
            validation_data=val_dataset,
            epochs=20,
            callbacks=[
                checkpoint,
                keras.callbacks.EarlyStopping(patience=4, verbose=1),
            ],
        )

        # 追加历史记录
        losses, val_losses, accuracies, val_accuracies = append_history(
            losses, val_losses, accuracies, val_accuracies, history
        )

        # 从这个训练循环中加载最佳模型
        model = keras.models.load_model("AL_Model.keras")

    # 绘制整体历史记录并评估最终模型
    plot_history(losses, val_losses, accuracies, val_accuracies)
    print("-" * 100)
    print(
        "测试集评估: ",
        model.evaluate(test_dataset, verbose=0, return_dict=True),
    )
    print("-" * 100)

    return model


active_learning_model = train_active_learning_models(
    train_dataset, pool_negatives, pool_positives, val_dataset, test_dataset
)
模型: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ 层 (类型)                        输出形状                  参数 # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ embedding_1 (嵌入层)         │ (, 150, 128)       │       384,000 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ bidirectional_1 (双向层) │ (, 150, 64)        │        41,216 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ global_max_pooling1d_1          │ (, 64)             │             0 │
│ (全局最大池化 1D)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (全连接层)                 │ (, 20)             │         1,300 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_1 (丢弃层)             │ (, 20)             │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_3 (全连接层)                 │ (, 1)              │            21 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 总参数: 426,537 (1.63 MB)
 可训练参数: 426,537 (1.63 MB)
 非可训练参数: 0 (0.00 B)
开始训练,样本数为15000
第 1 种/20 种
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/步 - 二元准确率: 0.5197 - 错误阴性: 1686.7457 - 错误阳性: 1938.3051 - 损失: 0.6918
第 1 轮: val_loss 从 inf 改进到 0.67428,正在将模型保存到 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 8s 89ms/步 - 二元准确率: 0.5202 - 错误阴性: 1716.9833 - 错误阳性: 1961.4667 - 损失: 0.6917 - val_binary_accuracy: 0.6464 - val_false_negatives_1: 279.0000 - val_false_positives_1: 1489.0000 - val_loss: 0.6743
第 2 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.6505 - false_negatives_1: 1216.0170 - false_positives_1: 1434.2373 - loss: 0.6561
第 2 轮: 验证损失从 0.67428 改进到 0.59133,保存模型至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.6507 - false_negatives_1: 1234.9833 - false_positives_1: 1455.7667 - loss: 0.6558 - val_binary_accuracy: 0.7032 - val_false_negatives_1: 235.0000 - val_false_positives_1: 1249.0000 - val_loss: 0.5913
第 3 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.7103 - false_negatives_1: 939.5255 - false_positives_1: 1235.8983 - loss: 0.5829
第 3 轮: 验证损失从 0.59133 改进到 0.51602,保存模型至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.7106 - false_negatives_1: 953.0500 - false_positives_1: 1255.3167 - loss: 0.5827 - val_binary_accuracy: 0.7686 - val_false_negatives_1: 812.0000 - val_false_positives_1: 345.0000 - val_loss: 0.5160
第 4 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.7545 - false_negatives_1: 787.4237 - false_positives_1: 1070.0339 - loss: 0.5214
第 4 轮: 验证损失从 0.51602 改进到 0.43948,保存模型至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.7547 - false_negatives_1: 799.2667 - false_positives_1: 1085.8833 - loss: 0.5212 - val_binary_accuracy: 0.8028 - val_false_negatives_1: 342.0000 - val_false_positives_1: 644.0000 - val_loss: 0.4395
第 5 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.7919 - false_negatives_1: 676.7458 - false_positives_1: 907.4915 - loss: 0.4657
第 5 轮: 验证损失从 0.43948 改进到 0.41679,保存模型至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.7920 - false_negatives_1: 687.3834 - false_positives_1: 921.1667 - loss: 0.4655 - val_binary_accuracy: 0.8158 - val_false_negatives_1: 598.0000 - val_false_positives_1: 323.0000 - val_loss: 0.4168
第 6 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.7994 - false_negatives_1: 661.3560 - false_positives_1: 828.0847 - loss: 0.4498
第 6 轮: 验证损失从 0.41679 改进到 0.39680,保存模型至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.7997 - false_negatives_1: 671.3666 - false_positives_1: 840.2500 - loss: 0.4495 - val_binary_accuracy: 0.8260 - val_false_negatives_1: 382.0000 - val_false_positives_1: 488.0000 - val_loss: 0.3968
第 7 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8311 - false_negatives_1: 589.1187 - false_positives_1: 707.0170 - loss: 0.4017
第 7 轮: 验证损失未改进,维持在 0.39680
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8312 - false_negatives_1: 598.3500 - false_positives_1: 717.8167 - loss: 0.4016 - val_binary_accuracy: 0.7706 - val_false_negatives_1: 1004.0000 - val_false_positives_1: 143.0000 - val_loss: 0.4884
第 8 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8365 - false_negatives_1: 566.7288 - false_positives_1: 649.9322 - loss: 0.3896
第 8 轮: 验证损失未改进,维持在 0.39680
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8366 - false_negatives_1: 575.2833 - false_positives_1: 660.2167 - loss: 0.3895 - val_binary_accuracy: 0.8216 - val_false_negatives_1: 623.0000 - val_false_positives_1: 269.0000 - val_loss: 0.4043
第 9 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8531 - false_negatives_1: 519.0170 - false_positives_1: 591.6440 - loss: 0.3631
第 9 轮: 验证损失从 0.39680 改进到 0.37727,保存模型至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8531 - false_negatives_1: 527.2667 - false_positives_1: 601.2500 - loss: 0.3631 - val_binary_accuracy: 0.8348 - val_false_negatives_1: 296.0000 - val_false_positives_1: 530.0000 - val_loss: 0.3773
第 10 轮/20
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8686 - false_negatives_1: 475.7966 - false_positives_1: 569.0508 - loss: 0.3387
第10轮: val_loss 从 0.37727 改进为 0.37354,模型保存至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8685 - false_negatives_1: 483.5000 - false_positives_1: 577.9667 - loss: 0.3387 - val_binary_accuracy: 0.8400 - val_false_negatives_1: 327.0000 - val_false_positives_1: 473.0000 - val_loss: 0.3735
第11/20轮
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8716 - false_negatives_1: 452.1356 - false_positives_1: 522.1187 - loss: 0.3303
第11轮: val_loss 从 0.37354 改进为 0.37074,模型保存至 AL_Model.keras
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8716 - false_negatives_1: 459.3833 - false_positives_1: 530.6667 - loss: 0.3303 - val_binary_accuracy: 0.8390 - val_false_negatives_1: 362.0000 - val_false_positives_1: 443.0000 - val_loss: 0.3707
第12/20轮
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8833 - false_negatives_1: 433.0678 - false_positives_1: 481.1864 - loss: 0.3065
第12轮: val_loss 未从 0.37074 改进
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8833 - false_negatives_1: 439.8333 - false_positives_1: 488.9667 - loss: 0.3066 - val_binary_accuracy: 0.8236 - val_false_negatives_1: 208.0000 - val_false_positives_1: 674.0000 - val_loss: 0.4046
第13/20轮
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8876 - false_negatives_1: 384.8305 - false_positives_1: 476.5254 - loss: 0.2978
第13轮: val_loss 未从 0.37074 改进
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 82ms/step - binary_accuracy: 0.8876 - false_negatives_1: 391.2667 - false_positives_1: 484.2500 - loss: 0.2978 - val_binary_accuracy: 0.8380 - val_false_negatives_1: 364.0000 - val_false_positives_1: 446.0000 - val_loss: 0.3783
第14/20轮
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8976 - false_negatives_1: 378.0169 - false_positives_1: 433.9831 - loss: 0.2754
第14轮: val_loss 未从 0.37074 改进
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.8975 - false_negatives_1: 384.2333 - false_positives_1: 441.3833 - loss: 0.2757 - val_binary_accuracy: 0.8310 - val_false_negatives_1: 525.0000 - val_false_positives_1: 320.0000 - val_loss: 0.3957
第15/20轮
59/59 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.9013 - false_negatives_1: 354.9322 - false_positives_1: 403.1695 - loss: 0.2709
第15轮: val_loss 未从 0.37074 改进
59/59 ━━━━━━━━━━━━━━━━━━━━ 5s 83ms/step - binary_accuracy: 0.9013 - false_negatives_1: 360.4000 - false_positives_1: 409.5833 - loss: 0.2709 - val_binary_accuracy: 0.8298 - val_false_negatives_1: 302.0000 - val_false_positives_1: 549.0000 - val_loss: 0.4015
第15轮: 提前停止
20/20 ━━━━━━━━━━━━━━━━━━━━ 1s 39ms/step
----------------------------------------------------------------------------------------------------
错误分类为零的数量: 290.0,错误分类为一的数量: 538.0
正样本的样本比例: 0.6497584541062802,负样本的样本比例:0.3502415458937198
开始训练,样本数量为 19999
----------------------------------------------------------------------------------------------------
第1/20轮
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8735 - false_negatives_2: 547.2436 - false_positives_2: 650.2436 - loss: 0.3527
第1轮: val_loss 未从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 9s 84ms/step - binary_accuracy: 0.8738 - false_negatives_2: 559.2125 - false_positives_2: 665.3375 - loss: 0.3518 - val_binary_accuracy: 0.7932 - val_false_negatives_2: 119.0000 - val_false_positives_2: 915.0000 - val_loss: 0.4949
第2/20轮
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8961 - false_negatives_2: 470.2436 - false_positives_2: 576.1539 - loss: 0.2824
第2轮: val_loss 未从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 6s 80ms/step - binary_accuracy: 0.8962 - false_negatives_2: 481.4125 - false_positives_2: 589.6750 - loss: 0.2823 - val_binary_accuracy: 0.8014 - val_false_negatives_2: 809.0000 - val_false_positives_2: 184.0000 - val_loss: 0.4580
第 3 轮/20
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.9059 - false_negatives_2: 442.2051 - false_positives_2: 500.5385 - loss: 0.2628
第 3 轮: val_loss 没有从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 6s 80ms/step - binary_accuracy: 0.9059 - false_negatives_2: 452.6750 - false_positives_2: 513.5250 - loss: 0.2629 - val_binary_accuracy: 0.8294 - val_false_negatives_2: 302.0000 - val_false_positives_2: 551.0000 - val_loss: 0.3868
第 4 轮/20
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.9188 - false_negatives_2: 394.5513 - false_positives_2: 462.4359 - loss: 0.2391
第 4 轮: val_loss 没有从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 6s 80ms/step - binary_accuracy: 0.9187 - false_negatives_2: 405.0625 - false_positives_2: 474.1250 - loss: 0.2393 - val_binary_accuracy: 0.8268 - val_false_negatives_2: 225.0000 - val_false_positives_2: 641.0000 - val_loss: 0.4197
第 5 轮/20
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.9255 - false_negatives_2: 349.8718 - false_positives_2: 413.0898 - loss: 0.2270
第 5 轮: val_loss 没有从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 6s 79ms/step - binary_accuracy: 0.9254 - false_negatives_2: 358.6500 - false_positives_2: 423.5625 - loss: 0.2270 - val_binary_accuracy: 0.8228 - val_false_negatives_2: 611.0000 - val_false_positives_2: 275.0000 - val_loss: 0.4233
第 6 轮/20
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step - binary_accuracy: 0.9265 - false_negatives_2: 349.8590 - false_positives_2: 389.9359 - loss: 0.2147
第 6 轮: val_loss 没有从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 6s 80ms/step - binary_accuracy: 0.9265 - false_negatives_2: 358.8375 - false_positives_2: 399.9875 - loss: 0.2148 - val_binary_accuracy: 0.8272 - val_false_negatives_2: 581.0000 - val_false_positives_2: 283.0000 - val_loss: 0.4415
第 7 轮/20
78/79 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.9409 - false_negatives_2: 286.7820 - false_positives_2: 322.7949 - loss: 0.1877
第 7 轮: val_loss 没有从 0.37074 改进
79/79 ━━━━━━━━━━━━━━━━━━━━ 6s 79ms/step - binary_accuracy: 0.9408 - false_negatives_2: 294.4375 - false_positives_2: 331.4000 - loss: 0.1880 - val_binary_accuracy: 0.8266 - val_false_negatives_2: 528.0000 - val_false_positives_2: 339.0000 - val_loss: 0.4419
第 7 轮: 提前停止
20/20 ━━━━━━━━━━━━━━━━━━━━ 1s 39ms/step
----------------------------------------------------------------------------------------------------
错误分类的零数量: 376.0, 错误分类的一数量: 442.0
正样本的样本比例: 0.5403422982885085, 负样本的样本比例: 0.45965770171149145
开始使用 24998 个样本进行训练
----------------------------------------------------------------------------------------------------
第 1 轮/20
98/98 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step - binary_accuracy: 0.8509 - false_negatives_3: 809.9184 - false_positives_3: 1018.9286 - loss: 0.3732
第 1 轮: val_loss 从 0.37074 改进到 0.36196,正在保存模型到 AL_Model.keras
98/98 ━━━━━━━━━━━━━━━━━━━━ 11s 83ms/step - binary_accuracy: 0.8509 - false_negatives_3: 817.5757 - false_positives_3: 1028.7980 - loss: 0.3731 - val_binary_accuracy: 0.8424 - val_false_negatives_3: 368.0000 - val_false_positives_3: 420.0000 - val_loss: 0.3620
第 2 轮/20
98/98 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8744 - false_negatives_3: 734.7449 - false_positives_3: 884.7755 - loss: 0.3185
第 2 轮: val_loss 没有从 0.36196 改进
98/98 ━━━━━━━━━━━━━━━━━━━━ 8s 79ms/step - binary_accuracy: 0.8744 - false_negatives_3: 741.9697 - false_positives_3: 893.7172 - loss: 0.3186 - val_binary_accuracy: 0.8316 - val_false_negatives_3: 202.0000 - val_false_positives_3: 640.0000 - val_loss: 0.3792
第 3 轮/20
98/98 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8830 - false_negatives_3: 684.1326 - false_positives_3: 807.8878 - loss: 0.3090
第 3 轮: val_loss 没有从 0.36196 改进
98/98 ━━━━━━━━━━━━━━━━━━━━ 8s 79ms/step - binary_accuracy: 0.8830 - false_negatives_3: 691.0707 - false_positives_3: 816.2222 - loss: 0.3090 - val_binary_accuracy: 0.8118 - val_false_negatives_3: 738.0000 - val_false_positives_3: 203.0000 - val_loss: 0.4112
第 4 轮/20
98/98 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8892 - false_negatives_3: 651.9898 - false_positives_3: 776.4388 - loss: 0.2928
第 4 轮: val_loss 未能改善,仍为 0.36196
98/98 ━━━━━━━━━━━━━━━━━━━━ 8s 79ms/step - binary_accuracy: 0.8892 - false_negatives_3: 658.4041 - false_positives_3: 784.3839 - loss: 0.2928 - val_binary_accuracy: 0.8344 - val_false_negatives_3: 557.0000 - val_false_positives_3: 271.0000 - val_loss: 0.3734
第 5 轮/20
98/98 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step - binary_accuracy: 0.8975 - false_negatives_3: 612.0714 - false_positives_3: 688.9184 - loss: 0.2806
第 5 轮: val_loss 未能改善,仍为 0.36196
98/98 ━━━━━━━━━━━━━━━━━━━━ 8s 79ms/step - binary_accuracy: 0.8974 - false_negatives_3: 618.4343 - false_positives_3: 696.1313 - loss: 0.2807 - val_binary_accuracy: 0.8456 - val_false_negatives_3: 446.0000 - val_false_positives_3: 326.0000 - val_loss: 0.3658
第 5 轮: 提前停止
20/20 ━━━━━━━━━━━━━━━━━━━━ 1s 40ms/step
----------------------------------------------------------------------------------------------------
错误分类的零的数量: 407.0,错误分类的一的数量: 410.0
正样本比例: 0.5018359853121175,负样本比例:0.4981640146878825
开始训练,共 29997 个样本
----------------------------------------------------------------------------------------------------
第 1 轮/20
117/118 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step - binary_accuracy: 0.8621 - false_negatives_4: 916.2393 - false_positives_4: 1130.9744 - loss: 0.3527
第 1 轮: val_loss 未能改善,仍为 0.36196
118/118 ━━━━━━━━━━━━━━━━━━━━ 13s 85ms/step - binary_accuracy: 0.8621 - false_negatives_4: 931.0924 - false_positives_4: 1149.7479 - loss: 0.3525 - val_binary_accuracy: 0.8266 - val_false_negatives_4: 627.0000 - val_false_positives_4: 240.0000 - val_loss: 0.3802
第 2 轮/20
117/118 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step - binary_accuracy: 0.8761 - false_negatives_4: 876.4872 - false_positives_4: 1005.5726 - loss: 0.3195
第 2 轮: val_loss 从 0.36196 改善到 0.35707,已保存模型到 AL_Model.keras
118/118 ━━━━━━━━━━━━━━━━━━━━ 10s 82ms/step - binary_accuracy: 0.8760 - false_negatives_4: 891.0504 - false_positives_4: 1022.9412 - loss: 0.3196 - val_binary_accuracy: 0.8404 - val_false_negatives_4: 479.0000 - val_false_positives_4: 319.0000 - val_loss: 0.3571
第 3 轮/20
117/118 ━━━━━━━━━━━━━━━━━━━━ 0s 74ms/step - binary_accuracy: 0.8874 - false_negatives_4: 801.1710 - false_positives_4: 941.4786 - loss: 0.2965
第 3 轮: val_loss 未能改善,仍为 0.35707
118/118 ━━━━━━━━━━━━━━━━━━━━ 9s 79ms/step - binary_accuracy: 0.8873 - false_negatives_4: 814.8319 - false_positives_4: 957.8571 - loss: 0.2966 - val_binary_accuracy: 0.8226 - val_false_negatives_4: 677.0000 - val_false_positives_4: 210.0000 - val_loss: 0.3948
第 4 轮/20
117/118 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step - binary_accuracy: 0.8977 - false_negatives_4: 740.5385 - false_positives_4: 837.1710 - loss: 0.2768
第 4 轮: val_loss 未能改善,仍为 0.35707
118/118 ━━━━━━━━━━━━━━━━━━━━ 10s 81ms/step - binary_accuracy: 0.8976 - false_negatives_4: 753.5378 - false_positives_4: 852.2437 - loss: 0.2770 - val_binary_accuracy: 0.8406 - val_false_negatives_4: 530.0000 - val_false_positives_4: 267.0000 - val_loss: 0.3630
第 5 轮/20
117/118 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step - binary_accuracy: 0.9020 - false_negatives_4: 722.5214 - false_positives_4: 808.2308 - loss: 0.2674
第 5 轮: val_loss 未能改善,仍为 0.35707
118/118 ━━━━━━━━━━━━━━━━━━━━ 10s 82ms/step - binary_accuracy: 0.9019 - false_negatives_4: 734.8655 - false_positives_4: 822.4117 - loss: 0.2676 - val_binary_accuracy: 0.8330 - val_false_negatives_4: 592.0000 - val_false_positives_4: 243.0000 - val_loss: 0.3805
第 6 轮/20
117/118 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step - binary_accuracy: 0.9059 - false_negatives_4: 682.1453 - false_positives_4: 737.0513 - loss: 0.2525
第6轮: val_loss 没有改善,仍为 0.35707
118/118 ━━━━━━━━━━━━━━━━━━━━ 10s 82ms/step - binary_accuracy: 0.9059 - false_negatives_4: 693.6387 - false_positives_4: 749.9412 - loss: 0.2526 - val_binary_accuracy: 0.8454 - val_false_negatives_4: 391.0000 - val_false_positives_4: 382.0000 - val_loss: 0.3620
第6轮: 提前停止
![png](/img/examples/nlp/active_learning_review_classification/active_learning_review_classification_17_2767.png) ![png](/img/examples/nlp/active_learning_review_classification/active_learning_review_classification_17_2768.png)
----------------------------------------------------------------------------------------------------

测试集评估:  {'binary_accuracy': 0.8424000144004822, 'false_negatives_4': 491.0, 'false_positives_4': 297.0, 'loss': 0.3661557137966156}
----------------------------------------------------------------------------------------------------
--- ## 结论 主动学习是一个不断发展的研究领域。这个例子展示了使用主动学习的成本效益好处,因为它消除了注释大量数据的需求,节省了资源。 以下是这个例子的一些值得注意的观察: 1. 我们只需要 30,000 个样本就能达到与在完整数据集上训练的模型相同(如果不是更好)的分数。这意味着在现实生活中,我们节省了注释 10,000 张图像所需的努力! 2. 与完整训练获得的偏差比例相比,训练结束时假阴性和假阳性的数量非常平衡。这使得模型在现实生活场景中稍微更有用,因为两个标签的重要性是相等的。 有关采样比例、训练技术或可用开源库/实现的进一步阅读,可以参考以下资源: 1. [主动学习文献综述](http://burrsettles.com/pub/settles.activelearning.pdf) (Burr Settles, 2010)。 2. [modAL](https://github.com/modAL-python/modAL): 一个模块化的主动学习框架。 3. 谷歌的非官方 [主动学习游乐场](https://github.com/google/active-learning)。