tf.keras.Sequential搭建深度神经⽹络
所谓深度神经⽹络就是层次⽐较多的神经⽹络,我们搭建深度神经⽹络的过程就是多次添加⽹络层次的过程,与搭建回归模型和预测模型的过程⼀样。
下⾯就看⼀下使⽤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
14for module in np, pd, mpl, sklearn, tf, keras:
15 print (module.__name__, module.__version__)
16 # 第⼆步:数据加载
17from sklearn.datats import fetch_california_housing初中不等式
18 housing = fetch_california_housing(data_home='C:/Urs/rencm/scikit_learn_data',
19 download_if_missing=True)
20 # 第三步:切分数据集和验证集
del_lection 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 # 第四步:输⼊归⼀化
26from sklearn.preprocessing import StandardScaler
27 scaler = StandardScaler()
维吾尔族人
28 x_train_scaled = scaler.fit_transform(x_train)
29 x_valid_scaled = ansform(x_valid)
30 x_test_scaled = ansform(x_test)
一年级图画
31 # 第五步:构建模型(这⾥构建隐藏层深度为20的深度神经⽹络模型)
32 model = dels.Sequential()
33 model.add(keras.layers.Input(shape = x_train.shape[1:]))
34for _ in range(20):
35 model.add(keras.layers.Den(30, activation = 'relu'))
男生撒娇
36 model.add(keras.layers.Den(1))
37
38 print (model.summary())
39
pile(
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)
模型的构建是我们已经⾮常熟悉的⼀个过程,所以上⾯我们没有仔细的讲解,我们所要强调是在深度神经⽹络模型的构建过程中以下⼏个可以优化的⽅⾯:
⼀:批归⼀化处理
概念:所谓的批归⼀化就是对所有的中间层次的结果都进⾏归⼀化的处理。
作⽤:可以有效的抑制梯度消失的问题。(梯度消失即损失函数关于靠前层次的导数越来越⼩,就可能导致前⾯层次的训练不充分。导致梯度消失问题出现的原因主要有两个。⼀是参数初始化问题,⼆是不合适的激活函数。批归⼀化处理可以使损失函数关于某⼀参数的导数尽可能均匀的分布,那么就不会出现关于某⼀参数的导数过⼩,从⽽有效的抑制梯度消失问题)
常⽤归⼀化处理的⽅式:
min-max归⼀化:x = (x-min)/(max - min)
z-score归⼀化:x = (x-u)/std
1# 第五步:构建模型(这⾥构建隐藏层深度为20的深度神经⽹络模型)
2 model = dels.Sequential()
3 model.add(keras.layers.Input(shape = x_train.shape[1:]))
4for _ in range(20):
5 model.add(keras.layers.Den(30, activation = 'relu')) 7 model.add(keras.layers.BatchNormalization())#对上⼀层的输出进⾏归⼀化处理
8"""10在归⼀化处理的时候,抑制存在⼀个争议,应该在激活之后归⼀化,还是应该在激活在前归⼀化,下⾯给出在激活之前归⼀化的⽅式:
11 model.add(keras.layers.Den(30))13 model.add(keras.layers.BatchNormalization())
14 model.add(keras.layers.Activation('relu'))
15"""
16 model.add(keras.layers.Den(1))
圆的认识课件
17
18print (model.summary())
19
pile(
21 loss = 'mean_squared_error',
22 optimizer = 'sgd'
23 )
墨子怒耕柱子
⼆:激活函数的重要性
⾸先介绍⼏个⽐较常⽤的激活函数:
sigmoid:1/(1+e^(-x))
relu:max(0,x)
tanh:tanh(x)
leaky relu:max(0.1x, x)
maxout
elu
位置修改这⾥我们测试⼀下lu激活函数,这个激活函数的特殊点是⾃带批归⼀化处理,⽽且运⾏的速度较快:
1# 第五步:构建模型(这⾥构建隐藏层深度为20的深度神经⽹络模型)
2 model = dels.Sequential()
3 model.add(keras.layers.Input(shape = x_train.shape[1:]))
4for _ in range(20):
5 model.add(keras.layers.Den(30, activation = 'lu'))
6 model.add(keras.layers.Den(1))
7
8print (model.summary())
9
pile(
11 loss = 'mean_squared_error',
12 optimizer = 'sgd'
13 )
三:dropout
概念:在模型训练的每⼀轮次,随机的选择若⼲个神经元,使其不再发⽣作⽤,即抛弃神经元。
作⽤:可以有效抑制过拟合。(dropout可以防⽌模型过分的依赖于某⼀个或⼏个神经元,从⽽有效的抑制过拟合现象的发⽣) 1# 第五步:构建模型(这⾥构建隐藏层深度为20的深度神经⽹络模型)
2 model = dels.Sequential()
3 model.add(keras.layers.Input(shape = x_train.shape[1:]))
4for _ in range(20):
5 model.add(keras.layers.Den(30, activation = 'lu'))
6 model.add(keras.layers.Dropout(0.5))
7# 在批归⼀化处理的时候,我们⼀般不会对所以的层次都进⾏归⼀化处理,影响程序运⾏效率,我们只对某⼏层进⾏归⼀化处理。
8 model.add(keras.layers.Den(1))
9
10print (model.summary())
11
pile(
13 loss = 'mean_squared_error',
14 optimizer = 'sgd'
15 )