TensorFlow实现多输入源多输出

简介: TensorFlow实现多输入源多输出

TensorFlow实现多输入多输出模型

有时我们的输入数据不只一个,会存在多个输入源,多个输出源,对于这种情况我们使用Sequential显然是不行的,因为Sequential只能够搭建线性拓扑模型,对于那种流水线型的模型较为适合,如果是非线性拓扑,复杂的拓扑使用Sequential是不能够实现的,这是我们就需要使用Function API,它会使我们处理多输入多输出变得简单。

例如,如果您要构建一个系统,该系统按照优先级对自定义问题工单进行排序,然后将工单传送到正确的部门,则此模型将具有三个输入:

  • 工单标题(文本输入),
  • 工单的文本正文(文本输入),以及
  • 用户添加的任何标签(分类输入)

此模型将具有两个输出:

  • 介于 0 和 1 之间的优先级分数(标量 Sigmoid 输出),以及
  • 应该处理工单的部门(部门范围内的 Softmax 输出)。

您可以使用函数式 API 通过几行代码构建此模型:

定义输入源

模型的数据输入源有三个:标题输入、正文输入、标签输入

# 输入源
title_input = keras.Input(shape=(None,), name='title')
body_input = keras.Input(shape=(None,), name='body')
tags_input = keras.Input(shape=(num_tags,), name='tags')

定义层之间关系

首先需要将标题和正文的文本进行Embedding处理,然后使用长短期网络LSTM进行处理,然后将处理后的特征向量进行维度拼接,将三个输入源的特征向量进行拼接

title_features = Embedding(num_words, 64)(title_input)
body_features = Embedding(num_words, 64)(body_input)
title_features = LSTM(128)(title_features)
body_features = LSTM(128)(body_features)
x = Concatenate(axis=1)([title_features, body_features, tags_input])

定义输出源

定义两个输出源,第一个是预测优先级,所以Dense为1,另外一个是预测部分,需要使用softmax,所以维度是部门的数量

# 输出源
priority_pred = Dense(1, name='priority')(x)
department_pred = Dense(num_departments, name='department')(x)

构建模型

只需要指定模型的输入和输出,然后keras.Model会自动根据输入和输出之间的关系搭建出计算图拓扑

model = keras.Model(
    inputs=[title_input, body_input, tags_input],
    outputs=[priority_pred, department_pred]
)

编译模型

为不同的输出指定不同的损失函数,并且赋值不同的损失权重

model.compile(
    optimizer=keras.optimizers.RMSprop(1e-3),
    loss={
        'priority': keras.losses.BinaryCrossentropy(from_logits=True),
        'department': keras.losses.CategoricalCrossentropy(from_logits=True)
    },
    loss_weights=[1.0, 0.2]
)

定义数据集

title_data = np.random.randint(num_words, size=(1280, 10))
body_data = np.random.randint(num_words, size=(1280, 100))
tags_data = np.random.randint(2, size=(1280, num_tags)).astype('float32')
priority_targets = np.random.random(size=(1280, 1))
department_targets = np.random.randint(2, size=(1280, num_departments))

训练模型

model.fit(
    {'title': title_data, 'body': body_data, 'tags': tags_data},
    {'priority': priority_targets, 'department': department_targets},
    epochs=2,
    batch_size=32
)

完整代码

"""
 * Created with PyCharm
 * 作者: 阿光
 * 日期: 2022/1/1
 * 时间: 19:32
 * 描述:
"""
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import *
num_tags = 12
num_words = 10000
num_departments = 4
# 输入源
title_input = keras.Input(shape=(None,), name='title')
body_input = keras.Input(shape=(None,), name='body')
tags_input = keras.Input(shape=(num_tags,), name='tags')
title_features = Embedding(num_words, 64)(title_input)
body_features = Embedding(num_words, 64)(body_input)
title_features = LSTM(128)(title_features)
body_features = LSTM(128)(body_features)
x = Concatenate(axis=1)([title_features, body_features, tags_input])
# 输出源
priority_pred = Dense(1, name='priority')(x)
department_pred = Dense(num_departments, name='department')(x)
model = keras.Model(
    inputs=[title_input, body_input, tags_input],
    outputs=[priority_pred, department_pred]
)
keras.utils.plot_model(model, "multi_input_and_output_model.png", show_shapes=True)
model.compile(
    optimizer=keras.optimizers.RMSprop(1e-3),
    loss={
        'priority': keras.losses.BinaryCrossentropy(from_logits=True),
        'department': keras.losses.CategoricalCrossentropy(from_logits=True)
    },
    loss_weights=[1.0, 0.2]
)
title_data = np.random.randint(num_words, size=(1280, 10))
body_data = np.random.randint(num_words, size=(1280, 100))
tags_data = np.random.randint(2, size=(1280, num_tags)).astype('float32')
priority_targets = np.random.random(size=(1280, 1))
department_targets = np.random.randint(2, size=(1280, num_departments))
model.fit(
    {'title': title_data, 'body': body_data, 'tags': tags_data},
    {'priority': priority_targets, 'department': department_targets},
    epochs=2,
    batch_size=32
)


目录
相关文章
|
机器学习/深度学习 监控 算法
【tensorflow】连续输入的神经网络模型训练代码
【tensorflow】连续输入的神经网络模型训练代码
|
机器学习/深度学习 TensorFlow 算法框架/工具
【tensorflow】连续输入的线性回归模型训练代码
  get_data函数用于生成随机的训练和验证数据集。首先使用np.random.rand生成一个形状为(10000, 10)的随机数据集,来模拟10维的连续输入,然后使用StandardScaler对数据进行标准化。再生成一个(10000,1)的target,表示最终拟合的目标分数。最后使用train_test_split函数将数据集划分为训练集和验证集。
|
机器学习/深度学习 存储 自然语言处理
|
7月前
|
机器学习/深度学习 数据采集 TensorFlow
TensorFlow实战:构建第一个神经网络模型
【4月更文挑战第17天】本文简要介绍了如何使用TensorFlow构建和训练一个简单的神经网络模型,解决手写数字识别问题。首先,确保安装了TensorFlow,然后了解神经网络基础、损失函数和优化器以及TensorFlow的基本使用。接着,通过导入TensorFlow、准备MNIST数据集、数据预处理、构建模型(使用Sequential API)、编译模型、训练和评估模型,展示了完整的流程。这个例子展示了TensorFlow在深度学习中的应用,为进一步探索复杂模型打下了基础。
|
7月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
OpenCV读取tensorflow 2.X模型的方法:将SavedModel转为frozen graph
【2月更文挑战第22天】本文介绍基于Python的tensorflow库,将tensorflow与keras训练好的SavedModel格式神经网络模型转换为frozen graph格式,从而可以用OpenCV库在C++等其他语言中将其打开的方法~
153 1
OpenCV读取tensorflow 2.X模型的方法:将SavedModel转为frozen graph
|
7月前
|
数据采集 存储 安全
Python的输入:探索不同的输入方法和技巧
探索Python的不同输入方法,包括使用input()函数获取用户输入,处理输入错误,从文件中读取内容,使用sys.argv获取命令行参数,标准输入重定向,以及使用getpass模块安全获取密码。了解这些技巧有助于编写高效、健壮的程序。
140 3
|
7月前
|
机器学习/深度学习 自然语言处理 算法
python在Keras中使用LSTM解决序列问题
python在Keras中使用LSTM解决序列问题
Python-Tensorflow基础(三)-线性回归与非线性回归示例
Python-Tensorflow基础(三)-线性回归与非线性回归示例
163 0
Python-Tensorflow基础(三)-线性回归与非线性回归示例
|
机器学习/深度学习 TensorFlow API
TensorFlow实现多输入源多输出
有时我们的输入数据不只一个,会存在多个输入源,多个输出源,对于这种情况我们使用Sequential显然是不行的,因为Sequential只能够搭建线性拓扑模型,对于那种流水线型的模型较为适合,如果是非线性拓扑,复杂的拓扑使用Sequential是不能够实现的,这是我们就需要使用Function API,它会使我们处理多输入多输出变得简单。
682 0
TensorFlow实现多输入源多输出