事业单位可以建设网站吗,重庆论坛新闻评论,在线定制家具,建设国家地质公园网站主要功能本文是基于tensorflow2.2.0版本#xff0c;介绍了模型的训练与评估。主要介绍了tf.keras的内置训练过程#xff0c;包括compile、fit#xff0c;其中compile中包含优化器、loss与metrics的使用#xff0c;内置api中还包含了很多辅助工具#xff0c;在Callback中进行介绍介绍了模型的训练与评估。主要介绍了tf.keras的内置训练过程包括compile、fit其中compile中包含优化器、loss与metrics的使用内置api中还包含了很多辅助工具在Callback中进行介绍除了简单的单输入单输出模型之外本文还介绍了多输入、多输出模型的训练过程。本文中涉及的内容都是内置api相关内容大都可以进行自定义自定义相关内容会陆续在后续文章里介绍。实战系列篇章中主要会分享解决实际问题时的过程、遇到的问题或者使用的工具等等。如问题分解、bug排查、模型部署等等。相关代码实现开源在https://github.com/wellinxu/nlp_store 更多内容关注知乎专栏(或微信公众号)NLP杂货铺。简单文本分类模型示例训练与评估流程compilefitCallback多输入、多输出模型compilefit参考简单文本分类模型示例 如下面代码所示根据【NLP实战篇之tensorflow2.0快速入门】获取一个完整的文本分类示例其中包含数据获取、数据简单预处理、模型构建、训练与评估。import tensorflow as tf# 下载IMDB数据vocab_size 10000 # 保留词的个数imdb tf.keras.datasets.imdb(train_data, train_labels), (test_data, test_labels) imdb.load_data(num_wordsvocab_size)# 一个将单词映射到整数索引的词典word_index imdb.get_word_index() # 索引从1开始word_index {k:(v3) for k,v in word_index.items()}word_index[] 0word_index[] 1word_index[] 2 # unknownword_index[] 3# 统一文本序列长度train_data tf.keras.preprocessing.sequence.pad_sequences(train_data, valueword_index[], paddingpost, truncatingpost, maxlen256)test_data tf.keras.preprocessing.sequence.pad_sequences(test_data, valueword_index[], paddingpost, truncatingpost, maxlen256)# 模型构建model tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, 16), # [batch_size, seq_len, 16] tf.keras.layers.GlobalAveragePooling1D(), # [batch_size, 16] tf.keras.layers.Dense(16, activationrelu), # [batch_size, 16] tf.keras.layers.Dense(1, activationsigmoid) # [batch_size, 1] ])# 配置模型训练参数# model.compile(optimizeradam, lossbinary_crossentropy, metrics[accuracy])model.compile(optimizertf.keras.optimizers.Adam(), losstf.keras.losses.BinaryCrossentropy(), metrics[tf.keras.metrics.BinaryAccuracy()])# 训练模型history model.fit(train_data, train_labels, epochs40, batch_size512)# 评估测试集model.evaluate(test_data, test_labels, verbose2)训练与评估流程 compile如上面代码所示要使用fit进行训练模型需要制定优化器、损失函数和评价指标通过compile方法传递给模型。除了这三个参数compile还包含了其他参数optimizer: 字符串(优化器名称)或者优化器实例具体可看tf.keras.optimizersloss: 字符串(损失函数名称)、损失函数或损失实例具体可看tf.keras.losses.Loss与tf.keras.lossesmetrics: 评价方法列表列表中每个值可以是字符串(度量函数名称)、度量函数或者度量实例具体可看tf.keras.metrics.Metric与tf.keras.metricsloss_weights: 列表或者字典格式模型不同输出的loss权重用于多输出模型sample_weight_mode:weighted_metrics: 通过样本权重或者类别权重计算的度量列表**kwargs: 其他关键字参数其中优化器、loss和度量方法都有很多内置的api如下表所示。除此之外还支持自定义相关函数此部分内容在后续文章中介绍。optimizer优化器Adadelta、Adagrad、Adam、Adamax、Ftrl、SGD、Nadam、RMSprop等loss损失:BinaryCrossentropy、CategoricalCrossentropy、CategoricalHinge、CosineSimilarity、Hinge、Huber、KLDivergence、LogCosh、MeanAbsoluteError、MeanAbsolutePercentageError、MeanSquaredError、MeanSquaredLogarithmicError、Poisson、SparseCategoricalCrossentropy、SquaredHinge、MAE、MAPE、MSE、MSLE等等metrics度量:AUC、Accuracy、BinaryAccuracy、BinaryCrossentropy、CategoricalAccuracy、CosineSimilarity、FalseNegatives、FalsePositives、MeanIoU、Mean、MeanAbsoluteError、MeanSquaredError、Precision、Recall、TopKCategoricalAccuracy等等在训练神经网络的时候有个比较重要的超参数学习率这个参数的大小或者变化都严重影响着最终模型的效果。通过优化器中learning_rate参数可以设置学习率的大小与变化。learning_rate可以设置为静态的比如2e-5或者设置为动态的tf.keras.optimizers.schedules中已经提供了部分学习率衰减方法如ExponentialDecay、InverseTimeDecay、LearningRateSchedule、PiecewiseConstantDecay、PolynomialDecay等等。fitfit方法是tf.keras中内置的训练方法其除了包含必要的输入数据与训练轮次之外还有包含很多其他参数如下所示batch_size: Integer或None每次进行梯度更新的样本数量默认32epochs: Integer. 模型训练的轮次Number of epochs to train the model.verbose: 0, 1, or 2. 信息显示模式0 silent, 1 progress bar, 2 one line per epochcallbacks: keras.callbacks.Callback示例列表validation_split: 0-1之间的浮点数将多少比例的训练数据用作验证数据validation_data: 评估数据shuffle: Boolean (每一轮训练之前是否扰乱训练数据) or str (for batch)class_weight: 字典类别权重类别索引为key权重为值sample_weight: 样本权重initial_epoch: Integer从第几轮次开始训练steps_per_epoch: Integer or None,每轮次训练多少步validation_steps:validation_batch_size:validation_freq:max_queue_size: Integer. 只用于keras.utils.Sequence输入workers: Integer. 只用于keras.utils.Sequence输入use_multiprocessing: Boolean. 只用于keras.utils.Sequence输入其中validation_split参数可以自动分离训练集留作验证数据class_weight作为类权重可以缓解类别不平衡的问题样本权重sample_weight可以起到类似的作用其控制程度更细致能够进一步提高难样本的权重或者降低简单/无效等样本。CallbackCallback是训练或评估期间在不同时间点(某个周期开始时、某个批次结束时、某个周期结束时)调用的对象这些对象可以实现以下行为定义验证模型定期或者触发条件进行模型保存训练停滞时改变学习率训练停滞时微调结构训练结束或者触发条件时发送电子邮件或即时消息等具体使用方式如下所示callbacks [ # 提前终止训练 tf.keras.callbacks.EarlyStopping(monitorval_loss, min_delta1e-2, patience2, verbose1), # 保存中间模型 tf.keras.callbacks.ModelCheckpoint(filepathmymodel_{epoch}, save_best_onlyTrue, monitorval_loss, verbose1), # 可视化化损失与指标 tf.keras.callbacks.TensorBoard(log_dir/full_path_to_your_logs, histogram_freq0, embeddings_freq0, update_freqepoch)]model.fit(train_data, train_labels, epochs40, batch_size512, callbackscallbacks)tf.keras.callbacks中提供了一些内置的callback我们也可以进行自定义自定义相关内容后续文章介绍。下面展示了keras中内置的callbackBaseLogger:累积每轮训练的平均指标这个Callback会被keras模型默认调用CSVLogger将每轮的损失与度量结果数据流写入csv文件中EarlyStopping当指定的度量指标停止改进时停止训练History将事件记录到History对象中这个Callback会被keras模型默认调用LearningRateScheduler修改学习率ModelCheckpoint以某种频率保存模型或权重ProgbarLogger向stdout输出度量指标ReduceLROnPlateau当某个指标停止改进时降低学习率RemoteMonitorTensorBoard可视化工具TerminateOnNaN当遇到NaN损失时终止训练多输入、多输出模型 前面的示例中模型都是单个输入与单个输出但有很多模型是多个输入或输出例如上图模型结构所示我们用以下方法构建模型image_input tf.keras.Input(shape(32, 32, 3), nameimg_input)timeseries_input tf.keras.Input(shape(None, 10), namets_input)x1 tf.keras.layers.Conv2D(3, 3)(image_input)x1 tf.keras.layers.GlobalMaxPooling2D()(x1)x2 tf.keras.layers.Conv1D(3, 3)(timeseries_input)x2 tf.keras.layers.GlobalMaxPooling1D()(x2)x tf.keras.layers.concatenate([x1, x2])score_output tf.keras.layers.Dense(1, namescore_output)(x)class_output tf.keras.layers.Dense(5, activationsoftmax, nameclass_output)(x)model tf.keras.Model( inputs[image_input, timeseries_input], outputs[score_output, class_output] )compile如果loss或者metrics参数只有单个传递给模型则每一个输出都用一个loss或者metrics但在很多情况下不同的输出需要不同的loss或者metrics我们就需要对应每个输出给出不同的值如下面所示model.compile( optimizertf.keras.optimizers.RMSprop(1e-3), loss[tf.keras.losses.MeanSquaredError(), tf.keras.losses.CategoricalCrossentropy()], metrics[ [ tf.keras.metrics.MeanAbsolutePercentageError(), tf.keras.metrics.MeanAbsoluteError(), ], [tf.keras.metrics.CategoricalAccuracy()], ], )loss与metrics都是list的形式按照output的顺序对应而我们上面的模型中已经给输出层进行了命名则可以通过字典来制定loss与metrics当输出超过2个的时候尤其推荐字典的方式。同时我们还可以使用loss_weights参数来给不同的输出指定权重具体使用方法如下:model.compile( optimizertf.keras.optimizers.RMSprop(1e-3), loss{ score_output: tf.keras.losses.MeanSquaredError(), class_output: tf.keras.losses.CategoricalCrossentropy(), }, metrics{ score_output: [ tf.keras.metrics.MeanAbsolutePercentageError(), tf.keras.metrics.MeanAbsoluteError(), ], class_output: [tf.keras.metrics.CategoricalAccuracy()], }, loss_weights{score_output: 2.0, class_output: 1.0}, )除此之外如果某些输出不为训练只用来预测则可以写成这样 # list的形式 model.compile( optimizertf.keras.optimizers.RMSprop(1e-3), loss[None, tf.keras.losses.CategoricalCrossentropy()], ) # 或dict的形式 model.compile( optimizertf.keras.optimizers.RMSprop(1e-3), loss{class_output: tf.keras.losses.CategoricalCrossentropy()}, )fitfit在接受多输入的时候跟上面loss类似可以使用numpy数组的list或者dict形式如下所示 # 随机生成NumPy数据 img_data np.random.random_sample(size(100, 32, 32, 3)) ts_data np.random.random_sample(size(100, 20, 10)) score_targets np.random.random_sample(size(100, 1)) class_targets np.random.random_sample(size(100, 5)) # list形式 model.fit([img_data, ts_data], [score_targets, class_targets], batch_size32, epochs1) # 或者dict形式 model.fit( {img_input: img_data, ts_input: ts_data}, {score_output: score_targets, class_output: class_targets}, batch_size32, epochs1, )当然可以将数据转换成Dataset格式然后传给fit如下面代码所示 # dataset格式 train_dataset tf.data.Dataset.from_tensor_slices( ( {img_input: img_data, ts_input: ts_data}, {score_output: score_targets, class_output: class_targets}, ) ) train_dataset train_dataset.shuffle(buffer_size1024).batch(64) model.fit(train_dataset, epochs1)参考 https://www.tensorflow.org/guide/keras/train_and_evaluate