欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

model

时间:2023-08-18
层和块

model - construction小结 model - construction

我们先回顾一下多层感知机

import tensorflow as tfnet = tf.keras.models.Sequential([ tf.keras.layers.Dense(256, activation=tf.nn.relu), tf.keras.layers.Dense(10),])X = tf.random.uniform((2, 20))net(X)

自定义块

class MLP(tf.keras.Model): # 用模型参数声明层。这里,我们声明两个全连接的层 def __init__(self): # 调用MLP的父类Model的构造函数来执行必要的初始化。 # 这样,在类实例化时也可以指定其他函数参数,例如模型参数params(稍后将介绍) super().__init__() # Hiddenlayer self.hidden = tf.keras.layers.Dense(units=256, activation=tf.nn.relu) self.out = tf.keras.layers.Dense(units=10) # Outputlayer # 定义模型的前向传播,即如何根据输入X返回所需的模型输出 def call(self, X): return self.out(self.hidden((X)))

实例化多层感知机的层,然后在每次调用前向传播函数时调用这些层

net = MLP()net(X)

顺序块

class MySequential(tf.keras.Model): def __init__(self, *args): super().__init__() self.modules = [] for block in args: # 这里,block是tf.keras.layers.Layer子类的一个实例 self.modules.append(block) def call(self, X): for module in self.modules: X = module(X) return X

当MySequential的前向传播函数被调用时, 每个添加的块都按照它们被添加的顺序执行。 现在可以使用我们的MySequential类重新实现多层感知机。

net = MySequential( tf.keras.layers.Dense(units=256, activation=tf.nn.relu), tf.keras.layers.Dense(10))net(X)

在前向传播函数中执行代码

class FixedHiddenMLP(tf.keras.Model): def __init__(self): super().__init__() self.flatten = tf.keras.layers.Flatten() # 使用tf.constant函数创建的随机权重参数在训练期间不会更新(即为常量参数) self.rand_weight = tf.constant(tf.random.uniform((20, 20))) self.dense = tf.keras.layers.Dense(20, activation=tf.nn.relu) def call(self, inputs): X = self.flatten(inputs) # 使用创建的常量参数以及relu和matmul函数 X = tf.nn.relu(tf.matmul(X, self.rand_weight) + 1) # 复用全连接层。这相当于两个全连接层共享参数。 X = self.dense(X) # 控制流 while tf.reduce_sum(tf.math.abs(X)) > 1: X /= 2 return tf.reduce_sum(X)net = FixedHiddenMLP()net(X)

混合搭配各种组合块的方法

class NestMLP(tf.keras.Model): def __init__(self): super().__init__() self.net = tf.keras.Sequential() self.net.add(tf.keras.layers.Dense(64, activation=tf.nn.relu)) self.net.add(tf.keras.layers.Dense(32, activation=tf.nn.relu)) self.dense = tf.keras.layers.Dense(16, activation=tf.nn.relu) def call(self, inputs): return self.dense(self.net(inputs))chimera = tf.keras.Sequential()chimera.add(NestMLP())chimera.add(tf.keras.layers.Dense(20))chimera.add(FixedHiddenMLP())chimera(X)

小结

一个块可以由许多层组成;一个块可以由许多块组成。块可以包含代码。块负责大量的内部处理,包括参数初始化和反向传播。层和块的顺序连接由Sequential块处理。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。