• 《python深度学习》笔记---7.1、Keras函数式API


    《python深度学习》笔记---7.1、Keras函数式API

    一、总结

    一句话总结:

    【Sequential API功能有限】:如果你需要实现的架构不仅仅是层的线性堆叠,那么不要局限于 Sequential API。
    【函数式API用来构建复杂模型】:如何使用Keras 函数式API 来构建多输入模型、多输出模型和具有复杂的内部网络拓扑 结构的模型。
    【在不同的处理分支之间重复使用层或模型的权重】:如何通过多次调用相同的层实例或模型实例,在不同的处理分支之间重复使用层或模型 的权重。

    1、为什么要有函数式API?

    【像使用Python函数一样使用Keras模型】:利用 Keras 函数式 API,你可以构建类图(graph-like)模型、在不同的输入之间共享某一层, 并且还可以像使用Python 函数一样使用Keras 模型。
    【有些网络需要多个网络只有一个输入和一个输出,而且网络是层的线性堆叠】:Sequential 模型假设,网络只有一个输入和一个输出,而且网络是层的线性堆叠
    【Sequential模型无法解决多输入多输出结构,层内部多分支结构】:有些网络需要多个独立的输入,有些网络则需要多个输出,而有些网络在层与层之间具有内部分支,这使得网络 看起来像是层构成的图(graph),而不是层的线性堆叠。

    2、多模态(multimodal)输入?

    【合并来自不同输入源的数据】:例如,有些任务需要多模态(multimodal)输入。这些任务合并来自不同输入源的数据,并 使用不同类型的神经层处理不同类型的数据。

    3、假设有一个深度学习模型,试图利用下列输入来 预测一件二手衣服最可能的市场价格:用户提供的元数据(比如商品品牌、已使用年限等)、用 户提供的文本描述与商品照片?

    【只有单一数据可以单一处理,但是多维度数据不好处理】:用户提供的元数据(比如商品品牌、已使用年限等)、用 户提供的文本描述与商品照片。如果你只有元数据,那么可以使用one-hot 编码,然后用密集 连接网络来预测价格。如果你只有文本描述,那么可以使用循环神经网络或一维卷积神经网络。 如果你只有图像,那么可以使用二维卷积神经网络。
    【训练三个独立的模型加权平均不是最优】:但怎么才能同时使用这三种数据呢?一种 朴素的方法是训练三个独立的模型,然后对三者的预测做加权平均。但这种方法可能不是最优的, 因为模型提取的信息可能存在冗余。
    【联合学习】:更好的方法是使用一个可以同时查看所有可用的输入模态 的模型,从而联合学习一个更加精确的数据模型——这个模型具有三个输入分支

    4、同样,有些任务需要预测输入数据的多个目标属性。给定一部小说的文本,你可能希望将 它按类别自动分类(比如爱情小说或惊悚小说),同时还希望预测其大致的写作日期?

    【训练两个独立的模型】:当然,你可以训练两个独立的模型:一个用于划分类别,一个用于预测日期。
    【同时预测】:但由于这些属性并不是统 计无关的,你可以构建一个更好的模型,用这个模型来学习同时预测类别和日期。
    【因为类别和日期之间具有相关性】:这种联合模 型将有两个输出,或者说两个头(head,见图7-3)。因为类别和日期之间具有相关性,所以知 道小说的写作日期有助于模型在小说类别的空间中学到丰富而又准确的表示,反之亦然。

    5、函数式 API 简介 ?

    【直接操作张量,接收张量并返回张量】:使用函数式API,你可以直接操作张量,也可以把层当作函数来使用,接收张量并返回张 量(因此得名函数式 API)。
    from keras import Input, layers 
    # 一个张量
    input_tensor = Input(shape=(32,))   
    # 一个层是一个函数
    dense = layers.Dense(32, activation='relu')   
    # 可以在一个张量上调用一个层, 它会返回一个张量
    output_tensor = dense(input_tensor) 

    6、keras分支合并(比如多分支中常用到)?

    【相加、连接等】:通常情况下,这种模型会在某一时刻用一个 可以组合多个张量的层将不同的输入分支合并,张量组合方式可能是相加、连接等。
    【keras.layers.add、keras.layers.concatenate 等】:这通常利 用 Keras 的合并运算来实现,比如keras.layers.add、keras.layers.concatenate 等。

    7、典型的问答模型?

    【典型的问答模型有两个输入】:典型的问答模型有两个输入:一个自然语言描述的问题和一个文本片段(比如新闻文章), 后者提供用于回答问题的信息。
    【生成回答】:然后模型要生成一个回答,在最简单的情况下,这个回答只包 含一个词,可以通过对某个预定义的词表做 softmax 得到

    8、问答模型实例 模型创建注意?

    将编码后的问题和文本连接起来:concatenated = layers.concatenate([encoded_text, encoded_question],axis=-1)
    在上面添加一个 softmax 分类器:answer = layers.Dense(answer_vocabulary_size,activation='softmax')(concatenated)
    在模型实例化时,指定两个输入和输出:model = Model([text_input, question_input], answer)
    model.compile(optimizer='rmsprop',loss='categorical_crossentropy', metrics=['acc'])

    9、如何训练这个双输入模型(问答模型实例)?

    有两个可用的API:我们可以向模型输入一个由 Numpy 数组组成的列表,或者也可以输入一个将输入名称映射为Numpy 数组的字典。当然, 只有输入具有名称时才能使用后一种方法。
    使用输入组成的列表来拟合:model.fit([text, question], answers, epochs=10, batch_size=128)
    使用输入组成的字典来拟合(只有对输入进行命名之后才 能用这种方法):model.fit({'text': text, 'question': question}, answers,epochs=10, batch_size=128)

    10、用函数式 API 实现一个三输出模型 注意(比如一个网络,输入某个匿名人士 的一系列社交媒体发帖,然后尝试预测那个人的属性,比如年龄、性别和收入水平)?

    age_prediction = layers.Dense(1, name='age')(x)   
    income_prediction = layers.Dense(num_income_groups,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])

    11、训练有些多输出模型需要能够对网络的各个头指定不同的损失函数?

    【年龄预测是标量回归任务,而性别预测是二分类任务】:例如,年龄预测 是标量回归任务,而性别预测是二分类任务,二者需要不同的训练过程。
    【损失求和】:但是,梯度下降要求 将一个标量最小化,所以为了能够训练模型,我们必须将这些损失合并为单个标量。合并不同 损失最简单的方法就是对所有损失求和。
    【然后将得到的损失值相加得到一个全局损失】:在Keras 中,你可以在编译时使用损失组成的列表或 字典来为不同输出指定不同损失,然后将得到的损失值相加得到一个全局损失,并在训练过程 中将这个损失最小化。

    12、多输出模型的编译选项:多重损失 ?

    model.compile(optimizer='rmsprop',loss=['mse', 'categorical_crossentropy', 'binary_crossentropy'])
    model.compile(optimizer='rmsprop',loss={'age': 'mse','income': 'categorical_crossentropy','gender': 'binary_crossentropy'}) #与上述写法等效(只有输出层 具有名称时才能采用这种写法)

    13、(多输出多损失函数的情况下)注意,严重不平衡的损失贡献会导致模型表示针对单个损失值最大的任务优先进行优化, 而不考虑其他任务的优化?

    【我们可以为每个损失值对最终损失的贡献分配不同大小的重要性】:为了解决这个问题,我们可以为每个损失值对最终损失的贡献分配 不同大小的重要性。如果不同的损失值具有不同的取值范围,那么这一方法尤其有用。
    【在这种情况下,为了平衡不同损失的贡献,我们可以让交叉熵损失的权重 取 10,而 MSE 损失的权重取 0.5】:比如,用于年龄回归任务的均方误差(MSE)损失值通常在3~5 左右,而用于性别分类任务的交叉熵损失值可能低至0.1。在这种情况下,为了平衡不同损失的贡献,我们可以让交叉熵损失的权重 取 10,而 MSE 损失的权重取 0.5。

    14、多输出模型的编译选项:损失加权 ?

    model.compile(optimizer='rmsprop',loss=['mse', 'categorical_crossentropy', 'binary_crossentropy'],loss_weights=[0.25, 1., 10.])
    model.compile(optimizer='rmsprop',loss={'age': 'mse','income': 'categorical_crossentropy','gender': 'binary_crossentropy'},loss_weights={'age': 0.25,'income': 1.,'gender': 10.})

    15、将数据输入到多输出模型中 ?

    model.fit(posts, [age_targets, income_targets, gender_targets],epochs=10, batch_size=64) #假设age_targets、 income_targets和 gender_targets都 是 Numpy 数组
    model.fit(posts, {'age': age_targets,'income': income_targets,'gender': gender_targets},epochs=10, batch_size=64) #与上述写法等效(只 有输出层具有名称时 才能采用这种写法)

    16、1×1 卷积的作用?

    【这时卷积运算等价于让每个方块向量经过一个 Dense 层:它计算得到的特征能够将输入张量通道中的信息混合在一起,但 不会将跨空间的信息混合在一起】:我们已经知道,卷积能够在输入张量的每一个方块周围提取空间图块,并对所有图块 应用相同的变换。极端情况是提取的图块只包含一个方块。这时卷积运算等价于让每个方块 向量经过一个 Dense 层:它计算得到的特征能够将输入张量通道中的信息混合在一起,但 不会将跨空间的信息混合在一起(因为它一次只查看一个方块)。
    【区分开通道特征学习和空间特征学习】:这种 1×1 卷积[也叫作逐 点卷积(pointwise convolution)]是 Inception 模块的特色,它有助于区分开通道特征学习和 空间特征学习。如果你假设每个通道在跨越空间时是高度自相关的,但不同的通道之间可能 并不高度相关,那么这种做法是很合理的。

    17、函数式API InceptionV3 实例?

    就是InceptionV3的那个图的并列结构,非常简单
    from keras import layers 
    branch_a = layers.Conv2D(128, 1,activation='relu', strides=2)(x)   
    branch_b = layers.Conv2D(128, 1, activation='relu')(x)   
    branch_b = layers.Conv2D(128, 3, activation='relu', strides=2)(branch_b) 
    branch_c = layers.AveragePooling2D(3, strides=2)(x)   
    branch_c = layers.Conv2D(128, 3, activation='relu')(branch_c) 
    branch_d = layers.Conv2D(128, 1, activation='relu')(x) 
    branch_d = layers.Conv2D(128, 3, activation='relu')(branch_d) 
    branch_d = layers.Conv2D(128, 3, activation='relu', strides=2)(branch_d) 
     
    output = layers.concatenate(     [branch_a, branch_b, branch_c, branch_d], axis=-1) 

    18、keras.applications中的各个网络的描述?

    【包括在ImageNet数据集上预训练得到的权重】:完整的Inception V3架构内置于Keras中,位置在keras.applications.inception_v3. InceptionV3,其中包括在ImageNet 数据集上预训练得到的权重。

    19、Xception 代表极端Inception (extreme inception),它是一种卷积神经网络架构,其灵感可能来自于Inception?

    【Xception将分别进行通道特征学习与空间特征学习的想法推向逻辑上的极端】:Xception 将分 别进行通道特征学习与空间特征学习的想法推向逻辑上的极端,并将 Inception 模块替换为深度 可分离卷积,其中包括一个逐深度卷积(即一个空间卷积,分别对每个输入通道进行处理)和 后面的一个逐点卷积(即一个1×1 卷积)。
    【是Inception模块的一种极端形式,其空间特征和通道特征被完全分离】:这个深度可分离卷积实际上是Inception 模块的一种 极端形式,其空间特征和通道特征被完全分离。Xception 的参数个数与Inception V3 大致相同, 但因为它对模型参数的使用更加高效,所以在ImageNet 以及其他大规模数据集上的运行性能更 好,精度也更高。

    20、残差连接解决了困扰所有大规模深度学习模型的两个共性问题?

    梯度消失和表示瓶颈:通常来说,向任何多于 10 层的模型中添加残差连接,都可能会有所帮助。

    21、深度学习中的表示瓶颈?

    【模型将会受限于该层激活中能够塞入多少信息】:在 Sequential 模型中,每个连续的表示层都构建于前一层之上,这意味着它只能访 问前一层激活中包含的信息。如果某一层太小(比如特征维度太低),那么模型将会受限于 该层激活中能够塞入多少信息。
    【如果某个操作将信号裁剪到低频范围,那么下游操作将永远无法恢复那些被丢弃的频段】:你可以通过类比信号处理来理解这个概念:假设你有一条包含一系列操作的音频处理流 水线,每个操作的输入都是前一个操作的输出,如果某个操作将信号裁剪到低频范围(比如 0~15 kHz),那么下游操作将永远无法恢复那些被丢弃的频段。任何信息的丢失都是永久性的
    【残差连接可以将较早的信息重新注入到下游数据中】:残差连接可以将较早的信息重新注入到下游数据中,从而部分解决了深度学习模型的这一问题。

    22、深度学习中的梯度消失?

    【如果这个反馈信号的传播需要经过很多层,那么信号可能会变得非常 微弱,甚至完全丢失,导致网络无法训练】:反向传播是用于训练深度神经网络的主要算法,其工作原理是将来自输出损失的反馈信号 向下传播到更底部的层。如果这个反馈信号的传播需要经过很多层,那么信号可能会变得非常 微弱,甚至完全丢失,导致网络无法训练。这个问题被称为梯度消失(vanishing gradient)。
    【反馈信号的传播都必须通过一长串操作】:深度网络中存在这个问题,在很长序列上的循环网络也存在这个问题。在这两种情况下, 反馈信号的传播都必须通过一长串操作。
    【LSTM层利用携带轨道解决梯度消失】:我们已经知道 LSTM 层是如何在循环网络中解决这 个问题的:它引入了一个携带轨道(carry track),可以在与主处理轨道平行的轨道上传播信 息。
    【残差连接利用纯线性的信息携带轨道解决梯度消失】:残差连接在前馈深度网络中的工作原理与此类似,但它更加简单:它引入了一个纯线性 的信息携带轨道,与主要的层堆叠方向平行,从而有助于跨越任意深度的层来传播梯度。

    23、函数式API 还有一个重要特性,那就是能够多次重复使用一个层实例?

    【层重复使用】:如果你对一个层实 例调用两次,而不是每次调用都实例化一个新层,那么每次调用可以重复使用相同的权重。
    【即几个分支全都共享相同的知识并执行相同的运算】:这样你可以构建具有共享分支的模型,即几个分支全都共享相同的知识并执行相同的运算。也就 是说,这些分支共享相同的表示,并同时对不同的输入集合学习这些表示。

    24、层共享实例?

    对相同的视觉模型调用两次
    left_features = xception_base(left_input)   
    right_input = xception_base(right_input)
    from keras import layers 
    from keras import applications 
    from keras import Input 
    
    # 图像处理基础模型是 Xception 网络(只包 括卷积基)
    xception_base = applications.Xception(weights=None,include_top=False)   
     
    # 输入是 250×250 的 RGB 图像
    
    left_input = Input(shape=(250, 250, 3))   
    right_input = Input(shape=(250, 250, 3)) 
    
    # 对相同的视觉模型调用两次
    left_features = xception_base(left_input)   
    right_input = xception_base(right_input) 
     
    # 合并后的特征包含来自左右 两个视觉输入中的信息
    merged_features = layers.concatenate([left_features, right_input], axis=-1) 

    二、7.1、Keras函数式API

    博客对应课程的视频位置:

     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    python语法基础-并发编程-协程-长期维护
    python语法基础-并发编程-线程-其他
    python语法基础-并发编程-线程-线程池
    python语法基础-并发编程-线程-各种锁以及队列
    python语法基础-并发编程-线程-线程理论和线程的启动
    python语法基础-并发编程-进程-其他
    python语法基础-并发编程-进程-进程池以及回调函数
    python语法基础-并发编程-进程-进程锁和进程间通信
    python语法基础-并发编程-进程-进程理论和进程的开启
    二、提高期(Upping the Ante)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13820076.html
Copyright © 2020-2023  润新知