tensorflow2知识总结,杂---3、如何提高网络的拟合能力?

一、总结

一句话总结:

1、增加层(增加层的效果比增加隐藏神经元的效果好)
2、增加隐藏神经元个数

1、什么是网络容量 及相关?

a、网络容量可以认为与网络中的可训练参数成正比
b、网络中的神经单元数越多,层数越多,神经网络的拟合能力越强。
c、但是训练速度、难度越大,越容易产生过拟合。

2、超参数是什么?

A、所谓超参数,也就是搭建神经网络中,需要我们自己如选择(不是通过梯度下降算法去优化)的那些参数。
B、比如,中间层的神经元个数、学习速率

3、提高网络的拟合能力的两种方法中哪种更好?

I、单纯的增加神经元个数对于网络性能的提高并不明显,增加层会大大提高网络的拟合能力
II、这也是为什么现在深度学习的层越来越深的原因

4、单层的神经元个数 太少或太多会怎样?

太少:单层的神经元个数,不能太小,太小的话,会造成信息瓶颈,使得模型欠拟合
太多:过拟合

5、提高网络的拟合能力 增加层的具体操作?

直接在隐藏层增加层即可,非常简单,比如:model.add(tf.keras.layers.Dense(128,activation='relu'))
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) 
model.add(tf.keras.layers.Dense(128,activation='relu'))

#增加两层
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(128,activation='relu'))

model.add(tf.keras.layers.Dense(10,activation='softmax'))

二、如何提高网络的拟合能力

博客对应课程的视频位置:

1、网络容量

可以认为与网络中的可训练参数成正比

网络中的神经单元数越多,层数越多,神经网络的拟合能力越强。

但是训练速度、难度越大,越容易产生过拟合。

2、如何选择超参数

所谓超参数,也就是搭建神经网络中,需要我们自己如选择(不是通过梯度下降算法去优化)的那些参数。

比如,中间层的神经元个数、学习速率

3、那么如何提高网络的拟合能力

一种显然的想法是增大网络容量:

1.增加层

2.增加隐藏神经元个数

这两种方法哪种更好呢?

单纯的增加神经元个数对于网络性能的提高并不明显,增加层会大大提高网络的拟合能力这也是为什么现在深度学习的层越来越深的原因

注意:

单层的神经元个数,不能太小,太小的话,会造成信息瓶颈,使得模型欠拟合

4、增加层增加网络拟合能力核心代码

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) 
model.add(tf.keras.layers.Dense(128,activation='relu'))

#增加两层
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(128,activation='relu'))

model.add(tf.keras.layers.Dense(10,activation='softmax'))

原来:

# 顺序模型

model = tf.keras.Sequential()

# 将多维数据(60000, 28, 28)变成一维

# 把图像扁平化成一个向量

model.add(tf.keras.layers.Flatten(input_shape=(28,28)))

# 这里的神经元也不能太多,神经元太多容易产生过拟合

# 神经元太少,会舍弃很多信息

model.add(tf.keras.layers.Dense(128,activation='relu'))

# 输出10个概率值,输出图片属于哪一类

model.add(tf.keras.layers.Dense(10,activation='softmax'))

model.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            (None, 784)               0         
_________________________________________________________________
dense (Dense)                (None, 128)               100480    
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1290      
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
____________________________

增加层之后:

model = tf.keras.Sequential()

model.add(tf.keras.layers.Flatten(input_shape=(28,28)))

model.add(tf.keras.layers.Dense(128,activation='relu'))

#增加两层

model.add(tf.keras.layers.Dense(128,activation='relu'))

model.add(tf.keras.layers.Dense(128,activation='relu'))

model.add(tf.keras.layers.Dense(10,activation='softmax'))

model.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            (None, 784)               0         
_________________________________________________________________
dense (Dense)                (None, 128)               100480    
_________________________________________________________________
dense_1 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_2 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_3 (Dense)              (None, 10)                1290      
=================================================================
Total params: 134,794
Trainable params: 134,794
Non-trainable params: 0
____________________________

参数从101,770 变成了134,794 ,对应的训练准确率也会相应提高