1、使用keras构建神经网络基本工作流程:
训练数据–创建模型–配置模型–训练模型–训练好的模型做预测、对模型效果进行评估。
(1)创建模型:
在 Keras 中有两类主要的模型:Sequential 顺序模型 和 使用函数式 API 的 Model 类模型。
这些模型有许多共同的方法和属性:
model.layers 是包含模型网络层的展平列表。
model.inputs 是模型输入张量的列表。
model.outputs 是模型输出张量的列表。
model.summary() 打印出模型概述信息。 它是 utils.print_summary 的简捷调用。
model.get_config() 返回包含模型配置信息的字典。
通过以下代码,就可以根据这些配置信息重新实例化模型:
config = model.get_config()
model = Model.from_config(config)
或者,对于 Sequential:
model = Sequential.from_config(config)
具体见keras中文文档:https://keras.io/zh/models/about-keras-models/
from keras.models import Sequential
from keras.layers import Dense,Activation
from keras import optimizers
#1、定义模型 通过序贯模型
model=Sequential()#定义了一个序贯模型
#2、叠加网络层
#序贯模型的第一层网络需要定义网络的输入形状或尺寸input_shape 或input_dim 数据本身的维度即可 不用包含输入数据的批量大小batch
#input_shape要求是一个元组类型的数据,input_dim要求是 一个整数类型的数据 input_shape=(784,)等价于 input_dim=784
model.add(Dense(32,input_shape=(784,)))#通过add可以把需要的网络层按照顺序一层层的叠加到模型上
model.add(Activation('relu'))
model.add(Dense(10))#Dense和Activation都是keras的网络层
model.add(Activation('softmax'))
#注:Dense全连接层 /稠密层 要求制定神经元的个数 Dense(10)表示这一层有10个神经元输出数据的shape也是10,
#如果是第一层输入层还需要制定输入数据的shape 否则则不需要指定
#Activation激活层 是对该层的输出施加激活函数 常用的激活函数包括 sigmoid relu tanh等
#Dropout 随机失活层 是防止模型过拟合的一种方式 Dropout层会指定一个更新参数(0-1之间的概率值) Dropout将在训练过程中每次更新参数时按一定概率随即断开输入神经元
#model.add(Dropout(0.5))
#也可以省略add 直接将网络层传递给序贯模型 如下
# model=Sequential([
# Dense(32,units=784),
# Activation('relu'),
# Dense(10),
# Activation('softmax')
# ])
#3、模型的编译 :对模型的学习过程进行配置
#优化器optizmizer 损失函数loss 评价指标列表metrics
model.compile(
optizmizer='rmsprop',
loss='mse',
metrics=['mse','mae']
)
'''
(1)优化器optizmizer 随机梯度下降算法 等优化方法
优化算法决定了神经网络参数以何种方式在训练中被更新 这是网络训练前需要知道的 需要在模型训练前配置好
常见的优化器 SGD Adam RMSprop AdaGrad AdaDelta
指定优化器 把优化器的名字直接作为参数传给 optizmizer 即可
有时 需要对优化算法的参数做一定的设置 比如Clipnorm Clipvalue对梯度进行裁剪 或者设置学习率lr以及学习率的衰减率 decay
这时需要先设置优化器 在传递给optizmizer
sgd=optimiizers.SGD(lr=0.01,decay=0.0001)
model.compile(loss='mean_squared_error',optimizer=sgd)
(2)损失函数loss
回归问题常用损失函数 mse/mean_squared_error 均方误差 mae/mean_absolute_error 平均绝对误差
分类问题 categorical_crossentropy 交叉熵
(3)性能评估metrics
和损失函数差不多
'''
#4、训练模型
model.fit(X,Y,nb_epoch=150,batch_size=16)
'''
X,Y用于训练的输入数据
nb_epoch训练的轮数 当所有的训练数据都被训练了一次之后 被称为一个opoch
batch_size每一批次的数据量 训练数据不是一次性被输入网络进行训练的,而是分批进入 每一个批量batch都会对网络进行一次参数更新
'''
#5、使用训练好的模型进行预测
y_pred=model.predict(x_pred,batch_size=32)
#6、模型的评估 在训练数据上进行
model.evaluate(X,Y)
(2)配置训练模型
compile(optimizer, loss=None, metrics=None, loss_weights=None,
sample_weight_mode=None, weighted_metrics=None, target_tensors=None)
参数说明:
① optimizer: 字符串(优化器名)或者优化器对象。
② loss: 字符串(目标函数名)或目标函数。 如果模型具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。
③ metrics: 在训练和测试期间的模型评估标准。通常你会使用 metrics =