开发者学堂课程【Tensorflow2.0入门与实战:网络优化与超参数选择】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/664/detail/11109
网络优化与超参数选择
内容介绍:
一、 网络容量
二、 实例
一、网络容量
可以认为与网络中的可训练参数成正比,即网络当中可训练参数越多,说明网络的容量越大。
网络中的神经单元数越多,层数越多,神经网络的拟合能力越强。但是训练速度、难度越大,越容易产生过拟合。
增加网络容量的方法:
(1)增加网络中神经元个数,增加网络容量
(2)增加网络层数,增加网络容量,拟合能力越强,但不能无限增大
如何选择超参数?
所谓超参数,也就是搭建神经网络中,需要我们自己如选择(不是通过梯度下降算法去优化)的那些参数。比如,中间层的神经元个数、学习速率
那么如何提高网络的拟合能力,一种显然的想法是增大网络容量:
(1)增加层
(2)增加隐藏神经元个数
这两种方法哪种更好呢?
单纯的增加神经元个数对于网络性能的提高并不明显,增加层会大大提高网络的拟合能力。这也是为什么现在深度学习的层越来越深的原因。
注意:
单层的神经元个数,不能太小,太小的话,会造成信息瓶颈,使得模型欠拟合。
二、实例
只有一个隐藏层:
model = tf. keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))# 28*28
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers. Dense(10,activation='softmax'))
model.summary()
运行结果为:
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
重新定义 model(增加两个隐藏层):
model = tf. keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))# 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()
运行结果为:
Total params: 134,794
Trainable params: 134,794
Non-trainable params: 0
编译模型:
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=' categorical_crossentropy',
metrics=['acc']
)
将 learning_rate 恢复至0.001,训练10个 epochs,查看效果
model.fit(train_image,train_label_onehot,epochs=10)
最后,准确率达到91.03%,可以说增加网络拟合能力,能够提高正确率,但不能无限增加拟合能力,因为可训练参数过多可能会使模型过拟合。