小言_互联网的博客

tensorflow2.0 建模教程 常用操作集合系列3—Model自定义模型的训练和参数调优loss gradient optimizer

548人阅读  评论(0)

推荐:
【tensorflow2.0最新建模教程】,如下:
tensorflow2.0教程 常用操作集合1—Layer自定义层的设计

常用操作集合系列2—Model自定义模型的设计

常用操作集合系列3—Model自定义模型的训练和参数调优loss gradient optimizer
常用操作集合系列4—损失函数正则化解决模型过拟合

在完成上篇tensorflow2.0 建模教程系列2 自定义模型的设计后,我们要灌入训练数据进行训练了,这就涉及到训练过程中最重要的损失函数、梯度下降和调参调优。
在tf2.0版本中,最重要的图计算方法 with tape.GradientTape() as tape,可以设计完成整个过程。

1损失函数我们可以用loss_fn表达:

loss_fn=tf.keras.losses.categorical_crossentropy(from_logits=True)

2选取优化器

optimizer=tf.keras.optimizers.SGD(learning_rate=1e-3)

3梯度计算:

#梯度和权重:
tape.gradient(loss,model.trainable_weights)

4参数调优:


optimizer.apply_gradients(zip(gradients,model.trainable_weights))

完整代码示例如下:

#数据预处理函数定义与调用
def process(x,y):
    x=tf.cast(x,dtype=tf.float32)/255
    x=tf.reshape(x,[-1,28*28])
    y=tf.one_hot(y,depth=10)
    return x,y


#模型自定义设计
Class Dropout(Layer):
    def _init_(self,rate):
        super(Dropout,self)._init_()
        self.rate=rate
    @tf.function#function装饰器可以用来在函数中增加'if'等条件或者'for'循环控制流
    def call(self,input,training=None):
        if training:
            return tf.nn.dropout(input,self.rate)
        return input 
    
Class Model(keras.Model):
    def _init_(self):
        super(Model,self)._init_()
        self.layer1=Mydense(32)
        self.layer2=Mydense(32)
        self.dropout2=Dropout(0.3)
        self.layer3=Mydense(10)
        self.dropout3=Dropout(0.3)
   def call(self,input):
       x=self.layer1(input)
       x=tf.nn.relu(x)
       x=self.layer2(x)
       x=self.dropout1(x)
       x=tf.nn.relu(x)
       x=self.layer3(x)
       x=self.dropout2(x)
       x=tf.nn.relu(x)
       return x



#prepare data数据准备
(x_train,y_train),(x_test,y_test)=tf.keras.datasets.mnist.loaddata()

dataset=tf.data.Dataset.from_tensor_slices((x_train,y_train))

dataset=dataset.shuffle(12000).batch(128).map(preprocess).repeat(30)

model=Model()

#损失函数和优化器设定
loss_fn=tf.keras.losses.CategoriCrossentropy(from_logits=True)
optimizer=tf.keras.optimizers.SGD(learning_rate=1e-3)

#开始训练与调优
for step,(x,y) in enumerate(dataset):
    with tape.GradientTape() as tape:
        logits=model(x)
        loss=loss_fn(logits,y)
        gradients=tape.gradient(loss,model.trainable_weights)
        optimizer.apply_gradients(zip(gradients,model.trainable_weights))
    if step%100=0:
        print(step,float(loss))

持续更新深度学习算法项目实战代码,如果您感兴趣,欢迎关注《深度学习算法攻城狮》,十分钟教你学会敲出AI聊天机器人@~@


转载:https://blog.csdn.net/weixin_37479258/article/details/100868608
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场