SilyaSophie 2024-11-18 23:01 采纳率: 36.8%
浏览 23
已结题

VAE模型如何输出结果

VAE代码,模型跑通了,用evaluate函数输出了loss就可以了,但不知道如何根据loss和原始数据计算TP、FP、TN、FN这四个指标,再通过这4个指标来计算准确率、F-score这些数值,以及画出ROC曲线、计算AUC面积。使用的数据集为CICIoT2023,X_train为训练集,Y_test为测试集,Y_test_normal和Y_test_abnormal为测试集正常和异常部分。

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Lambda, Conv1D, Flatten, SpatialDropout1D, Reshape
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras import backend as K
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
import time
# 读取数据
csv_path_train = 'CICIoT2023/CICIoT2023/benign.csv'
X_train = pd.read_csv(csv_path_train).values
X_train = np.nan_to_num(MinMaxScaler().fit_transform(StandardScaler().fit_transform(X_train)))
X_train = np.reshape(X_train, (-1, 100, 46))

csv_path_test = 'CICIoT2023/CICIoT2023/ceshi.csv'
Y_test = pd.read_csv(csv_path_test)
Y_test_normal = Y_test[Y_test.label == 'BenignTraffic'].drop(labels='label', axis=1).values
Y_test_normal = np.nan_to_num(MinMaxScaler().fit_transform(StandardScaler().fit_transform(Y_test_normal)))
Y_test_normal = np.reshape(Y_test_normal, (-1, 100, 46))
Y_test_abnormal = Y_test[Y_test.label != 'BenignTraffic'].drop(labels='label', axis=1).values
Y_test_abnormal = np.nan_to_num(MinMaxScaler().fit_transform(StandardScaler().fit_transform(Y_test_abnormal)))
Y_test_abnormal = np.reshape(Y_test_abnormal, (-1, 100, 46))

original_dim = 46  # 特征维度
latent_dim = 2  # 潜在空间维度
intermediate_dim = 256
batch_size = 100


# 采样函数
def sampling(args):
    z_mean, z_log_var = args
    batch = K.shape(z_mean)[0]
    dim = K.int_shape(z_mean)[1]
    epsilon = K.random_normal(shape=(batch, dim))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon


# 编码器
inputs = Input(shape=(100, original_dim))
x = Conv1D(64, kernel_size=3, activation='relu', padding='same')(inputs)
x = Flatten()(x)
z_mean = Dense(latent_dim)(x)
z_log_var = Dense(latent_dim)(x)
z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var])
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')

# 解码器
latent_inputs = Input(shape=(latent_dim,))
x = Dense(100 * 64, activation='relu')(latent_inputs)
x = Reshape((100, 64))(x)  # 将展平的层重新调整为三维
x = Conv1D(64, kernel_size=3, activation='relu', padding='same')(x)
outputs = Conv1D(original_dim, kernel_size=3, activation='sigmoid', padding='same')(x)
decoder = Model(latent_inputs, outputs, name='decoder')

# VAE模型
outputs = decoder(encoder(inputs)[2])  # 连接编码器和解码器
vae = Model(inputs, outputs, name='vae')

# 定义损失函数
reconstruction_loss = tf.keras.losses.binary_crossentropy(K.flatten(inputs), K.flatten(outputs))
reconstruction_loss *= 100  # 对应维度
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.sum(kl_loss, axis=-1) * -0.5
vae_loss = K.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer='adam')

test_first_d = Y_test_abnormal.shape[0]

print(f"test_normal:{Y_test_normal.shape[0]}")
print(f"test_abnormal:{Y_test_abnormal.shape[0]}")

# 训练VAE
startTime = time.time()  # 开始时间
vae.fit(X_train, epochs=100, batch_size=batch_size, validation_data=(Y_test_normal, None))
losssum1=0
losssum2=0
for i in range(1,batch_size):
    loss11=vae.evaluate(Y_test_normal)
    losssum1=+loss11
    loss22 = vae.evaluate(Y_test_abnormal)
    losssum2=+loss22
    print(f"loss1:{loss11}")
    print(f"loss2:{loss22}")

endTime = time.time()        #结束时间

print(f"Took {round((endTime - startTime), 5)} seconds to calculate.")
vae.summary()

print("Testing data shape:", Y_test_normal.shape)
result = vae.evaluate(Y_test_normal)
print("Evaluate result:", result)

loss1 = vae.evaluate(Y_test_normal)
loss2 = vae.evaluate(Y_test_abnormal)
print(f"loss1:{loss1}")
print(f"loss2:{loss2}")


# 假设 time_steps 应该等于 test_first_d
#input_data1 = np.expand_dims(np.ones((test_first_d, 1)), axis=2)  # 在最后一个轴上增加一个维度
# 或者使用 reshape 方法
input_data1 = np.ones((test_first_d, 1, 1)).reshape((test_first_d, 1, 1))
acc_normal = vae.evaluate(input_data1)

#input_data2 = np.expand_dims(np.zeros((test_first_d, 1)), axis=2)  # 在最后一个轴上增加一个维度
input_data2 = np.zeros((test_first_d, 1, 1)).reshape((test_first_d, 1, 1))
acc_abnormal = vae.evaluate(input_data2)
#_, acc_normal = vae.evaluate(Y_test_normal, np.ones((test_first_d, 1)))
#_, acc_abnormal = vae.evaluate(Y_test_abnormal, np.zeros((test_first_d, 1)))
#acc_normal = vae.evaluate(np.ones((test_first_d, 1)))
#acc_abnormal = vae.evaluate(np.zeros((test_first_d, 1)))
print(f"acc_normal:{acc_normal}")
print(f"acc_abnormal:{acc_abnormal}")
TP = acc_normal
TN = 1 - TP
FN = acc_abnormal
FP = 1 - FN
precision = TP / (TP + FP)
recall = TP / (TP + FN)
f1 = 2 * (precision * recall) / (precision + recall)
endTime = time.time()  # 结束时间

print(f"acc:{(acc_normal + acc_abnormal) * 50}%")
print(f"precision:{precision}")
print(f"recall:{recall}")
print(f"F1-score:{f1}")

打印结果和报错截图:


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/5ef574ab9bb44744be722a6532742be3.png "#left")

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/1ac9a49395ad4b6483d77f1b31e9033e.png "#left")

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/26af5bdf431f4c3aac50297d578d953c.png "#left")

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/8f658900cfee42af86d39075c53c06db.png "#left")



  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-11-18 23:22
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在使用VAE(VARIATIONAL AUTOENCODER)进行生成对抗网络训练时,通常会通过评估生成图像的损失来衡量模型的表现。然而,在实际操作中,为了获得更精确的结果,需要对生成图像的损失进行进一步分析,并根据损失值计算出相应的指标,例如TP、FP、TN、FN等。

    1. TP:这是一个混淆矩阵中的一个术语,表示混淆矩阵中每个类别出现的样本数量。这个指标可以帮助我们了解哪些类别的样本被误分类,这对于提高模型的鲁棒性和泛化能力至关重要。

    2. FP:同样是一个混淆矩阵中的术语,它表示混淆矩阵中某个类别出现的数量减去预测该类别正确的数量。这个指标可以用来检查模型对于假阳性错误的处理是否足够。

    3. TN:与TP相反,它是混淆矩阵中某类别的正确样本数量减去误分类的样本数量。这个指标可以帮助我们理解模型对真实负样例的识别情况。

    4. FN:这个指标是混淆矩阵中某个类别的所有样本数量减去预测该类别的错误样本数量。这个指标用于检测模型在未发生错误的情况下如何区分正负样本。

    5. F-SCORE:这是一种统计学方法,主要用于比较两个或多个分类器的性能。F-SCORE的公式为:

      F-SCORE = 2 * (TP + TN) / (TP + FP + FN)

    6. 计算准确性、F-SCORE等指标的方法如下:

      • 正确性:首先确保你的混淆矩阵是正确的,然后计算TP、FP、TN、FN。
      • 准确性:计算TP、FP、TN、FN后,将它们相加得到总准确度。如果这个数字接近1,则意味着模型的准确性较高。
    7. 最终的准确率可以通过以下公式计算:

      准确率 = TP / (TP + FP) 或者 准确率 = TN / (TN + FN)

    8. 可以通过计算F-SCORE来量化模型的性能,公式如下:

      F-SCORE = 2 * (TP + TN) / (TP + FP + FN)

    9. 由于F-SCORE通常大于1,这意味着模型的性能比预期更高,反之亦然。

    请注意,这些指标可能因具体任务的不同而有所不同。在实际应用中,你可能还需要考虑其他因素,比如优化器的选择、学习率的调整等,以达到最佳效果。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月20日
  • 创建了问题 11月18日