自定义模型训练

news/2024/11/29 6:28:21/

文章目录

  • 自定义模型&训练
    • 1. Define the Model
    • 2. Define Optimizer and Loss
    • 3. Evaluate Untrained Model
    • 4. Define Metrics
    • 5. Apply Gradients
    • 6. Train Loop
    • 7. Validation Loop
    • 8. Main loop

自定义模型&训练

  在一些场景下,使用tensorflow默认的训练过程无法满足我们的需求,故需要自定义模型训练,以下是自定义模型及其训练的全过程。

1. Define the Model

def base_model():inputs = tf.keras.layers.Input(shape=(len(train.columns)))x = tf.keras.layers.Dense(128, activation='relu')(inputs)x = tf.keras.layers.Dense(64, activation='relu')(x)outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)model = tf.keras.Model(inputs=inputs, outputs=outputs)return modelmodel = base_model()

2. Define Optimizer and Loss

optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.001)
loss_object = tf.keras.losses.BinaryCrossentropy()

3. Evaluate Untrained Model

outputs = model(norm_test_X.values)
loss_value = loss_object(y_true=test_Y.values, y_pred=outputs)
print("Loss before training %.4f" % loss_value.numpy())

4. Define Metrics

class F1Score(tf.keras.metrics.Metric):def __init__(self, name='f1_score', **kwargs):super(F1Score, self).__init__(name=name, **kwargs)self.tp = tf.Variable(0, dtype = 'int32')self.fp = tf.Variable(0, dtype = 'int32')self.tn = tf.Variable(0, dtype = 'int32')self.fn = tf.Variable(0, dtype = 'int32')def update_state(self, y_true, y_pred, sample_weight=None):conf_matrix = tf.math.confusion_matrix(y_true, y_pred, num_classes=2)self.tn.assign_add(conf_matrix[0][0])self.tp.assign_add(conf_matrix[1][1])self.fp.assign_add(conf_matrix[0][1])self.fn.assign_add(conf_matrix[1][0])def result(self):if (self.tp + self.fp == 0):precision = 1.0else:precision = self.tp / (self.tp + self.fp)if (self.tp + self.fn == 0):recall = 1.0else:recall = self.tp / (self.tp + self.fn)# 返回 F1 Scoref1_score = 2 * ((precision * recall)/(precision + recall))return f1_scoredef reset_states(self):self.tp.assign(0)self.tn.assign(0) self.fp.assign(0)self.fn.assign(0)train_f1score_metric = F1Score()
val_f1score_metric = F1Score()train_acc_metric = tf.keras.metrics.BinaryAccuracy()
val_acc_metric = tf.keras.metrics.BinaryAccuracy()

5. Apply Gradients

def apply_gradient(optimizer, loss_object, model, x, y):with tf.GradientTape() as tape:logits = model(x)loss_value = loss_object(y_true=y, y_pred=logits)gradients = tape.gradient(loss_value, model.trainable_weights)optimizer.apply_gradients(zip(gradients, model.trainable_weights))return logits, loss_value

6. Train Loop

def train_data_for_one_epoch(train_dataset, optimizer, loss_object, model, train_acc_metric, train_f1score_metric, verbose=True):losses = []# 遍历所有训练数据for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):# 模型计算的预测值logits, loss_value = apply_gradient(optimizer, loss_object, model, x_batch_train, y_batch_train)losses.append(loss_value)# 格式化logits = tf.round(logits)logits = tf.cast(logits, 'int64')# 更新training metricstrain_acc_metric.update_state(y_batch_train, logits)train_f1score_metric.update_state(y_batch_train, logits)# 更新进度if verbose:print("Training loss for step %s: %.4f" % (int(step), float(loss_value)))return losses

7. Validation Loop

def perform_validation():losses = []# 遍历所有validation data.for x_val, y_val in test_dataset:# 计算validation的预测值及lossval_logits = model(x_val) val_loss = loss_object(y_true=y_val, y_pred=val_logits)losses.append(val_loss)# 格式化val_logits = tf.cast(tf.round(model(x_val)), 'int64')# 更新validation metricsval_acc_metric.update_state(y_val, val_logits)val_f1score_metric.update_state(y_val, val_logits)return losses

8. Main loop

# 循环epochs次
epochs = 5
epochs_val_losses, epochs_train_losses = [], []for epoch in range(epochs):print('Start of epoch %d' % (epoch,))# 执行Train Looplosses_train = train_data_for_one_epoch(train_dataset, optimizer, loss_object, model, train_acc_metric, train_f1score_metric)# 获取训练结果train_acc = train_acc_metric.result()train_f1score = train_f1score_metric.result()# 执行Validation Looplosses_val = perform_validation()# 获取Validation结果val_acc = val_acc_metric.result()val_f1score = val_f1score_metric.result()# 计算train和validation的losslosses_train_mean = np.mean(losses_train)losses_val_mean = np.mean(losses_val)epochs_val_losses.append(losses_val_mean)epochs_train_losses.append(losses_train_mean)print('\n Epcoh %s: Train loss: %.4f  Validation Loss: %.4f, Train Accuracy: %.4f, Validation Accuracy %.4f, Train F1 Score: %.4f, Validation F1 Score: %.4f' % (epoch, float(losses_train_mean), float(losses_val_mean), float(train_acc), float(val_acc), train_f1score, val_f1score))# 重置metricstrain_acc_metric.reset_states()val_acc_metric.reset_states()val_f1score_metric.reset_states()train_f1score_metric.reset_states()

http://www.ppmy.cn/news/47805.html

相关文章

RPC通信

一、RPC通信 1、什么是RPC? RPC(Remote Procedure Call)远程过程调用,允许像调用本地服务一样调用远程服务。在整个过程中,RPC 会隐藏具体的通信细节。RPC是一种通信方式,可以通过HTTP来实现,也…

图像分类算法:ResNet论文解读

图像分类算法:ResNet论文解读 前言 ​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚…

【Linux】-关于Linux的指令(上)

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! TOC 前言 今天我们来讲关于Linux的基本指令,博主讲的指令会对应着Windows…

CLIP 论文解读

文章目录 模型训练推理 实验与Visual N-Grams 相比较分布Shift的鲁棒性 不足参考 现有的计算机视觉系统用来预测一组固定的预订对象类别,比如ImageNet数据集有1000类,CoCo数据集有80类。这种受限的监督形式限制了模型的通用性和可用性。使用这种方法训练…

ClickHouse同步MySQL数据

目录 1 概述1.1 特点1.2 使用细则 2 案例实操2.1 MySQL 开启 binlog 和 GTID 模式2.2 准备 MySQL 表和数据2.3 开启 ClickHouse 物化引擎2.4 创建复制管道2.5 修改数据2.6 删除数据2.7 删除表 1 概述 MySQL 的用户群体很大,为了能够增强数据的实时性,很多…

Nmap入门到高级【第二章】

预计更新Nmap基础知识 1.1 Nmap简介和历史 1.2 Nmap安装和使用方法 1.3 Nmap扫描技术和扫描选项 Nmap扫描技术 2.1 端口扫描技术 2.2 操作系统检测技术 2.3 服务和应用程序检测技术 2.4 漏洞检测技术 Nmap扫描选项 3.1 扫描类型选项 3.2 过滤器选项 3.3 探测选项 3.4 输出选项…

Python OpenCV 蓝图:1~5

原文:OpenCV with Python Blueprints 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最好真…

一文吃透Http协议

Http 协议 1. 初始 Http Http 协议 , 是应用层最为广泛使用的协议 , Http 就是浏览器和服务器之间的桥梁. Http 是基于 TCP 协议实现的 , 通常我们输入搜索框中的网址 (URL) , 浏览器就会根据这个 URL 构造出一个 Http 请求 , 发送给服务器. 服务器就会返回一个 Http 响应(包…