前言
最近开始着手语义分割方面的内容,由于刚开始入门深度学习,看了一下deeplab的源码,里面所有网络结构基本上都是由类进行定义的(目的是为了方便复用),而大部分博主的复现代码基本上都是基于函数实现,作为小白的我一时有点蒙圈。为了更好地理解前向传播吧以及类与函数定义的网络结构,本文分别用类核函数实现了简单的前向传播函数
提示:以下是本篇文章正文内容,下面案例可供参考
一、基于类的前向传播
python是面向对象的语言,然后巴拉巴拉。。。
用类定义网络,可以理解为定义了一个网络变量,不同的变量进行组合就构成了各式各样的复杂 网络结构
由类定义的前向传播网络代码示例如下(示例):
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential
class Network(keras.Model):
def __init__(self):
super(Network, self).__init__()
# 创建三个前向传播网络
self.fc1 = layers.Dense(64,activation="relu")
self.fc2 = layers.Dense(64,activation="relu")
self.fc3 = layers.Dense(1)
def call(self, inputs, training = None, mask = None):
x = self.fc1(inputs)
x = self.fc2(x)
x = self.fc3(x)
return x
model = Network()
model.build(input_shape=(4,9))
model.summary()
二、基于函数的前向传播
函数大家都经常用,输入-功能-输出
由函数实现的前向传播网络代码如下(示例):
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import Model
def Network(input_shape=(256,256,3)):
inputs = layers.Input(input_shape)
fc1 = layers.Dense(64,activation="relu")(inputs)
fc2 = layers.Dense(64,activation="relu")(fc1)
fc3 = layers.Dense(1)(fc2)
return Model(inputs =inputs,outputs = fc3)
model = Network()
model.summary()
总结
我们可以发现类定义的网络结构,首先继承了keras.Model类(将网络层封装成一个用于训练和推理的模型),然后对Network类进行初始化,包括定义每一层的网络类型,以及网络传播形式(call),定义传播形式的需要定义输入input。将模型实例化时,需要先进行根据输入的shape构建模型,然后才能打印模型:model = Network()
model.build(input_shape=(4,9))
model.summary()
由函数定义的前向传播网络就比较简单啦,首先定义函数名,输入,然后按照网络结构传播变量,这里面卷积函数处理的变量必须为tensor类型即:
inputs = layers.Input(input_shape)
最后需要将网络模型封装成一个可以用于训练和推理网络模型
在实现过程中比较容易出问题的地方就是模型的实例化,这里还不是太明白。。。。。。