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

# -*- 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')