所谓深度神经网络就是层次比较多的神经网络,我们搭建深度神经网络的过程就是多次添加网络层次的过程,与搭建回归模型和预测模型的过程一样。
下面就看一下使用tf.keras.Sequential构建深度神经网络模型的完整过程:
1 # 第一步:包导入 2 import numpy as np 3 import pandas as pd 4 import matplotlib as mpl 5 import matplotlib.pyplot as plt 6 import sklearn 7 import tensorflow as tf 8 import tensorflow.keras as keras 9 10 import os 11 import sys 12 import time 13 14 for module in np, pd, mpl, sklearn, tf, keras: 15 print (module.__name__, module.__version__) 16 # 第二步:数据加载 17 from sklearn.datasets import fetch_california_housing 18 housing = fetch_california_housing(data_home=‘C:/Users/rencm/scikit_learn_data‘, 19 download_if_missing=True) 20 # 第三步:切分数据集和验证集 21 from sklearn.model_selection import train_test_split 22 x_train_all, x_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state = 7) 23 x_train, x_valid, y_train, y_valid = train_test_split(x_train_all, y_train_all, random_state = 11) 24 print (x_train.shape, x_valid.shape, x_test.shape) 25 # 第四步:输入归一化 26 from sklearn.preprocessing import StandardScaler 27 scaler = StandardScaler() 28 x_train_scaled = scaler.fit_transform(x_train) 29 x_valid_scaled = scaler.transform(x_valid) 30 x_test_scaled = scaler.transform(x_test) 31 # 第五步:构建模型(这里构建隐藏层深度为20的深度神经网络模型) 32 model = keras.models.Sequential() 33 model.add(keras.layers.Input(shape = x_train.shape[1:])) 34 for _ in range(20): 35 model.add(keras.layers.Dense(30, activation = ‘relu‘)) 36 model.add(keras.layers.Dense(1)) 37 38 print (model.summary()) 39 40 model.compile( 41 loss = ‘mean_squared_error‘, 42 optimizer = ‘sgd‘ 43 ) 44 # 第六步:训练模型 45 history = model.fit( 46 x_train_scaled, y_train, 47 validation_data=(x_valid_scaled, y_valid), 48 epochs=100, 49 callbacks=[ 50 keras.callbacks.EarlyStopping(min_delta = 1e-2, patience=5) 51 ] 52 ) 53 # 第七步:评测模型 54 model.evaluate(x_test_scaled, x_test)
模型的构建是我们已经非常熟悉的一个过程,所以上面我们没有仔细的讲解,我们所要强调是在深度神经网络模型的构建过程中以下几个可以优化的方面:
概念:所谓的批归一化就是对所有的中间层次的结果都进行归一化的处理。
作用:可以有效的抑制梯度消失的问题。(梯度消失即损失函数关于靠前层次的导数越来越小,就可能导致前面层次的训练不充分。导致梯度消失问题出现的原因主要有两个。一是参数初始化问题,二是不合适的激活函数。批归一化处理可以使损失函数关于某一参数的导数尽可能均匀的分布,那么就不会出现关于某一参数的导数过小,从而有效的抑制梯度消失问题)
常用归一化处理的方式:
1 # 第五步:构建模型(这里构建隐藏层深度为20的深度神经网络模型) 2 model = keras.models.Sequential() 3 model.add(keras.layers.Input(shape = x_train.shape[1:])) 4 for _ in range(20): 5 model.add(keras.layers.Dense(30, activation = ‘relu‘)) 7 model.add(keras.layers.BatchNormalization())#对上一层的输出进行归一化处理 8 """10 在归一化处理的时候,抑制存在一个争议,应该在激活之后归一化,还是应该在激活在前归一化,下面给出在激活之前归一化的方式: 11 model.add(keras.layers.Dense(30))13 model.add(keras.layers.BatchNormalization()) 14 model.add(keras.layers.Activation(‘relu‘)) 15 """ 16 model.add(keras.layers.Dense(1)) 17 18 print (model.summary()) 19 20 model.compile( 21 loss = ‘mean_squared_error‘, 22 optimizer = ‘sgd‘ 23 )
首先介绍几个比较常用的激活函数:
这里我们测试一下selu激活函数,这个激活函数的特殊点是自带批归一化处理,而且运行的速度较快:
1 # 第五步:构建模型(这里构建隐藏层深度为20的深度神经网络模型) 2 model = keras.models.Sequential() 3 model.add(keras.layers.Input(shape = x_train.shape[1:])) 4 for _ in range(20): 5 model.add(keras.layers.Dense(30, activation = ‘selu‘)) 6 model.add(keras.layers.Dense(1)) 7 8 print (model.summary()) 9 10 model.compile( 11 loss = ‘mean_squared_error‘, 12 optimizer = ‘sgd‘ 13 )
概念:在模型训练的每一轮次,随机的选择若干个神经元,使其不再发生作用,即抛弃神经元。
作用:可以有效抑制过拟合。(dropout可以防止模型过分的依赖于某一个或几个神经元,从而有效的抑制过拟合现象的发生)
1 # 第五步:构建模型(这里构建隐藏层深度为20的深度神经网络模型) 2 model = keras.models.Sequential() 3 model.add(keras.layers.Input(shape = x_train.shape[1:])) 4 for _ in range(20): 5 model.add(keras.layers.Dense(30, activation = ‘selu‘)) 6 model.add(keras.layers.Dropout(0.5)) 7 # 在批归一化处理的时候,我们一般不会对所以的层次都进行归一化处理,影响程序运行效率,我们只对某几层进行归一化处理。 8 model.add(keras.layers.Dense(1)) 9 10 print (model.summary()) 11 12 model.compile( 13 loss = ‘mean_squared_error‘, 14 optimizer = ‘sgd‘ 15 )
原文:https://www.cnblogs.com/renxiansheng/p/12530132.html