You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
2 weeks ago
|
# -*- coding: utf-8 -*-
|
||
|
"""
|
||
|
@Time : 2020/5/29 13:52
|
||
|
@Author : 杰森·家乐森
|
||
|
@File : ae_train.py
|
||
|
@Software: PyCharm
|
||
|
"""
|
||
|
|
||
|
import time
|
||
|
import json
|
||
|
import numpy as np
|
||
|
import pandas as pd
|
||
|
import tensorflow as tf
|
||
|
from sklearn.metrics import r2_score
|
||
|
from tensorflow.keras import backend
|
||
|
from tensorflow.keras.models import Model
|
||
|
from sklearn.preprocessing import MinMaxScaler
|
||
|
from tensorflow.keras.layers import Dense, Input
|
||
|
|
||
|
|
||
|
def rmse(y_true, y_pred):
|
||
|
return backend.sqrt(backend.mean(tf.keras.losses.mean_squared_error(y_true, y_pred), axis=-1))
|
||
|
|
||
|
|
||
|
def train(layers, data, test, epoch):
|
||
|
"""
|
||
|
自编码训练函数
|
||
|
:param data: 归一化数据
|
||
|
:param layers: 网络结构,int类型数组
|
||
|
:param epoch: 训练次数
|
||
|
:return:
|
||
|
"""
|
||
|
mms = MinMaxScaler()
|
||
|
data = mms.fit_transform(data)
|
||
|
test = mms.transform(test)
|
||
|
mid = len(layers) // 2 - 1
|
||
|
layer = [Input(shape=(layers[0],))]
|
||
|
for i in range(len(layers) - 1):
|
||
|
if i == mid:
|
||
|
layer.append(Dense(layers[i + 1])(layer[i]))
|
||
|
else:
|
||
|
layer.append(Dense(layers[i + 1], activation="sigmoid")(layer[i]))
|
||
|
autoencoder = Model(layer[0], layer[-1])
|
||
|
autoencoder.compile(optimizer="adam", loss="mse",
|
||
|
metrics=['accuracy'])
|
||
|
autoencoder.fit(data, data, epochs=epoch, batch_size=32, shuffle=True)
|
||
|
test_data = autoencoder.predict(data, batch_size=400)
|
||
|
test_out = autoencoder.predict(test, batch_size=400)
|
||
|
with tf.Session():
|
||
|
spe = rmse(data, test_data).eval()
|
||
|
limit = 3 * spe
|
||
|
mse = rmse(test, test_out).eval()
|
||
|
# r2 = r2_score(data, test_data)
|
||
|
r2 = r2_score(test, test_out)
|
||
|
weight = autoencoder.get_weights()
|
||
|
weights = []
|
||
|
bias = []
|
||
|
is_weight = True
|
||
|
model = {
|
||
|
"weights": weights,
|
||
|
"bias": bias
|
||
|
}
|
||
|
for i in range(len(weight)):
|
||
|
if is_weight:
|
||
|
weights.append(weight[i].tolist())
|
||
|
is_weight = False
|
||
|
else:
|
||
|
bias.append(weight[i].tolist())
|
||
|
is_weight = True
|
||
|
return model, float(limit), r2, float(mse)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
with open('data.json', 'r') as f:
|
||
|
data = np.array(json.load(f)['data'])
|
||
|
layer_arr = [
|
||
|
[10, 1, 10],
|
||
|
[10, 8, 1, 8, 10],
|
||
|
[10, 8, 6, 1, 6, 8, 10]
|
||
|
]
|
||
|
for i in range(len(layer_arr)):
|
||
|
k = len(layer_arr[i]) // 2
|
||
|
for j in range(5):
|
||
|
layer_arr[i][k] = j + 1
|
||
|
model, limit, r2, mse = train(layer_arr[i], data[:3000, :], data, 5000)
|
||
|
model_config = {
|
||
|
"layer": layer_arr[i],
|
||
|
"r2": r2,
|
||
|
"mse": mse,
|
||
|
"model": model,
|
||
|
"spe": limit
|
||
|
}
|
||
|
with open('model%d_%d.json' % (len(layer_arr[i]), j + 1), 'w') as f:
|
||
|
f.write(json.dumps(model_config))
|
||
|
print('OK')
|