TensorFlow2框架使用---中高阶API的使用

简介: TensorFlow2框架使用---中高阶API的使用

Tensorflow中高阶API的使用


1. 构建数据管道


当数据量不大时,我们可以一次全部载入内存中训练;但是如果数据量很大,我们就要考虑将数据分批次载入内存中训练,这个时候就要利用数据管道。构建数据管道的途径有很多,下面介绍几种常见的数据格式构建数据管道的方式。


1.1 numpy的ndarray构建


data=tf.data.Dataset.from_tensor_slices((iris['data'],iris['target']))
# 从data中拿三条数据
for feature,label in data.take(3):
    print(feature,label)
# 设置batch_size=x,每次取出一个batch
for feature,label in data.batch(32):
    print(feature,label)
复制代码

1.2 从DataFrame构建


data=pd.DataFrame(iris['data'],columns=iris.feature_names)
data=tf.data.Dataset.from_tensor_slices((data.to_dict('list'),iris['target']))
for f,l in data.take(1):
    print(f,l)
复制代码

1.3 生成器构建


from tensorflow.keras.preprocessing.image import ImageDataGenerator
image_generator=ImageDataGenerator().flow_from_directory("Path")
# 定义一个生成器函数
def generator():
    for f,l in image_generator:
        yield (f,l)
data=tf.data.Dataset.from_generator(generator,output_types=(...))
复制代码

1.4 文本文件构建


# 从cvs文件构建
data=tf.data.experimental.make_csv_dataset(file_pattern="...",label_name="xxx",batch_size=xx)
# 从文本文件构建
data=tf.data.TextLineDataset(filenames="xxx")
复制代码

1.5 从文件路径构建


data=tf.data.Dataset.list_files("xxx/*.jpg")
复制代码

2. 构建模型


定义模型有三种方式,顺序式、函数式、自定义,最简单易用的就是顺序式,只需要像搭积木那样对model不停地添加就好;但是如果面对模型具有残差结构或者其他非顺序式结构,这个时候就需要函数式建模方式;自定义建模主要针对某些网络模块需要自己实现,这个时候就利用自定义方式搭建;下面就用iris数据集利用三种不同方式构建模型。

准备工作


import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from tensorflow.keras import models,layers,optimizers,losses
from sklearn.model_selection import train_test_split
import os
from datetime import datetime
os.environ['TF_CPP_MIN_LOG_LEVEL']='1'
plt.rcParams['font.sans-serif']='simhei'
plt.rcParams['axes.unicode_minus']=False
data,target=datasets.load_iris()['data'],datasets.load_iris()['target']
X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.3,random_state=0)
def plot_metric(history,metric):
    train_metric=history.history[metric]
    val_metric=history.history['val_'+metric]
    X=[i for i in range(1,len(train_metric)+1)]
    plt.plot(X,train_metric,'bo--',label="train_"+metric)
    plt.plot(X,val_metric,'ro-',label="val_"+metric)
    plt.title("训练-测试"+metric)
    plt.xlabel("Epochs")
    plt.ylabel(metric)
    plt.legend()
    plt.show()
复制代码

2.1 顺序模型


model1=models.Sequential()
model1.add(layers.Dense(10,input_shape=(4,),activation='relu'))
model1.add(layers.Dense(10,activation='relu'))
model1.add(layers.Dense(3,activation='softmax'))
model1.compile(
    optimizer=optimizers.Adam(0.01),
    loss=losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)
model1.summary()
复制代码


开始训练


logdir1='./model/model1/'+datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback1 = tf.keras.callbacks.TensorBoard(logdir1, histogram_freq=1)
history=model1.fit(
    X_train,y_train,
    validation_data=(X_test,y_test),epochs=20,
    callbacks=[tensorboard_callback1]
)
plot_metric(history,"accuracy")
复制代码


image.png

2.2 函数式模型


inputs=layers.Input(shape=(4,))
branch1=layers.Dense(10,activation='relu')(inputs)
branch1=layers.Dense(10,activation='relu')(branch1)
branch2=layers.Dense(10,activation='relu')(inputs)
branch2=layers.Dense(10,activation='relu')(branch2)
concat=layers.Concatenate()([branch1,branch2])
branch3=layers.Dense(10,activation='relu')(concat)
outputs=layers.Dense(3,activation='softmax')(branch3)
model2=models.Model(inputs=inputs,outputs=outputs)
model2.compile(
    optimizer=optimizers.Adam(0.01),
    loss=losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)
model2.summary()
logdir2='./model/model2/'+datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback2 = tf.keras.callbacks.TensorBoard(logdir2, histogram_freq=1)
history=model2.fit(
    X_train,y_train,
    validation_data=(X_test,y_test),epochs=15,
    callbacks=[tensorboard_callback2]
)
复制代码


模型有两个分支然后合并,长这个样子


image.png

image.png

这里只是为了演示非序列式模型,其实这种结构对于这个问题是没有必要的。

image.png

2.3 自定义模型


先定义子结构


class Block(layers.Layer):
    def __init__(self,**kwargs):
        super(Block,self).__init__(**kwargs)
    def build(self,input_shape):
        self.a=layers.Dense(20,activation='relu')
        self.b=layers.Dense(10,activation='relu')
        super(Block,self).build(input_shape)
    def call(self,inputs):
        x=self.a(inputs)
        x=self.b(x)
        return x
    def get_config(self):
        config=super(Block,self).get_config()
        return config
# 测试   
block=Block()
block.build(input_shape=(None,4,))
block.compute_output_shape(input_shape=(None,4,))
复制代码


类似于残差结构,我们可以使用自己自定义的结构来构建模型,不过这样很容易出错,后期网络搭建的时候调试也不方便。


所以我们定义好之后可以先试试输出的shape与我们预期是否一致

image.png

然后利用自定义的结构再构建网络


class Model3(models.Model):
    def __init__(self):
        super(Model3,self).__init__()
    def build(self,input_shape):
        self.block1=Block()
        self.block2=Block()
        self.dense=layers.Dense(3,activation='softmax')
        super(Model3,self).build(input_shape)
    def call(self,x):
        x=self.block1(x)
        x=self.block2(x)
        x=layers.Flatten()(x)
        x=self.dense(x)
        return x
model3=Model3()
model3.build(input_shape=(None,4))
model3.compile(
    optimizer=optimizers.Adam(0.01),
    loss=losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)
model3.summary()
复制代码


image.png


结束


到这里,关于Tensorflow使用的部分就暂时告一段落了。这个专栏由于更多是为了留给自己复习看的,所以并没有方方面面都涉及到,比如早停、学习率动态调整、常用的卷积层、特征变换……这些很常用但是我没有讲,后期涉及到的时候会慢慢把相关的例子补上。接下来就是pytorch相关的,这个相对于Tensorflow来说还是更简单一点点的,所以尽快过一遍

目录
相关文章
|
1月前
|
API
用 Koa 框架实现一个简单的 RESTful API
用 Koa 框架实现一个简单的 RESTful API
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3
|
1月前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
26 2
|
1月前
|
JSON JavaScript 中间件
Koa框架下的RESTful API设计与实现
在现代 Web 开发中,构建高效、可维护的 API 是至关重要的。Koa 是一个流行的 Node.js Web 应用框架,它具有简洁、灵活和强大的特性,非常适合用于设计和实现 RESTful API。
|
1月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
46 2
|
1月前
|
API PHP 数据库
PHP中哪个框架最适合做API?
在数字化时代,API作为软件应用间通信的桥梁至关重要。本文探讨了PHP中适合API开发的主流框架,包括Laravel、Symfony、Lumen、Slim、Yii和Phalcon,分析了它们的特点和优势,帮助开发者选择合适的框架,提高开发效率、保证接口稳定性和安全性。
61 3
|
1月前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
49 4
|
1月前
|
安全 API 数据库
Python哪个框架合适开发淘宝商品详情api?
在数字化商业时代,开发淘宝商品详情API成为企业拓展业务的重要手段。Python凭借其强大的框架支持,如Flask、Django、Tornado和FastAPI,为API开发提供了多样化的选择。本文探讨了这些框架的特点、优势及应用场景,帮助开发者根据项目需求选择最合适的工具,确保API的高效、稳定与可扩展性。
30 0
|
1月前
|
安全 API 网络架构
Python中哪个框架最适合做API?
本文介绍了Python生态系统中几个流行的API框架,包括Flask、FastAPI、Django Rest Framework(DRF)、Falcon和Tornado。每个框架都有其独特的优势和适用场景。Flask轻量灵活,适合小型项目;FastAPI高性能且自动生成文档,适合需要高吞吐量的API;DRF功能强大,适合复杂应用;Falcon高性能低延迟,适合快速API开发;Tornado异步非阻塞,适合高并发场景。文章通过示例代码和优缺点分析,帮助开发者根据项目需求选择合适的框架。
139 0