01 基本概念
当一层中的所有神经元都连接到上一层中的每个神经元时,该层称为全连接层或密集层。
感知机无法解决异或问题,堆叠后的多层感知机可以。
信号仅沿一个方向流动,该架构为前馈神经网络FNN。
包含一个深度隐藏层时,称为深度神经网络DNN。
反向传播训练方法
使用有效的技术自动计算梯度下降;反向传播算法可以找出应如何调整每个连接权重和每个偏置项以减少误差。
对于每个训练实例,反向传播算法首先进行预测(正向传递)并测量误差,然后反向经过每个层以测量来自每个连接的误差贡献(反向传递),最后调整连接权重以减少误差(梯度下降步骤)。
为什么需要激活函数?
如果层之间没有非线性,即使很深的层堆叠也等同于单个层,无法解决复杂的问题。
内核是连接权重矩阵的另一个名称。
02 构建keras模型的方法:
区别:
顺序API和函数式API都是声明性的(首先声明要使用的层以及如何连接它们,然后才向模型提供一些数据进行训练或推断)。
一些模型涉及循环、变化的形状、条件分支和其他动态行为,可以使用子类API。
子类API只需对Model类进行子类化,在构建函数中创建所需的层,然后在call()方法中执行所需的计算即可。
不需要创建输入,只使用call()方法的输入参数,就可以将构造函数中层的创建与其在call()方法中的用法分开。
优点:可以在call()方法中执行几乎所有想做的操作:for循环、if语句、底层tensorflow操作等等;
缺点:模型架构隐藏在call()方法中,无法保存或克隆,调用summary()方法时,只会得到一个图层列表,没有连接的信息。
03 一般步骤:构建模型、编译、训练、评估、预测
创建模型后,必须调用compile()方法来指定损失函数和要使用的优化器。
如果训练集非常不平衡,其中某些类的代表过多,而其它类的代表不足,调用fit()方法时设置class_weight参数会很有用,给代表性不足的类更大的权重;如果需要每个实例的权重,设置sample_weight参数。
当模型性能不好时,调整:
多输出,每个输入都有自己的损失函数,编译时应传递一系列损失,默认下对所有损失简单累加得到最终损失;
训练时,需要对每个输出提供标签(y_train,y_train);评估模型时,返回总损失以及翻个损失。
04 保存和还原模型
A. 顺序API和函数式API
model=keras.models.Sequential([…])
model.compile([…])
model.fit([…])
model.save("my_keras_model.h5")
#加载模型
model=keras.models.load_model('my_keras_model.h5')
B. 子类API
save_weights()和load_weights()保存和还原模型参数,其他的内容需要自己保存、还原。
05 使用回调函数
训练过程中定期保存检查点,如何使用fit()保存检查点? 回调函数
fit()方法接受一个callbacks参数,该参数使你可以指定keras在训练开始和结束时,每个轮次的开始和结束时将调用的对象列表。
回调函数使用
#提前停止法一(防止计算机崩溃)
checkpoint_cb=keras.callbacks.ModelCheckpoint("my_keras_model.h5",save_best_only=True)
history=model.fit(X_train,y_train,epochs=10,validation_data=(X_valid,y_valid),callbacks=[checkpoint_cb])
model=keras.models.load_model('my_keras_model.h5')
#提前停止法二(在多个轮次的验证集上没有任何进展,避免浪费时间和资源)
early_stopping_cb=keras.callbacks.EarlyStopping(patience=10,restore_best_weights=True)
#可以将两个回调结合使用
history=model.fit(X_train,y_train,epochs=100,validation_data=(X_valid,y_valid),callbacks=[checkpoint_cb,early_stopping_cb])
06 使用tensorboard
方法一:从终端打开
激活环境-项目根目录-命令tensorboard --logdir=./my_logs --port=6006
方法二:从jupyter notebook打开
%load_ext tensorboard
%tensorboard --logdir=./my_logs --port=6006
07 微调超参数
学习率-从非常低的学习率(例如10^-5)开始,逐渐将其增大到非常大的值(10),根据损失选择。然后重新初始化模型,并以这种良好的学习率正常训练模型。
优化器
批量大小-尝试使用大批量处理,慢慢增加学习率,如果训练不稳定或最终表现令人失望,则尝试使用小批量(2-32)处理。
激活函数-通常,ReLU是所有隐藏层的默认设置,对于输出层,取决于任务。
迭代次数-大多数情况不需要调整迭代次数,使用提前停止即可。