簡體   English   中英

貝葉斯網絡的分類問題(TensorFlow Probability)

[英]Classification problem with bayesian networks (TensorFlow Probability)

在過去的幾天里,我在使用 tensorflow 概率時遇到了一些麻煩。

我已經訓練了這個網絡的常客版本,並達到了 0.99 以上的個人准確率。 雖然,在嘗試貝葉斯版本時,精度相當於一個虛擬模型。 這很奇怪,因為我懷疑結果可能差別不大。

由於我是貝葉斯方法的新手,我想知道我是否在這里遺漏了一些東西……我沒有找到太多適合我的信息和示例。

在這個模型中,我圍繞 3 個屬性 (Y) 的存在 (1) 或不存在 (0) 進行預測,這可能同時發生或不同時發生。

我真的很感激一些見解。

謝謝大家。

import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
from main import get_data

#%% Configuration
config = {"ID_prefix" : "Bayesian_CNN_Flipout",
          "mode" : "classification",
          "optimizer" : "Adam",
          "loss" : "binary_crossentropy",
          "monitor" : "val_loss",
          "patience" : 10,
          "lr" : 0.001,
          "repetitions" : 3,
          "X_reshape" : True}

#%% Get data
data = get_data("dataset.csv", config)

我的數據具有以下維度:

data["X_train"].shape
Out[8]: (39375, 1024, 1)

data["Y_train"].shape
Out[9]: (39375, 3)

data["X_val"].shape
Out[10]: (13125, 1024, 1)

data["Y_val"].shape
Out[11]: (13125, 3)

data["X_test"].shape
Out[13]: (17500, 1024, 1)

data["Y_test"].shape
Out[14]: (17500, 3)

網絡結構如下:

#%% Model structure
config["inputs"] = tf.keras.Input(shape=(data["X_train"].shape[1], data["X_train"].shape[2]))

layer = config["inputs"]
layer = tfp.layers.Convolution1DFlipout(filters=10, kernel_size=5, strides=1, activation="relu")(layer)
layer = tf.keras.layers.MaxPooling1D(pool_size=2)(layer)
layer = tfp.layers.Convolution1DFlipout(filters=10, kernel_size=5, strides=1, activation="relu")(layer)
layer = tf.keras.layers.MaxPooling1D(pool_size=2)(layer)
layer = tf.keras.layers.Flatten()(layer)

config["outputs"] = tfp.layers.DenseFlipout(units=3, activation="sigmoid")(layer)

model = tf.keras.Model(inputs=config["inputs"], outputs=config["outputs"])

model.compile(optimizer=config["optimizer"], loss=config["loss"])

tf.keras.backend.set_value(model.optimizer.learning_rate, config["lr"])

earlystopping = tf.keras.callbacks.EarlyStopping(monitor=config["monitor"],
                                                 patience=config["patience"],
                                                 restore_best_weights=True)

#%% Fit model
history = model.fit(data["X_train"], data["Y_train"],
                    validation_data=[data["X_val"], data["Y_val"]],
                    epochs=999999,
                    callbacks=[earlystopping])

#%% Classification metrics
pred_train = np.zeros([config["repetitions"], data["Y_train"].shape[0], data["Y_train"].shape[1]])
pred_val = np.zeros([config["repetitions"], data["Y_val"].shape[0], data["Y_val"].shape[1]])
pred_test = np.zeros([config["repetitions"], data["Y_test"].shape[0], data["Y_test"].shape[1]])
accuracy_train = np.zeros([config["repetitions"], 1, data["Y_train"].shape[1]])
accuracy_val = np.zeros([config["repetitions"], 1, data["Y_val"].shape[1]])
accuracy_test = np.zeros([config["repetitions"], 1, data["Y_test"].shape[1]])
for i in range(config["repetitions"]):
    pred_train[i] = model.predict(data["X_train"]).round()
    pred_val[i] = model.predict(data["X_val"]).round()
    pred_test[i] = model.predict(data["X_test"]).round()
    accuracy_train[i] = (data["Y_train"]==pred_train[i]).mean(0)
    accuracy_val[i] = (data["Y_val"]==pred_val[i]).mean(0)
    accuracy_test[i] = (data["Y_test"]==pred_test[i]).mean(0)

問題已得到解答,以下代碼正常工作:

#%% Initial Imports
import shutil
import tensorflow as tf
import tensorflow_probability as tfp
from main import get_data, update_results, main

#%% Configuration
config = {"Folder_ID" : "Bayesian_CNN_Flipout",
          "mode" : "classification",
          "optimizer" : "Adam",
          "loss" : "binary_crossentropy",
          "metrics" : "binary_accuracy",
          "monitor" : "val_binary_accuracy",
          "patience" : 10,
          "repetitions" : 5,
          "X_reshape" : True}

#%% Get data
data = get_data("dataset.csv", config)

我的數據具有以下維度:

data["X_train"].shape
Out[8]: (39375, 1024, 1)

data["Y_train"].shape
Out[9]: (39375, 3)

data["X_val"].shape
Out[10]: (13125, 1024, 1)

data["Y_val"].shape
Out[11]: (13125, 3)

data["X_test"].shape
Out[13]: (17500, 1024, 1)

data["Y_test"].shape
Out[14]: (17500, 3)

網絡結構如下:

#%% Model structure
divergence_fn = lambda q, p, ignore: tfp.distributions.kl_divergence(q, p)/data['X_train'].shape[0]

config["inputs"] = tf.keras.Input(shape=(data["X_train"].shape[1], data["X_train"].shape[2]))

layer  = config["inputs"]

layer = tfp.layers.Convolution1DFlipout(filters=2, kernel_size=5, strides=1, activation="relu", kernel_divergence_fn=divergence_fn, bias_divergence_fn=divergence_fn)(layer)
layer = tf.keras.layers.MaxPooling1D(pool_size=2)(layer)
layer = tfp.layers.Convolution1DFlipout(filters=2, kernel_size=5, strides=1, activation="relu", kernel_divergence_fn=divergence_fn, bias_divergence_fn=divergence_fn)(layer)
layer = tf.keras.layers.MaxPooling1D(pool_size=2)(layer)

layer = tf.keras.layers.Flatten()(layer)
config["outputs"] = tfp.layers.DenseFlipout(3, activation='sigmoid', kernel_divergence_fn=divergence_fn, bias_divergence_fn=divergence_fn)(layer)

model = tf.keras.Model(inputs=config["inputs"], outputs=config["outputs"])

model.compile(optimizer=config["optimizer"], loss=config["loss"])

earlystopping = tf.keras.callbacks.EarlyStopping(monitor=config["monitor"],
                                                 patience=config["patience"],
                                                 restore_best_weights=True)

#%% Fit model
history = model.fit(data["X_train"], data["Y_train"],
                    validation_data=[data["X_val"], data["Y_val"]],
                    epochs=999999,
                    callbacks=[earlystopping])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM