深度学习笔记33_函数式API及多输入模型的建立

Posted 瓦力人工智能

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习笔记33_函数式API及多输入模型的建立相关的知识,希望对你有一定的参考价值。

函数式API简介

函数式API

所谓函数式API就是可以把层当作函数来使用.具体来说就是:

  • 可以直接操作张量tensor

  • 也可以接受张量

  • 可以返回张量

这里我们想象一下在任何编程语言的函数使用情况:

  • 例如 void func1(int a) C++/C#等语言的函数形式

  • 有一个返回值,即使返回值值为空

  • 能够传入参数,即使有的时候也可以不接受任何参数,但是括号得保持

  • 可以对传入的参数进行处理。

对应起来跟这里所说的函数式API是不是很像,具体的例子如下:

  • 网络层的实例是可调用的,它以张量为参数,并且返回一个张量

  • 输入和输出均为张量

函数式API实例

下面来看一个关于Sequential模型的函数API的实现。

# 关于函数API的简介

from keras import Input,layers

# 定义了 一个输入张量,Input 函数返回一个张量
input_tensor = Input(shape=(32,))
# 定义了一个层,这里我们理解为一个函数
# dense就这个函数的名字
dense = layers.Dense(32,activation='relu')
# dense 函数可以调用一个层,返回值也是一个张量
# 网络层的实例是可调用的,它以张量为参数,并且返回一个张量
output_tensor = dense(input_tensor)
# Sequential模型常规写法

from keras.models import Sequential,Model
from keras import layers
from keras import Input

seq_model = Sequential()
seq_model.add(layers.Dense(32,activation='relu',input_shape=(784,)))
seq_model.add(layers.Dense(32,activation='relu'))
seq_model.add(layers.Dense(10,activation='softmax'))

seq_model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================

dense_4 (Dense)              (None, 32)                25120     
_________________________________________________________________
dense_5 (Dense)              (None, 32)                1056      
_________________________________________________________________
dense_6 (Dense)              (None, 10)                330       
=================================================================

Total params: 26,506
Trainable params: 26,506
Non-trainable params: 0
_________________________________________________________________

# 使用函数API来构建Sequential 模型

input_tensor = Input(shape=(784,))
x = layers.Dense(32,activation='relu')(input_tensor)
x = layers.Dense(32,activation='relu')(x)
output_tensor = layers.Dense(10,activation='softmax')(x)

# Model 类将输入张量和输出张量转换为一个模型
model = Model(input_tensor,output_tensor)
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================

input_1 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_7 (Dense)              (None, 32)                25120     
_________________________________________________________________
dense_8 (Dense)              (None, 32)                1056      
_________________________________________________________________
dense_9 (Dense)              (None, 10)                330       
=================================================================

Total params: 26,506
Trainable params: 26,506
Non-trainable params: 0
_________________________________________________________________

Model对象的实例化

将 Model 对象实例化只用了一个输入张量和一个输出张量。
Keras 会在后台检索从 input_tensor 到 output_tensor 所包含的每一层,并将这些层组合成一个类图的数据结构,即一个 Model。
当然,这种方法有效的原因在于,output_tensor 是通过对 input_tensor 进行多次变换得到的。

关于模型的编译,训练和评估就跟以前的方式一致。

model.compile(optimizer='rmsprop',
             loss='categorical_crossentropy')

import numpy as np
x_train = np.random.random((1000,784))
y_train = np.random.random((1000,10))

model.fit(x_train,
         y_train,
         epochs=10,
         batch_size=128)

score = model.evaluate(x_train,y_train)

多输入模型的建立

多输入的合并

函数API的一个应用,就是构建多输入的模型。在模型的某一层,将组合多个tensor,合并成一个张量。主要的用到的方法是:

  • 相加:keras.layers.add

  • 连接:keras.layers.concatenate

    • `keras.layers.concatenate(inputs, axis=-1)`

    • 它接受一个张量的列表, 除了连接轴之外,其他的尺寸都必须相同,

    • 然后返回一个由所有输入张量连接起来的输出张量。

多输入的问答模型的构建

我们需要解决的问题是利用自然语言描述的问题和一个辅助的文本片段进行来回答问题,这里为了简单起见,只需要用一个词来回答即可.

模型的架构如下图:

问答模型结构

具体的coding如下:

from keras.models import Model
from keras import layers
from keras import Input

# 最常用词频率 前 10 000/500 个最常见的单词
text_vocabulary_size = 10000
question_vocabulary_size = 10000
answer_vocabulary_size = 500

# shape = (None,) 表示输入的长度是可变的
# 输入的格式类型是:整数序列
# name='text' 对输入进行命名
text_input = Input(shape=(None,),dtype='int32',name='text')

# 将输入嵌入维度为64的向量
embedded_text = layers.Embedding(
            text_vocabulary_size,64)(text_input)

# LSTM编码,输出为32的维度空间
encoded_text = layers.LSTM(32)(embedded_text)

question_input = Input(shape=(None,),
                          dtype = 'int32',
                      name='question')

embedded_qeustion = layers.Embedding(
            question_vocabulary_size,32)(question_input)
encoded_qeustion = layers.LSTM(16)(embedded_qeustion)

# concatenate 函数将两者的数据连接起来
concatenated = layers.concatenate([encoded_text,encoded_qeustion],axis=-1)

# 然后对上面的数进行分类
answer = layers.Dense(answer_vocabulary_size,activation='softmax')(concatenated)

# 模型的定一个和编译
# 在模型编译的时候,需要用一个tensor 裂变来指定相应的两个输入
model = Model([text_input,question_input],answer)

model.compile(optimizer='rmsprop',
             loss='categorical_crossentropy',
             metrics=['acc'])

这里还需要考虑的一点,是模型训练的时候需要传入的两个输入的问题.这里可以参考上面的Model的定义:

  • 一种做法是输入一个列表:由Numpy 数组组成的列表

  • 另外一种是输入一个字典:将输入名称与之对应的Numpy
    具体coding 如下:

import numpy as np

num_samples = 1000
max_length = 100

# 生成虚构的数据
text = np.random.randint(1,text_vocabulary_size,
                        size = (num_samples,max_length))

question = np.random.randint(1,question_vocabulary_size,
                            size = (num_samples,max_length))

answers = np.random.randint(answer_vocabulary_size,size=(num_samples))
# 转成one-hot编码
answers = keras.utils.to_categorical(answers, answer_vocabulary_size)

# 输入一个列表:由Numpy 数组组成的列表
model.fit([text,question],answer,epochs = 10,batch_size = 128)
# 输入一个字典:将输入名称与之对应的Numpy
model.fit({'text': text, 'question': question}, answers, epochs=10, batch_size=128

分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

瓦力人工智能 - 扫码上车


以上是关于深度学习笔记33_函数式API及多输入模型的建立的主要内容,如果未能解决你的问题,请参考以下文章

深度学习笔记34_函数式API之多输出模型构建

深度学习笔记35_函数式API之Inception/Resnet网络构建

如何使用Keras函数式API进行深度学习?

深度学习-Tensorflow Keras使用函数式API构建复杂模型

如何使用 Keras Function API 进行深度学习

深度学习笔记19_卷积神经网络数据可视化_热力图