Keras有两种类型的模型,tf.keras.Sequential 和 函数式模型(Model)
tf.keras 可以运行任何keras兼容的代码,但要注意版本是否匹配,保存模型默认采用checkpoint format方式,也可以传递save_format=’h5’来使用HDF5。
最常见的模型是层的堆叠:tf.keras.Sequential,层的线性叠加。
别名:tf.keras.models.Sequential
1 选择模型(选择 Sequential)
model = Sequential()
2 网络构建
model.add(Dense(500,input_shape=(784,))) # 输入层,28*28=784
model.add(Activation('tanh')) # 激活函数是tanh
model.add(Dropout(0.5)) # 采用50%的dropout
#model.add(tf.keras.layers.Dense(512, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.02)))
# tf.keras.layers.Dense(神经元个数, activation="激活函数", kernel_regularizer=哪种正则化)
# 激活函数可以选择:“relu”,“softmax”,“sigmoid”,“tanh”(以字符串给出)
# 正则化可以选择:
# tf.keras.regularizers.l1()
3 编译
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 优化函数,设定学习率(lr)等参数
model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作为loss函数
model.compile(optimizer=优化器, loss=损失函数, metrics=["评测指标"])
优化器可以是字符串形式给出的优化器名字:“sgd”,“adagrad”,“adadelta”,“adam”
还可以是函数形式:
tf.keras.optimizers.SGD(lr=学习率, momentum=动量参数)
tf.keras.optimizers.Adagrad(lr=学习率)
tf.keras.optimizers.Adadelta(lr=学习率)
tf.keras.optimizers.Adam(lr=学习率, beta_1=0.9, beta_2=0.999)
loss 可以是字符串给出的损失函数名字:“mse”,“sparse_categorical_crossentropy”
也可以是函数形式:
tf.keras.losses.MSE()
tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
有些神经网络的输出是经过了softmax函数的概率分布,有些则不经概率分布直接输出。
可以认为 from_logits 这个参数是在询问:是否是原始输出,即没有经过概率分布的输出。
如果神经网络预测结果输出前经过了概率分布,写False;
如果神经网络预测结果输出前没有经过概率分布,写True。
metrics 告知网络评测指标:
y_:标签,y:预测结果
“accuracy”:y_和y都是以数字形式给出
“categorical_accuracy”:y_和y都是以独热码(概率分布)的形式给出
“sparse_categorical_accuracy”:y_以数值形式给出,y以独热码形式给出
4 训练
model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)
model.fit(训练集的输入特征, 训练集的标签,
batch_size=, epochs=,
validation_data=(测试集的输入特征, 测试集的标签),
validation_split=从训练集中划分多少比例给测试集,
validation_freq=多少次epoch测试一次 )
validation_data,validation_split 二选其一
5 输出
result = model.predict(X_test,batch_size=200,verbose=0)
tf.keras.models.Sequential 中的方法:
- add(layer) 添加层
在层堆栈的顶部添加层实例 compile 模型配置
compile(
optimizer='rmsprop', # 字符串(优化器的名称)或优化器实例
loss=None, # 损失函数,如果模型有多个输出,您可以通过传递字典或损失列表来对每个输出
# 使用不同的损失,由模型最小化的损失值将是所有独立损失的总和。
metrics=None, # 在训练和测试期间,模型要评估的度量标准列表,通常将使用metrics=['accuracy']。
# 要为一个多输出模型的不同输出指定不同的度量,可以传递一个字典,例如metrics={'output_a': 'accuracy', 'output_b': ['accuracy', 'mse']}。
# 还可以传递矩阵列表(len = len(输出)),比如metrics=[[accuracy'], ['accuracy', 'mse'],或者metrics=['accuracy', ['accuracy', 'mse']]。
loss_weights=None, # 指定标量系数(Python浮点数)的可选列表或字典,以对不同模型输出的损失贡献进行加权。
sample_weight_mode=None, # 如果需要按时间步长进行样本加权(2D加权),请将其设置为“时间”。没有默认的采样权值(1D)。
weighted_metrics=None, # 在训练和测试期间,将通过sample_weight或class_weight评估和加权的度量列表。
target_tensors=None, # 默认情况下,Keras将为模型的目标创建占位符,这些占位符将在训练期间与目标数据一起提供。
# 相反,如果您想使用自己的目标张量(反过来,Keras在训练时不会期望这些目标的外部Numpy数据),可以通过target_tensors参数指定它们。
distribute=None, # 在TF 2.0中不支持
**kwargs # 任何额外的参数
)
evaluate 评价
evaluate(
x=None, # 输入值
y=None, # 目标值
batch_size=None, # 每次梯度更新的样本数
verbose=1,
sample_weight=None, # 用于加权损失函数,在这种情况下,您应该确保在compile()中指定sample_weight_mode="temporal"。
# 当x是一个数据集时,不支持此参数,而是将示例权重作为x的第三个元素传递。
steps=None, # 样品批次数
callbacks=None, # 回调
max_queue_size=10, # 生成器队列的最大大小。如果未指定,max_queue_size将默认为10。
workers=1, # 使用基于进程的线程时要向上旋转的最大进程数,如果未指定,工人将默认为1。如果为0,将在主线程上执行生成器。
use_multiprocessing=False # 请注意,由于此实现依赖于多进程,因此不应该将非picklable参数传递给生成器,因为它们不能轻松传递给子进程。
)
返回: metrics_names将为标量输出提供显示标签。
fit
fit(
x=None,
y=None,
batch_size=None, # 每次梯度更新的样本数
epochs=1, # 训练模型的迭代数
verbose=1,
callbacks=None,
validation_split=0.0, # 将训练数据的一部分用作验证数据
validation_data=None, # 用于评估损失的数据和每个epoch结束时的任何模型度量。模型不会根据这些数据进行训练。validation_data将覆盖validation_split。
shuffle=True, # 在每个epoch之前对训练数据进行洗牌
class_weight=None,
sample_weight=None,
initial_epoch=0, # 开始训练的时间(对于恢复之前的训练很有用)。
steps_per_epoch=None,
validation_steps=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
**kwargs
)
fit 函数存在返回值,可有 history = model.fit… 中间运行的数据结果
get_layer 根据层的名称(惟一的)或索引检索层
get_layer(
name=None,
index=None
)
load_weights 从TensorFlow或HDF5权值文件加载所有层权值
load_weights(
filepath,
by_name=False,
skip_mismatch=False
)
pop 删除模型中的最后一层。
pop()
predict 为输入样本生成输出预测,计算是分批进行的。
predict(
x,
batch_size=None,
verbose=0,
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)