2021-09-13

神经网络及自动调整超参数教学(一看就会)

模型构建步骤:
1、读取数据,并进行简单的数据分割
2、构建神经网络
3、设置神经网络超参数调节范围
4、训练神经网络

需要的库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


from sklearn.preprocessing import RobustScaler, PowerTransformer, LabelEncoder
from sklearn.pipeline import make_pipeline

import tensorflow as tf
from matplotlib.pylab import style
import optuna
style.use('ggplot')
tf.compat.v1.disable_eager_execution()

1、读取数据,并进行简单的数据分割
数据处理这块因为每个人的数据不同,所以处理的方式也就不同,可根据自己需要设置自己的数据处理函数,但是数据归一化和数据分割是不可少的,将数据分割成训练集和测试集(一般还有个验证集,这里并没有,问题不大)

def Deal_data():
    train_data=pd.read_csv(r'E:\R_DataBase\Run_location\sum_data.txt',sep='  ',engine='python')



    rate=0.20    #数据分割比例
    new_Run_data=train_data.sample(frac=1)    #将数据全部打乱
    new_identify_data=new_Run_data.iloc[:int(len(new_Run_data)*rate),:]  #测试集
    new_train_data=new_Run_data.iloc[int(len(new_Run_data)*rate):,:]      #训练集

    #我的数据总共有10列,前8列为输入,后8列为输出

    #测试集
    Y_test=new_identify_data[:,8:10]
    X_test=new_identify_data[:0:8]

    #训练集
    X_train=new_train_data[:,0:8]
    Y_train=new_train_data[:,8:10]

    #将数据归一化
    pre_processing=make_pipeline(RobustScaler())
    X_train=pre_processing.fit_transform(X_train)
    X_test=pre_processing.transform(X_test)

    Y_train=pre_processing.fit_transform(Y_train)
    Y_test=pre_processing.transform(Y_test)

    return X_train,Y_train,X_test,Y_test

在构建神经网络之前,得先向大家介绍一个库optuna,自动调参就是基于这个库的
optuna主要有三部分

objective(目标函数)/

trail/(实验)

study(决定目标函数优化的方向并能根据需要获取最佳参数)(例如误差最小)

关于optuna的详细用法请读者自行查阅,例如参数范围设置函数,我用的是int型,还有float型等。

2、构建神经网络(这就是我的目标函数,返回最小误差)

a_alpha,beta, gamma, ebsno就是我的超参数,我这里构建的4层神经网络,四个参数分别是每一层的神经元的个数。超参数范围是在这里设置的哦。你可以根据自己的需要增加参数或减少参数

def Make_train(trial):
    a_alpha = trial.suggest_float("alpha", 0.0001, 1)
    beta = trial.suggest_int('betea', 10, 20)
    gamma = trial.suggest_int('gamma', 7, 30)
    ebsno = trial.suggest_int('ebsno', 5, 10)

    X_train, Y_train, X_test, Y_test = Deal_data()
    Model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(8,)),
        tf.keras.layers.Dense(beta, activation='tanh'),
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(gamma, activation='tanh'),
        tf.keras.layers.Dense(ebsno, activation='tanh'),
        tf.keras.layers.Dense(2, activation='tanh')
    ])

    Model.compile(
        optimizer='adam',
        loss='mean_squared_error',
        metrics=['accuracy']
    )
    Model.fit(X_train, Y_train, epochs=1000)
    test_loss, test_accuracy = Model.evaluate(X_test, Y_test)
    return test_loss
    

设置优化目标及参数搜索次数

def tune(objective):
    study=optuna.create_study(direction="minimize")
    study.optimize(objective,n_trials=100)
    return study.best_params

开始训练

if __name__=='__main__':
    tune(Make_train) 合,训练出误差

#输出结果会找到一个最佳参数组合。

上一篇:tensorflow第一天


下一篇:树莓派3B安装CentOS7