TensorFlow2学习(三):keras 函数api

2023-11-18


完整tensorflow2.0教程代码
官方教程

1构建简单的网络

1.1创建网络

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow import keras
inputs = tf.keras.Input(shape=(784,), name='img')
h1 = layers.Dense(32, activation='relu')(inputs)
h2 = layers.Dense(32, activation='relu')(h1)
outputs = layers.Dense(10, activation='softmax')(h2)
model = tf.keras.Model(inputs=inputs, outputs=outputs, name='mnist_model')

model.summary()
keras.utils.plot_model(model, 'mnist_model.png')
keras.utils.plot_model(model, 'model_info.png', show_shapes=True)

这里会报错
在这里插入图片描述
按照提示
第一步pip3 install pydot
graphviz不能用pip3安装,不然不能解决问题
下载安装包graphviz-2.38.msi
双击msi文件,然后一直选择next(默认安装路径为C:\Program Files (x86)\Graphviz2.38\),安装完成之后,会在windows开始菜单创建快捷信息。
配置环境变量:计算机→属性→高级系统设置→高级→环境变量→系统变量→path,在path中加入路径:C:\Program Files (x86)\Graphviz2.38\bin
验证:在windows命令行界面,输入dot -version,然后按回车,如果显示如下图所示的graphviz相关版本信息,则安装配置成功。
在这里插入图片描述
问题解决得到下面结果
在这里插入图片描述
在这里插入图片描述

1.2训练、验证及测试

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') /255
x_test = x_test.reshape(10000, 784).astype('float32') /255
model.compile(optimizer=keras.optimizers.RMSprop(),
             loss='sparse_categorical_crossentropy', # 直接填api,后面会报错
             metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.2)
test_scores = model.evaluate(x_test, y_test, verbose=0)
print('test loss:', test_scores[0])
print('test acc:', test_scores[1])

1.3模型保持和序列化

model.save('model_save.h5')
del model
model = keras.models.load_model('model_save.h5')

2 使用共享网络创建多个模型

在函数API中,通过在图层图中指定其输入和输出来创建模型。 这意味着可以使用单个图层图来生成多个模型。

# 编码器网络和自编码器网络

encode_input = keras.Input(shape=(28,28,1), name='img')
h1 = layers.Conv2D(16, 3, activation='relu')(encode_input)
h1 = layers.Conv2D(32, 3, activation='relu')(h1)
h1 = layers.MaxPool2D(3)(h1)
h1 = layers.Conv2D(32, 3, activation='relu')(h1)
h1 = layers.Conv2D(16, 3, activation='relu')(h1)
encode_output = layers.GlobalMaxPool2D()(h1)

encode_model = keras.Model(inputs=encode_input, outputs=encode_output, name='encoder')
encode_model.summary()

h2 = layers.Reshape((4, 4, 1))(encode_output)
h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
h2 = layers.Conv2DTranspose(32, 3, activation='relu')(h2)
h2 = layers.UpSampling2D(3)(h2)
h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
decode_output = layers.Conv2DTranspose(1, 3, activation='relu')(h2)

autoencoder = keras.Model(inputs=encode_input, outputs=decode_output, name='autoencoder')
autoencoder.summary()

可以把整个模型,当作一层网络使用

encode_input = keras.Input(shape=(28,28,1), name='src_img')
h1 = layers.Conv2D(16, 3, activation='relu')(encode_input)
h1 = layers.Conv2D(32, 3, activation='relu')(h1)
h1 = layers.MaxPool2D(3)(h1)
h1 = layers.Conv2D(32, 3, activation='relu')(h1)
h1 = layers.Conv2D(16, 3, activation='relu')(h1)
encode_output = layers.GlobalMaxPool2D()(h1)

encode_model = keras.Model(inputs=encode_input, outputs=encode_output, name='encoder')
encode_model.summary()

decode_input = keras.Input(shape=(16,), name='encoded_img')
h2 = layers.Reshape((4, 4, 1))(decode_input)
h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
h2 = layers.Conv2DTranspose(32, 3, activation='relu')(h2)
h2 = layers.UpSampling2D(3)(h2)
h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
decode_output = layers.Conv2DTranspose(1, 3, activation='relu')(h2)
decode_model = keras.Model(inputs=decode_input, outputs=decode_output, name='decoder')
decode_model.summary()

autoencoder_input = keras.Input(shape=(28,28,1), name='img')
h3 = encode_model(autoencoder_input)
autoencoder_output = decode_model(h3)
autoencoder = keras.Model(inputs=autoencoder_input, outputs=autoencoder_output,
                          name='autoencoder')
autoencoder.summary()

3.复杂网络结构构建

3.1多输入与多输出网络

# 构建一个根据文档内容、标签和标题,预测文档优先级和执行部门的网络
# 超参
num_words = 2000
num_tags = 12
num_departments = 4

# 输入
body_input = keras.Input(shape=(None,), name='body')
title_input = keras.Input(shape=(None,), name='title')
tag_input = keras.Input(shape=(num_tags,), name='tag')

# 嵌入层
body_feat = layers.Embedding(num_words, 64)(body_input)
title_feat = layers.Embedding(num_words, 64)(title_input)

# 特征提取层
body_feat = layers.LSTM(32)(body_feat)
title_feat = layers.LSTM(128)(title_feat)
features = layers.concatenate([title_feat,body_feat, tag_input])

# 分类层
priority_pred = layers.Dense(1, activation='sigmoid', name='priority')(features)
department_pred = layers.Dense(num_departments, activation='softmax', name='department')(features)


# 构建模型
model = keras.Model(inputs=[body_input, title_input, tag_input],
                    outputs=[priority_pred, department_pred])
model.summary()
keras.utils.plot_model(model, 'multi_model.png', show_shapes=True)
model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
             loss={'priority': 'binary_crossentropy',
                  'department': 'categorical_crossentropy'},
             loss_weights=[1., 0.2])

import numpy as np
# 载入输入数据
title_data = np.random.randint(num_words, size=(1280, 10))
body_data = np.random.randint(num_words, size=(1280, 100))
tag_data = np.random.randint(2, size=(1280, num_tags)).astype('float32')
# 标签
priority_label = np.random.random(size=(1280, 1))
department_label = np.random.randint(2, size=(1280, num_departments))
# 训练
history = model.fit(
    {'title': title_data, 'body':body_data, 'tag':tag_data},
    {'priority':priority_label, 'department':department_label},
    batch_size=32,
    epochs=5
)

3.2小型残差网络

inputs = keras.Input(shape=(32,32,3), name='img')
h1 = layers.Conv2D(32, 3, activation='relu')(inputs)
h1 = layers.Conv2D(64, 3, activation='relu')(h1)
block1_out = layers.MaxPooling2D(3)(h1)

h2 = layers.Conv2D(64, 3, activation='relu', padding='same')(block1_out)
h2 = layers.Conv2D(64, 3, activation='relu', padding='same')(h2)
block2_out = layers.add([h2, block1_out])

h3 = layers.Conv2D(64, 3, activation='relu', padding='same')(block2_out)
h3 = layers.Conv2D(64, 3, activation='relu', padding='same')(h3)
block3_out = layers.add([h3, block2_out])

h4 = layers.Conv2D(64, 3, activation='relu')(block3_out)
h4 = layers.GlobalMaxPool2D()(h4)
h4 = layers.Dense(256, activation='relu')(h4)
h4 = layers.Dropout(0.5)(h4)
outputs = layers.Dense(10, activation='softmax')(h4)

model = keras.Model(inputs, outputs, name='small resnet')
model.summary()
keras.utils.plot_model(model, 'small_resnet_model.png', show_shapes=True)
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train = x_train.astype('float32') / 255
x_test = y_train.astype('float32') / 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
             loss='categorical_crossentropy',
             metrics=['acc'])
model.fit(x_train, y_train,
         batch_size=64,
         epochs=1,
         validation_split=0.2)

#model.predict(x_test, batch_size=32)

4.共享网络层

share_embedding = layers.Embedding(1000, 64)

input1 = keras.Input(shape=(None,), dtype='int32')
input2 = keras.Input(shape=(None,), dtype='int32')

feat1 = share_embedding(input1)
feat2 = share_embedding(input2)

5.模型复用

from tensorflow.keras.applications import VGG16
vgg16=VGG16()

feature_list = [layer.output for layer in vgg16.layers]
feat_ext_model = keras.Model(inputs=vgg16.input, outputs=feature_list)

img = np.random.random((1, 224, 224, 3).astype('float32'))
ext_features = feat_ext_model(img)

6.自定义网络层

# import tensorflow as tf
# import tensorflow.keras as keras
class MyDense(layers.Layer):
    def __init__(self, units=32):
        super(MyDense, self).__init__()
        self.units = units
    def build(self, input_shape):
        self.w = self.add_weight(shape=(input_shape[-1], self.units),
                                 initializer='random_normal',
                                 trainable=True)
        self.b = self.add_weight(shape=(self.units,),
                                 initializer='random_normal',
                                 trainable=True)
    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b

    def get_config(self):
        return {'units': self.units}

inputs = keras.Input((4,))
outputs = MyDense(10)(inputs)
model = keras.Model(inputs, outputs)
config = model.get_config()
new_model = keras.Model.from_config(
config, custom_objects={'MyDense':MyDense}
)
# 在自定义网络层调用其他网络层

# 超参
time_step = 10
batch_size = 32
hidden_dim = 32
inputs_dim = 5

# 网络
class MyRnn(layers.Layer):
    def __init__(self):
        super(MyRnn, self).__init__()
        self.hidden_dim = hidden_dim
        self.projection1 = layers.Dense(units=hidden_dim, activation='relu')
        self.projection2 = layers.Dense(units=hidden_dim, activation='relu')
        self.classifier = layers.Dense(1, activation='sigmoid')
    def call(self, inputs):
        outs = []
        states = tf.zeros(shape=[inputs.shape[0], self.hidden_dim])
        for t in range(inputs.shape[1]):
            x = inputs[:,t,:]
            h = self.projection1(x)
            y = h + self.projection2(states)
            states = y
            outs.append(y)
        # print(outs)
        features = tf.stack(outs, axis=1)
        print(features.shape)
        return self.classifier(features)

# 构建网络
inputs = keras.Input(batch_shape=(batch_size, time_step, inputs_dim))
x = layers.Conv1D(32, 3)(inputs)
print(x.shape)
outputs = MyRnn()(x)
model = keras.Model(inputs, outputs)


rnn_model = MyRnn()
_ = rnn_model(tf.zeros((1, 10, 5)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow2学习(三):keras 函数api 的相关文章

随机推荐

  • Mpvue介绍

    Mpvue是什么 Mpvue是一个基于Vue的微信小程序前端框架 可以让我们用vue的语法写小程序的项目 简单来说就是 以前我们写微信小程序 必须借助微信小程序的开发者工具 微信开发工具提供的语法才能写小程序 Mpvue的出现 让我们可以先
  • Java开发之高并发必备篇(一)——线程基础

    提到高并发 这几年几乎是火遍编程界的网络名词了 无它 随着现在互联网的高速发展特别是电商平台类的应用快速发展 互联网服务内容也越来越丰富 用户越来越多 淘宝 天猫 京东 拼夕夕 抖音等几乎成为了广大群众每日必用的应用了 而在这些应用中见到的
  • Pocket PC 2003中文模拟器

    在用EVC中有自带的模拟器STANDSDK emulator 进行基于WinCE平台的开发时 Pocket PC 2003 SDK是必不可少的 在安装完PPC后可以安装其中文补丁第二版 这样模拟器所使用的就是中文操作系统界面了 如果没有安装
  • dbscan聚类python_20分钟学会DBSCAN聚类算法

    DBSCAN是一种非常著名的基于密度的聚类算法 其英文全称是 Density Based Spatial Clustering of Applications with Noise 意即 一种基于密度 对噪声鲁棒的空间聚类算法 直观效果上看
  • 利用python语言编程控制LEGO EV3

    1 环境搭建 安装WinSCP 网址 https sourceforge net projects winscp 下载一个自己喜欢的python IDE 例如pycharm 将EV3的系统换为ev3dev 参考网址 https www ev
  • 适合儿童学习的编程语言一览

    近两年我们常常会看到如下新闻 4 5岁的就能具备独立开发APP的能力 6 7岁的孩子甚至可以设计出可以上线的小游戏 在我们感慨小朋友们出色的编程能力的同时 不难发现编程已从边缘学科逐渐被大家重视 编程普及率不断提升 而且逐渐呈现出低龄化发展
  • python——常见ERROR汇总

    读取txt csv等数据时 UnicodeDecodeError gbk codec can t decode byte 0xbf in position 2 illegal multibyte sequence 释义 Unicode的解码
  • 80. 删除有序数组中的重复项 II

    Powered by NEFU AB IN Link 文章目录 80 删除有序数组中的重复项 II 题意 思路 代码 80 删除有序数组中的重复项 II 题意 给你一个有序数组 nums 请你 原地 删除重复出现的元素 使得出现次数超过两次
  • 和愚蠢的人打交道_如何与工作困难的人打交道

    和愚蠢的人打交道 Humans are social creatures who seek personal validation based on how others interact with them We feel good an
  • (转) serialVersionUID作用

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的 在进行反序列化时 JVM会把传来的字节流中的serialVersionUID与本地相应实体 类 的serialVersionUID进行比较 如果相
  • C++11 -- 包装器

    文章目录 function包装器 function包装器的概念 function的运用 function实例化 使用function解决逆波兰表达式 bind包装器 bind包装器相关介绍 bind调整函数形参传参顺序 bind绑定函数固定
  • 双机热备,如何用浮动IP跨网络访问异地服务

    环境是这样的 本地有两台服务器A B A 192 168 151 170 主 B 192 168 151 171 备 双机的浮动IP 192 168 151 174 承载网IP 10 182 254 164 异地服务端 172 16 122
  • python怎么去除字符串的空格、回车

    内容取此 str 123 456 print str strip 去除左右两边的空格 print str lstrip 去除左边的空格 print str rstrip 去除右边的空格 print str replace 去除字符串全部空格
  • ELK详解(十七)——filebeat输出到Redis和Elasticsearch实战

    今天继续给大家介绍Linux运维相关知识 本文主要内容是使用filebeat将日志输出到Redis和Elasticsearch的实战配置 在ELK详解 十六 filebeat安装与使用一文中 我们介绍了filebeat的安装 部署和简单应用
  • 基于SpringBoot-Dubbo的微服务快速开发框架

    简介 基于Dubbo的分布式 微服务基础框架 为前端提供脚手架开发服务 结合前一篇 Web AP快速开发基础框架 可快速上手基于Dubbo的分布式服务开发 项目代码 https github com backkoms web service
  • 微信小程序最新获取头像昵称方式

    前言 版本历史变迁 一 获取头像的正确姿势 二 获取昵称的正确姿势 总结 前言 产品需要获取微信用户的昵称和头像 这这还不简单 so easy 通过wx getUserProfile或者 wx getUserInfo 就可以获取到 但是获取
  • Nacos安装配置详细流程

    快速导航 1 Nacos安装 1 1概述 1 2 下载 1 3 安装 1 4 启动和关闭 1 5 测试 2 Nacos持久化 2 1为什么持久化 2 2配置Nacos持久化 2 2 1 切换数据库 2 2 2 初始化数据库 2 2 3 测试
  • tensorflow LeNet

    LeNet 即 LeNet5 由 Yann LeCun 在 1998 年提出 做为最早的卷积神经网络之一 是许 多神经网络架构的起点 其网络结构如图 下所示 借鉴点 共享卷积核 减少网络参数 在后期发展中 降采样层被 m a x p o o
  • HTML5 canvas 圆环扩散效果

    canvas 圆环扩散效果 使用 HTML5 canvas 制作圆环扩散的效果 以下是效果图 下面是实现代码 仅供参考 转载请注明出处 如有问题请联系 页面元素
  • TensorFlow2学习(三):keras 函数api

    文章目录 1构建简单的网络 1 1创建网络 1 2训练 验证及测试 1 3模型保持和序列化 2 使用共享网络创建多个模型 3 复杂网络结构构建 3 1多输入与多输出网络 3 2小型残差网络 4 共享网络层 5 模型复用 6 自定义网络层 完