使用tensorflow2自定义损失函数需要注意什么
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,小编给大家分享一下使用tensorflow2自定义损失函数需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Ker
千家信息网最后更新 2024年11月18日使用tensorflow2自定义损失函数需要注意什么
小编给大家分享一下使用tensorflow2自定义损失函数需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
Keras的核心原则是逐步揭示复杂性,可以在保持相应的高级便利性的同时,对操作细节进行更多控制。当我们要自定义fit中的训练算法时,可以重写模型中的train_step方法,然后调用fit来训练模型。
这里以tensorflow2官网中的例子来说明:
import numpy as npimport tensorflow as tffrom tensorflow import kerasx = np.random.random((1000, 32))y = np.random.random((1000, 1))class CustomModel(keras.Model): tf.random.set_seed(100) def train_step(self, data): # Unpack the data. Its structure depends on your model and # on what you pass to `fit()`. x, y = data with tf.GradientTape() as tape: y_pred = self(x, training=True) # Forward pass # Compute the loss value # (the loss function is configured in `compile()`) loss = self.compiled_loss(y, y_pred, regularization_losses=self.losses) # Compute gradients trainable_vars = self.trainable_variables gradients = tape.gradient(loss, trainable_vars) # Update weights self.optimizer.apply_gradients(zip(gradients, trainable_vars)) # Update metrics (includes the metric that tracks the loss) self.compiled_metrics.update_state(y, y_pred) # Return a dict mapping metric names to current value return {m.name: m.result() for m in self.metrics} # Construct and compile an instance of CustomModelinputs = keras.Input(shape=(32,))outputs = keras.layers.Dense(1)(inputs)model = CustomModel(inputs, outputs)model.compile(optimizer="adam", loss=tf.losses.MSE, metrics=["mae"])# Just use `fit` as usualmodel.fit(x, y, epochs=1, shuffle=False)32/32 [==============================] - 0s 1ms/step - loss: 0.2783 - mae: 0.4257
这里的loss是tensorflow库中实现了的损失函数,如果想自定义损失函数,然后将损失函数传入model.compile中,能正常按我们预想的work吗?
答案竟然是否定的,而且没有错误提示,只是loss计算不会符合我们的预期。
def custom_mse(y_true, y_pred): return tf.reduce_mean((y_true - y_pred)**2, axis=-1)a_true = tf.constant([1., 1.5, 1.2])a_pred = tf.constant([1., 2, 1.5])custom_mse(a_true, a_pred)tf.losses.MSE(a_true, a_pred)
以上结果证实了我们自定义loss的正确性,下面我们直接将自定义的loss置入compile中的loss参数中,看看会发生什么。
my_model = CustomModel(inputs, outputs)my_model.compile(optimizer="adam", loss=custom_mse, metrics=["mae"])my_model.fit(x, y, epochs=1, shuffle=False)32/32 [==============================] - 0s 820us/step - loss: 0.1628 - mae: 0.3257
我们看到,这里的loss与我们与标准的tf.losses.MSE明显不同。这说明我们自定义的loss以这种方式直接传递进model.compile中,是完全错误的操作。
正确运用自定义loss的姿势是什么呢?下面揭晓。
loss_tracker = keras.metrics.Mean(name="loss")mae_metric = keras.metrics.MeanAbsoluteError(name="mae")class MyCustomModel(keras.Model): tf.random.set_seed(100) def train_step(self, data): # Unpack the data. Its structure depends on your model and # on what you pass to `fit()`. x, y = data with tf.GradientTape() as tape: y_pred = self(x, training=True) # Forward pass # Compute the loss value # (the loss function is configured in `compile()`) loss = custom_mse(y, y_pred) # loss += self.losses # Compute gradients trainable_vars = self.trainable_variables gradients = tape.gradient(loss, trainable_vars) # Update weights self.optimizer.apply_gradients(zip(gradients, trainable_vars)) # Compute our own metrics loss_tracker.update_state(loss) mae_metric.update_state(y, y_pred) return {"loss": loss_tracker.result(), "mae": mae_metric.result()} @property def metrics(self): # We list our `Metric` objects here so that `reset_states()` can be # called automatically at the start of each epoch # or at the start of `evaluate()`. # If you don't implement this property, you have to call # `reset_states()` yourself at the time of your choosing. return [loss_tracker, mae_metric] # Construct and compile an instance of CustomModelinputs = keras.Input(shape=(32,))outputs = keras.layers.Dense(1)(inputs)my_model_beta = MyCustomModel(inputs, outputs)my_model_beta.compile(optimizer="adam")# Just use `fit` as usualmy_model_beta.fit(x, y, epochs=1, shuffle=False)32/32 [==============================] - 0s 960us/step - loss: 0.2783 - mae: 0.4257
终于,通过跳过在 compile() 中传递损失函数,而在 train_step 中手动完成所有计算内容,我们获得了与之前默认tf.losses.MSE完全一致的输出,这才是我们想要的结果。
以上是"使用tensorflow2自定义损失函数需要注意什么"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
函数
损失
内容
篇文章
更多
模型
结果
错误
训练
不同
复杂
明显
高级
一致
不怎么
例子
便利性
原则
参数
只是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
穿越火线选择服务器人数
网络安全风险防范意识
开发的游戏怎么关联云服务器
虎牙主播方舟怎么进的服务器
配伍题 网络安全的特性
网络技术助理工程师查询网址
服务器运行速度快的
国泰安数据库在排队
腾飞安全服务器机柜
塔科夫服务器目录在哪在哪
国产飞腾服务器芯片
华为软件开发云搭建教程
火力全开怎么自己开服务器
cdp服务器
简版数据库用友U密码设置8
wow 选服务器
甘肃数据网络技术服务询问报价
网络安全小黑板怎么划分个人信息
服务器怎么降低噪声
无锡软件开发区邮编
美国最有潜力互联网科技公司
仁宝公司网络安全
利用网络技术优化阅读教学
软件开发合同免税备案 逃税
云服务器研究
电脑服务器未响应
国产飞腾服务器芯片
阿里巴巴网络服务器地址是什么
河源餐厅免费二维码点餐软件开发
图片存数据库