为什么要自定义模型
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