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来说还是更简单一点点的,所以尽快过一遍

目录
相关文章
|
8天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
11天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
32 1
|
14天前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
18 4
|
1月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
2月前
|
存储 消息中间件 前端开发
Web2py框架下的神秘力量:如何轻松集成第三方API,让你的应用不再孤单!
【8月更文挑战第31天】在开发现代Web应用时,常需集成第三方服务如支付网关、数据存储等。本文将指导你使用Web2py框架无缝接入第三方API。通过实例演示从注册获取API密钥、创建控制器、发送HTTP请求到处理响应的全过程。利用`requests`库与Web2py的内置功能,轻松实现API交互。文章详细介绍了如何编写RESTful控制器,处理API请求及响应,确保数据安全传输。通过本教程,你将学会如何高效整合第三方服务,拓展应用功能。欢迎留言交流心得与建议。
37 1
|
2月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
2月前
|
Java Spring API
Spring框架与GraphQL的史诗级碰撞:颠覆传统,重塑API开发的未来传奇!
【8月更文挑战第31天】《Spring框架与GraphQL:构建现代API》介绍了如何结合Spring框架与GraphQL构建高效、灵活的API。首先通过引入`spring-boot-starter-data-graphql`等依赖支持GraphQL,然后定义查询和类型,利用`@GraphQLQuery`等注解实现具体功能。Spring的依赖注入和事务管理进一步增强了GraphQL服务的能力。示例展示了从查询到突变的具体实现,证明了Spring与GraphQL结合的强大潜力,适合现代API设计与开发。
59 0
|
2月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
74 0
|
2月前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
44 0
|
2月前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
44 0
下一篇
无影云桌面