[英]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.