Python深度学习读书笔记(九)(函数式API-多输入模型-多输出模型)

Sequential模型假设,网络只有一个输入和一个输出,并且网络是层的线性堆叠。然而有的网络看起来像层构成的图。许多最新开发的神经架构要求非线性的网络拓扑结构,即网络结构为有向无环图

使用函数式API,直接操作张量,把当做函数来用,接收张量并返回张量

from keras import Input,layers
#一个张量
input_tensor=Input(shape=(32,))
#一个层是一个函数
dense=layers.Dense(32,activation='relu')
#在一个张量上调用一个层
output_tensor=dense(input_tensor)

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

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

#对应函数式API实现
input_tensor=Input(shape=(64,))
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(input_tensor,output_tensor)
#查看模型
model.summary()

#编译,训练,评估
model.compile(optimizer='rmsprop',loss='categorical_crossentropy')
import numpy as np
x_train=np.random.random((1000,64))
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可用于构建多个输入的模型,某一时刻用一个可以组合多个张量的层将不同的输入分支合并。

典型的问答模型有两个输入:一个自然语言描述的问题和一个提供回答信息的文本片段

训练双输入模型:向模型输入一个由Numpy组成的列表;输入一个将输入名称映射为Numpy数组的字典(需要具有输入名称时可用。

#多输入模型
#双输入问答模型
from keras.models import Model
from keras import layers
from keras import Input

text_vocabulary_size=10000
question_vocabulary_size=10000
answer_vocalulary_size=500

#输入1
#文本输入是长度可变的整数序列
text_input=Input(shape=(None,),dtype='int32',name='text')
#将输入嵌入长度为64的向量
embedding_text=layers.Embedding(text_vocabulary_size,64)(text_input)
#利用LSTM将向量编码为单个向量
encoded_text=layers.LSTM(32)(embedding_text)

#输入2
#对问题进行相同的处理
question_input=Input(shape=(None,),dtype='int32',name='question')
embedding_question=layers.Embedding(question_vocabulary_size,32)(question_input)
encoded_question=layers.LSTM(16)(embedding_question)

#将输入1,输入2连接起来
concatenated=layers.concatenate([encoded_text,encoded_question],axis=-1)
#添加softmax分类器
answer=layers.Dense(answer_vocalulary_size,activation='softmax')(concatenated)

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

#将数据输入到多输入模型中
import numpy as np
import keras
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_vocalulary_size,size=(num_samples))
answers=keras.utils.to_categorical(answers,answer_vocalulary_size)

#拟合方法
#列表
model.fit([text,question],answers,epochs=10,batch_size=128)
#字典
#model.fit({text:'text',question:'question'},answers,epochs=10,batch_size=128)

训练多输出模型可以对网络各个头指定不同的损失函数,合并不同损失最简单的方法就是对所有损失求和。

#多输出模型
from keras import layers
from keras import Input
from keras.models import Model

vocabulary_size=50000
num_income_group=10

posts_input=Input(shape=(None,),dtype='int32',name='posts')
embedded_posts=layers.Embedding(vocabulary_size,256)(posts_input)
x=layers.Conv1D(128,5,activation='relu')(embedded_posts)
x=layers.MaxPool1D(5)(x)
x=layers.Conv1D(256,5,activation='relu')(x)
x=layers.Conv1D(256,5,activation='relu')(x)
x=layers.MaxPooling1D(5)(x)
x=layers.Conv1D(256,5,activation='relu')(x)
x=layers.Conv1D(256,5,activation='relu')(x)
x=layers.GlobalMaxPooling1D()(x)
x=layers.Dense(128,activation='relu')(x)

age_prediction=layers.Dense(1,name='age')(x)
income_prediction=layers.Dense(num_income_group,activation='softmax',name='income')(x)
gender_prediction=layers.Dense(1,activation='sigmoid',name='gender')(x)

model=Model(posts_input,[age_prediction,income_prediction,gender_prediction])
#编译,选择各自的损失函数,损失加权
model.compile(optimizer='rmsprop',loss=['mse','categorical_crossentropy','binary_crossentropy'],loss_weights=[0.25,1.,10.])
#数据输入到多输入模型
model.fit(posts_input,{'age':age_targets,'income':income_targets,'gender':gender_targets},epochs=10,batch_size=64)

Keras中的神经网络可以是层组成的任意有向无环图

Inception是一种流行的卷积神经网络的架构类型,模块最基本的形式包括3~4个分支,首先是1X1的卷积(卷积运算等于将让每个方块向量经过一个Dense层,计算得到的特征能够将输入张量通道中的信息混合在一起),然后是3X3的卷积,最后将所得到的特征连接到一起。有助于学习空间特征和逐通道的特征。

残差连接解决了困扰所有大规模深度模型的两个共性问题:梯度消失(引入一个纯线性信息携带轨道,与主要的层堆叠方向平行,跨越任意深度的层来传播梯度)和表示瓶颈(连续的表示层都构建于前一层之上,只能访问前一层激活中包含的信息,若前一层太小,后面层难以处理到因前层太小而丢失的信息。残次连接可以将较早的信息重新注入到下游数据中)。

函数式API能够多次重复使用一个层实例,对一个层实例调用2次,每次调用可以重复使用相同的权重。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值