Пример #1
0
def test_train(tmp_path):
    """Tests imbDRL.agents.ddqn.TrainDDQN.train."""
    tmp_models = str(
        tmp_path / "test_model"
    )  # No support for pathLib https://github.com/tensorflow/tensorflow/issues/37357
    tmp_logs = str(tmp_path / "test_log")

    model = TrainDDQN(10,
                      10,
                      0.001,
                      0.0,
                      0.1,
                      5,
                      model_path=tmp_models,
                      log_dir=tmp_logs,
                      val_every=2,
                      memory_length=30)

    with pytest.raises(Exception) as exc:
        model.train()
    assert "must be compiled" in str(exc.value)

    model.compile_model(
        np.random.rand(4, 10).astype(np.float32),
        np.random.choice(2, size=4).astype(np.int32),
        [Dense(4), Dense(2)])
    model.train(
        np.random.rand(4, 10).astype(np.float32),
        np.random.choice(2, size=4).astype(np.int32))
    assert model.replay_buffer.num_frames().numpy(
    ) >= 10 + 10  # 10 for warmup + 1 for each episode
    assert model.global_episode == 10

    model = TrainDDQN(10,
                      10,
                      0.001,
                      0.0,
                      0.1,
                      5,
                      model_path=tmp_models,
                      log_dir=tmp_logs,
                      val_every=2)

    with pytest.raises(Exception) as exc:
        model.train()
    assert "must be compiled" in str(exc.value)

    model.compile_model(
        np.random.rand(4, 10).astype(np.float32),
        np.random.choice(2, size=4).astype(np.int32),
        [Dense(4), Dense(2)])
    model.train(
        np.random.rand(4, 10).astype(np.float32),
        np.random.choice(2, size=4).astype(np.int32))
    assert model.replay_buffer.num_frames(
    ) >= 10  # 10 in total since no memory length is defined
    assert model.global_episode == 10
Пример #2
0
)  # Normalization should happen after splitting train and test sets

X_train, X_test, y_train, y_test = train_test_split(df.to_numpy(),
                                                    y,
                                                    stratify=y,
                                                    test_size=0.2)
X_train, y_train, X_test, y_test, X_val, y_val = get_train_test_val(
    X_train, y_train, X_test, y_test, min_class, maj_class, val_frac=0.2)

model = TrainDDQN(episodes,
                  warmup_steps,
                  learning_rate,
                  gamma,
                  min_epsilon,
                  decay_episodes,
                  target_update_period=target_update_period,
                  target_update_tau=target_update_tau,
                  batch_size=batch_size,
                  collect_steps_per_episode=collect_steps_per_episode,
                  memory_length=memory_length,
                  collect_every=collect_every,
                  n_step_update=n_step_update)

model.compile_model(X_train, y_train, layers)
model.q_net.summary()
model.train(X_val, y_val, "F1")

stats = model.evaluate(X_test, y_test, X_train, y_train)
print(rounded_dict(stats))
# {'Gmean': 0.824172, 'F1': 0.781395, 'Precision': 0.730435, 'Recall': 0.84, 'TP': 84, 'TN': 131, 'FP': 31, 'FN': 16}
Пример #3
0
    X_train,
    y_train,
    X_test,
    y_test,
    min_class,
    maj_class,
    val_frac=0.1,
    imb_ratio=imb_ratio,
    imb_test=False)

model = TrainDDQN(episodes,
                  warmup_steps,
                  learning_rate,
                  gamma,
                  min_epsilon,
                  decay_episodes,
                  target_update_period=target_update_period,
                  target_update_tau=target_update_tau,
                  batch_size=batch_size,
                  collect_steps_per_episode=collect_steps_per_episode,
                  memory_length=memory_length,
                  collect_every=collect_every,
                  n_step_update=n_step_update)

model.compile_model(X_train, y_train, layers, imb_ratio=imb_ratio)
model.train(X_val, y_val, "Gmean")

stats = model.evaluate(X_test, y_test, X_train, y_train)
print(rounded_dict(stats))
# {'Gmean': 0.987032, 'F1': 0.955702, 'Precision': 0.930275, 'Recall': 0.982558, 'TP': 1014, 'TN': 8892, 'FP': 76, 'FN': 18}
Пример #4
0
target_update_period = 10_000
target_update_tau = 1
n_step_update = 4

layers = [Dense(250, activation="relu"),
          Dense(2, activation=None)]

learning_rate = 0.00025  # Learning rate
gamma = 0.1  # Discount factor
min_epsilon = 0.01  # Minimal and final chance of choosing random action
decay_episodes = 100_000  # Number of episodes to decay from 1.0 to `min_epsilon`

imb_ratio = 0.1  # Imbalance rate
min_class = [0]  # Minority classes
maj_class = [1]  # Majority classes
X_train, y_train, X_test, y_test = load_imdb(config=(5_000, 500))
X_train, y_train, X_test, y_test, X_val, y_val = get_train_test_val(X_train, y_train, X_test, y_test,
                                                                    min_class, maj_class, val_frac=0.1, imb_ratio=imb_ratio, imb_test=False)

model = TrainDDQN(episodes, warmup_steps, learning_rate, gamma, min_epsilon, decay_episodes, target_update_period=target_update_period,
                  target_update_tau=target_update_tau, batch_size=batch_size, collect_steps_per_episode=collect_steps_per_episode,
                  memory_length=memory_length, collect_every=collect_every, n_step_update=n_step_update)

model.compile_model(X_train, y_train, layers, imb_ratio=imb_ratio)
model.train(X_test, y_test, "Gmean")

stats = model.evaluate(X_test, y_test, X_train, y_train)
print(rounded_dict(stats))
# {'Gmean': 0.286451, 'F1': 0.152846, 'Precision': 0.4967, 'Recall': 0.09032, 'TP': 1129, 'TN': 11356, 'FP': 1144, 'FN': 11371}