前向传播网络实现(类与函数)——TensorFlow2.4

文章目录

  • 前言
  • 一、基于类的前向传播
  • 二、基于函数的前向传播
  • 总结


前言

最近开始着手语义分割方面的内容,由于刚开始入门深度学习,看了一下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)

最后需要将网络模型封装成一个可以用于训练和推理网络模型
在实现过程中比较容易出问题的地方就是模型的实例化,这里还不是太明白。。。。。。

你可能感兴趣的:(网络,深度学习,keras)