【Tensorflow2.0】keras.models.Sequential() 和Model()模块

文章介绍了在Tensorflow和Keras中,如何使用Sequential模型和Model类来构建深度学习网络。Sequential模型适用于简单的层堆叠,而Model类则支持更复杂的拓扑结构,如多输入多输出的网络。Model通过定义输入和输出张量来构建网络,而继承自Model的类允许自定义网络行为,类似于Pytorch中的forward函数。
摘要由CSDN通过智能技术生成

1 功能

  在读tensorflow代码时经常看到使用Model定义模型,这与在Pytorch中经常使用的使用继承模型有区别,所以这里就记录一下。
在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model)。差异在于不同的拓扑结构。
  在序列模型中,就如同Pytorch中的用法一样,看下面代码:

from keras.models import Sequential
from keras.layers import Dense, Activation
 
layers = [Dense(32, input_shape = (784,)),
   Activation('relu'),
   Dense(10),
   Activation('softmax')] 
model = Sequential(layers)

# 或者逐层添加网络结构,代码如下:
from keras.models import Sequential
from keras.layers import Dense, Activation
 
model = Sequential()
model.add(Dense(32, input_shape = (784,)))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

  如果我们像实现一些更为复杂的网络,比如多输入多输出的模型就需要使用到keras.models.Model()来构建网络。如下代码同时输出最后卷积层Flatten后提取的特征层,以及分类结构。

  流程使用keras.Input定义输入张量shape, 创建网络层;定义每层的输入和输出张量;keras.models.Model确定输入张量和输出层,keras可以根据每一层的输入输出关系完成整个网络图的创建。

  个人理解,Model模块其实就是调用之前定义的函数层,主要就是注意的就是Model函数中的Input和outputs的输入,这个地方要注意理解。

import tensorflow as tf
from tensorflow.keras import layers, models, Input

input_tensor = Input(shape=(32, 32, 3))

x = layers.Conv2D(32, (3, 3), activation='relu')(input_tensor)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)

output_tensor1=layers.Flatten()(x)
x = layers.Dense(64, activation='relu')(output_tensor1)

output_tensor2 = layers.Dense(10, activation='softmax')(x)

model = models.Model(inputs=input_tensor, outputs=[output_tensor1, output_tensor2])

model.summary()

继承类:这个跟Pytorch的使用方法一致,call函数相当于forward。

import  tensorflow as tf
from    tensorflow import keras
from    tensorflow.keras import layers
from    tensorflow.keras.models import Model

class MyNet(Model):

    def __init__(self):
        super(MyNet, self).__init__()
        self.conv1 = layers.Conv2D(32, (3, 3), activation='relu')
        self.pool1 = layers.MaxPooling2D((2, 2))
        
        self.conv2 = layers.Conv2D(64, (3, 3), activation='relu')
        self.pool2 = layers.MaxPooling2D((2, 2))

        self.conv3 = layers.Conv2D(64, (3, 3), activation='relu')
        self.flatten = layers.Flatten()
        
        self.fc1 = layers.Dense(64, activation='relu')
        self.fc2 = layers.Dense(10, activation='softmax')
        
    def call(self, inputs):
        
        out = self.conv1(inputs)
        out = self.pool1(out)
        
        out = self.conv2(out)
        out = self.pool2(out)
        
        out = self.conv3(out)
        out = self.flatten(out)
        
        out = self.fc1(out)
        out = self.fc2(out)
        
        return out

def main():
    
    model = MyNet()
    model.build(input_shape=(None,32, 32,3))
    model.summary()

if __name__ == '__main__':
    main()

2 参考文献

[1]Keras中的两种模型:Sequential和Model用法
[2]Tensorflow 2.0 keras.models.Sequential() Model() 创建网络的若干方式 及共享权重问题

如果在使用from tensorflow.keras.models import Sequential时出现了keras报错,可以尝试使用tensorflow.keras来导入。具体代码修改为from tensorflow.keras import Sequential。这样可以解决module 'tensorflow' has no attribute 'get_default_graph'的报错。\[1\] #### 引用[.reference_title] - *1* [keras.models导入Sequential错误](https://blog.csdn.net/weixin_43582101/article/details/117079573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [安装了tensorflow导入keras报错](https://blog.csdn.net/xiaofeixia002X/article/details/128196908)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [生成对抗网络 图像生成_用生成对抗网络在10分钟内生成图像](https://blog.csdn.net/weixin_26715991/article/details/108958622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值