TensorFlow:自定义类

在创建自定义网络层类时,需要继承自layers.Layer 基类;创建自定义的网络类,需要继承自 keras.Model 基类,这样产生的自定义类才能够方便的利用Layer/Model 基类提供的参数管理功能,同时也能够与其他的标准网络层类交互使用。

一、自定义网络层

对于自定义的网络层,需要实现初始化 __inti__方法和前向传播逻辑call方法
假设我们需要一个没有偏置的全连接层,即bias 为0,同时固定激活函数为ReLU 函数。

class MyDense(layers.Layer):
	# 自定义网络层
	def __init__(self, inp_dim, outp_dim):
	super(MyDense, self).__init__()
	# 创建权值张量并添加到类管理列表中,设置为需要优化
	self.kernel = self.add_variable('w', [inp_dim, outp_dim],trainable=True)
net = MyDense(4,3) #创建输入为4,输出为3节点的自定义层
print(net.variables,net.trainable_variables)

在这里插入图片描述
通过修改为self.kernel = self.add_variable('w', [inp_dim, outp_dim], trainable=False),我们可以设置张量不需要被优化,此时再来观测张量的管理状态:
在这里插入图片描述
看出此时张量并不会被 trainable_variables管理

完成自定义类的初始化工作后,可以设计自定义类的前项运算逻辑

def call(self, inputs, training=None):
	# 实现自定义类的前向计算逻辑
	# X@W
	out = inputs @ self.kernel
	# 执行激活函数运算
	out = tf.nn.relu(out)
	return out

如上所示,自定义类的前向运算逻辑需要实现在call(inputs, training)函数中,其中inputs 代表输入,由用户在调用时传入;training 参数用于指定模型的状态:training 为True 时执行训练模式,training 为False 时执行测试模式,默认参数为None,即测试模式。由于全连接层的训练模式和测试模式逻辑一致,此处不需要额外处理。对于部份测试模式和训练模式不一致的网络层,需要根据training 参数来设计需要执行的逻辑。

二、自定义网络

在完成了我们自定义的全连接层类之后,我们基于上述的“无偏置的全连接层”来实
现MNIST 手写数字图片模型的创建。
自定义的类可以和其他标准类一样,通过Sequential 容器方便地包裹成一个网络模
型:

network = keras.Sequential([MyDense(784, 256), # 使用自定义的层
    MyDense(256, 128),
    MyDense(128, 64),
    MyDense(64, 32),
    MyDense(32, 10)])
network.build(input_shape=(None, 28*28))
network.summary()

更普遍地,我们可以继承基类来实现任意逻辑的自定义网络类。下面我们来创建自定义网络类,首先创建并继承Model 基类,分布创建对应的网络层对象:

# 自定义网络类,继承自Model 基类
def __init__(self):
	super(MyModel, self).__init__()
	# 完成网络内需要的网络层的创建工作
	self.fc1 = MyDense(28*28, 256)
	self.fc2 = MyDense(256, 128)
	self.fc3 = MyDense(128, 64)
	self.fc4 = MyDense(64, 32)
	self.fc5 = MyDense(32, 10)
#然后实现自定义网络的前向运算逻辑:
def call(self, inputs, training=None):
	# 自定义前向运算逻辑
	x = self.fc1(inputs)
	x = self.fc2(x)
	x = self.fc3(x)
	x = self.fc4(x)
	x = self.fc5(x)
	return x

这个例子可以直接使用第一种方式通过Sequential 容器包裹。但是由于Sequential 在前向传播是依次调用每个网络层的前向传播函数,灵活性一般,而自定义网络的前向逻辑可以任意定制,两者各有优缺点

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当使用 TensorFlow 开发深度学习模型时,有时需要自己定义模型类。下面是一个简单的例子,展示如何使用 TensorFlow定义模型类。 假设我们要定义一个简单的全连接神经网络,包含一个隐藏层和一个输出层。这个神经网络的输入是一个大小为 n 的向量,输出是一个大小为 m 的向量。我们可以按照以下步骤来定义这个模型类: 1. 导入 TensorFlow 和其他必要的库: ```python import tensorflow as tf from tensorflow.keras.layers import Dense ``` 2. 定义模型类,并继承 `tf.keras.Model` 类: ```python class MyModel(tf.keras.Model): def __init__(self, n, m, hidden_units): super(MyModel, self).__init__() self.hidden_layer = Dense(hidden_units, activation='relu') self.output_layer = Dense(m, activation='softmax') ``` 在这个模型类中,我们定义了两个成员变量 `hidden_layer` 和 `output_layer`,分别表示隐藏层和输出层。这两个层都是 `Dense` 层,其中隐藏层的激活函数是 ReLU,输出层的激活函数是 Softmax。 3. 实现 `call` 方法,定义前向传播过程: ```python def call(self, inputs): x = self.hidden_layer(inputs) return self.output_layer(x) ``` 在这个方法中,我们首先将输入传递给隐藏层,然后将隐藏层的输出传递给输出层,最终返回输出层的输出。 4. 创建模型对象: ```python model = MyModel(n=10, m=5, hidden_units=20) ``` 在创建模型对象时,我们需要指定模型的输入大小 n、输出大小 m,以及隐藏层的神经元数 hidden_units。 5. 编译模型: ```python model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 在编译模型时,我们需要指定优化器、损失函数和评估指标。 6. 训练模型: ```python model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val)) ``` 在训练模型时,我们需要指定训练数据、训练轮数、批次大小和验证数据。 这就是使用 TensorFlow定义模型类的基本步骤。你可以根据自己的需求自定义不同的模型类,并在实际应用中使用它们。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值