# 变分自编码器.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. # 变分自编码器
  2. from keras.models import Model
  3. from keras.layers import Dense, Input, Lambda
  4. from keras.losses import mse, binary_crossentropy
  5. from keras.utils import plot_model
  6. import keras.backend as K
  7. import pandas as pd
  8. from random import shuffle
  9. from sklearn.preprocessing import StandardScaler
  10. import numpy as np
  11. import tensorflow.keras as keras
  12. import datetime
  13. import matplotlib.pyplot as plt
  14. from keras.layers import Input, Dense, Lambda
  15. from matplotlib.pyplot import MultipleLocator
  16. from keras import losses
  17. data_set=pd.read_feather('data_set_sp.feather')
  18. #打乱并切分训练集测试集
  19. def shuffle_data(dataset_faults):
  20. sn_fau=list(set(dataset_faults['sn']))
  21. shuffle(sn_fau)
  22. newtrain=dataset_faults[dataset_faults['sn'].isin(sn_fau[:int(0.8*len(sn_fau))])]
  23. newtest=dataset_faults[dataset_faults['sn'].isin(sn_fau[int(0.8*len(sn_fau)):])]
  24. newtrain.reset_index(drop=True,inplace=True)
  25. newtest.reset_index(drop=True,inplace=True)
  26. return newtrain,newtest
  27. #训练集数据标准化
  28. def scaler_train(train):
  29. Xtrain=train.drop(['time','sn','split'],axis=1)
  30. Xsc_colnames=list(Xtrain.columns)
  31. scaler=StandardScaler()
  32. scaler.fit(Xtrain) #保存train_sc的均值和标准差
  33. Xsc=scaler.transform(np.array(Xtrain))
  34. Xsc=pd.DataFrame(Xsc)
  35. Xsc.columns=Xsc_colnames
  36. Xsc['split']=train['split'].values
  37. return Xsc,scaler
  38. #测试集数据标准化
  39. def scaler_test_train(test,scaler):
  40. Xtest=test.drop(['time','sn','split'],axis=1)
  41. Xsc_colnames=list(Xtest.columns)
  42. Xtsc=scaler.transform(np.array(Xtest))
  43. Xtsc=pd.DataFrame(Xtsc)
  44. Xtsc.columns=Xsc_colnames
  45. Xtsc['split']=test['split'].values
  46. return Xtsc
  47. train,test=shuffle_data(data_set)
  48. Xsc,scaler = scaler_train(train)
  49. Xtsc = scaler_test_train(test,scaler)
  50. #时间窗口划分
  51. def create_dataset(data_set,time_steps): #X为dataframe,y为serie
  52. a=[]
  53. aa=np.empty(shape=[0,3])
  54. #index=pd.DataFrame()
  55. List_n_split=data_set['split'].drop_duplicates()
  56. for k in List_n_split:
  57. dataset=data_set[data_set['split']==k]
  58. #datatrain=data_train[data_train['split']==k]
  59. if len(dataset)>time_steps:
  60. dataset=dataset.reset_index(drop=True)
  61. dataset=dataset.drop(['split'],axis=1)
  62. dataX= []
  63. #index_step=[]
  64. for i in list(range(0,len(dataset)-60,60))[:-1]:
  65. v1 = dataset.iloc[i:(i+time_steps)].values
  66. dataX.append(v1)
  67. #index_step.append(i)
  68. #dataset3=dataset.iloc[:len(dataset)-time_steps]
  69. #newdatatrain=datatrain[:len(dataset3)]
  70. dataX2=np.array(dataX)
  71. a.append(dataX2)
  72. #index=index.append(newdatatrain)
  73. if len(a)>0:
  74. aa=np.vstack(a)
  75. #index.reset_index(drop=True,inplace=True)
  76. return aa
  77. aa = create_dataset(Xsc,time_steps=120)
  78. bb = create_dataset(Xtsc,time_steps=120)
  79. def sampling(args):
  80. # 再参数化采样
  81. z_mean, z_log_var = args[0],args[1]
  82. batch = K.shape(z_mean)[0]
  83. dim = K.int_shape(z_mean)[1]
  84. #epsilon = K.random_normal(shape=(batch, dim))
  85. epsilon = K.random_normal(shape=(batch, dim,args[2]))
  86. return z_mean + K.exp(0.5 * z_log_var) * epsilon
  87. def get_loss(args):
  88. """
  89. 自定义损失函数
  90. x:原始样本
  91. xr: 重构样本
  92. m: 编码器隐变量z均值
  93. v: 编码器隐变量z方差的对数
  94. """
  95. x, xr, m, v = args
  96. dim = K.int_shape(x)[-1]
  97. print(dim)
  98. re_loss = dim * binary_crossentropy(x, xr) # 重构正确性度量
  99. kl_loss = 1 + v - K.square(m) - K.exp(v) # d维向量,隐变量z维度为d
  100. kl_loss = - 0.5 * K.sum(kl_loss, axis=-1) # kl散度,罚项
  101. print(re_loss)
  102. print(kl_loss)
  103. #vae_loss = K.mean(re_loss + kl_loss)
  104. vae_loss =re_loss + kl_loss
  105. print(vae_loss)
  106. return vae_loss
  107. # def get_loss(x, x_decoded_mean):
  108. # #my tips:logloss
  109. # xent_loss = input_dim * losses.binary_crossentropy(x, x_decoded_mean)
  110. # #my tips:see paper's appendix B
  111. # kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
  112. # return xent_loss + kl_loss
  113. # 模型训练参数
  114. batch_size = 128
  115. epochs = 10
  116. # 模型结构参数
  117. input_dim = aa.shape[2] # 输入图像为28*28
  118. latent_dim = 10 # 潜在因子z的维度
  119. # 构建编码器(推断网络)
  120. #inputs = Input(shape=(input_dim,))
  121. inputs = Input(shape=(aa.shape[1],aa.shape[2]))
  122. encode_h = Dense(20, activation='relu')(inputs)
  123. z_mean = Dense(latent_dim, activation='relu')(encode_h)
  124. z_log_var = Dense(latent_dim, activation='relu')(encode_h) # log(sigma^2)
  125. z_sample = Lambda(sampling, output_shape=([latent_dim]))([z_mean, z_log_var,latent_dim]) # 采样
  126. print(z_sample)
  127. encoder = Model(inputs, [z_mean, z_log_var, z_sample]) # 编码器输出结果为3层
  128. # 构建解码器(生成网络)
  129. inputs_decoder = Input(shape=(aa.shape[1],latent_dim))
  130. print(inputs_decoder)
  131. decode_h = Dense(20, activation='relu')(inputs_decoder)
  132. x_mean_decoded = Dense(input_dim, activation='sigmoid')(decode_h)
  133. decoder = Model(inputs_decoder, x_mean_decoded)
  134. # 构建VAE模型
  135. x_decoded = decoder(encoder(inputs)[2])
  136. print(x_decoded)
  137. outputs = Lambda(get_loss)([inputs, x_decoded, z_mean, z_log_var]) # 模型直接输出损失函数值
  138. #outputs = Lambda(get_loss)(inputs_decoder, x_mean_decoded) # 模型直接输出损失函数值
  139. #decoder.compile(optimizer='rmsprop', loss=get_loss)
  140. vae_model = Model(inputs, outputs)
  141. vae_model.compile(optimizer='adam', loss=lambda y_true, y_pred: y_pred)
  142. vae_model.fit(aa, aa,shuffle=True,epochs=epochs,verbose=2,batch_size=batch_size)
  143. encoded_imgs = encoder.predict(bb)[2]
  144. decoded_imgs = decoder.predict(encoded_imgs)