tf.GradientTape自定义模型训练

tf.GradientTape自定义模型训练

为什么要自定义模型

tf.keras作为tensorflow的高级API可以搭建各种神经网络,当需要实现完全控制训练过程时,比如MAML,就需要自定义模型训练

如何实现自定义模型

1、构建模型(神经网络的前行传播)
该网络模型可以是DNN、CNN或者其他网络模型
2、定义损失函数
可以用keras中自带的损失函数,比如mse、categorical_crossentropy、sparse_categorical_crossentropy、binary_crossentropy等,也可以根据需求自定义损失函数
3、定义优化函数
可以使用keras中自带的优化器,比如ADAM、SGD、RMSprop等,也可以根据需求自定义优化函数
4、定义指标metrics
可以使用keras中自带的指标,也可以自定义指标,如下面代码中自定义的acc
5、定义tape
with tf.GradientTape() as tape:
6、得到模型输出
predictions= model(data)
7、前向传播得到loss
loss = loss_object(labels, predictions)
8、反向传播,求梯度
grads = tape.gradient(loss, model.trainable_variables)
9、用优化函数将计算出来的梯度更新到变量上面去
optimizer.apply_gradients(zip(grads, self.meta_model.trainable_variables))

import tensorflow as tf
from tensorflow.keras import *
class Model:
    def __init__(self):
        self.model= self.get_model()
    def get_model(self):
        n_hidden_1 = 500
        n_hidden_2 = 250
        n_hidden_3 = 120
        n_output = 16
        model = models.Sequential()
        model.add(layers.Dense(n_hidden_1, activation='relu', input_shape=(256,)))
        model.add(layers.Dense(n_hidden_2, activation='relu'))
        model.add(layers.Dense(n_hidden_3, activation='relu'))
        model.add(layers.Dense(n_output, activation='sigmoid'))
        model.summary()
        return model

    def train_model(self, train_data,optimizer):
    	with tf.GradientTape() as tape:
    		for samples1, labels1 in train_data:
        		predictions= self.model(samples, training=True) 
				loss = losses.binary_crossentropy(labels, predictions)          
				loss = tf.reduce_mean(loss)
				acc = tf.cast(tf.argmax(predictions, axis=-1) == query_label, tf.float32)
                acc = tf.reduce_mean(acc)
                # 使用GradientTape自动获取可训练变量相对于损失的梯度。
                grads = tape.gradient(loss, self.model.trainable_variables)  # 计算梯度
                optimizer.apply_gradients(zip(grads, self.model.trainable_variables))  # 更新梯度
        return loss, acc

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值