搜索

查看: 3097|回复: 11

[Python] Keras函数式(functional)API的使用方式

[复制链接]
发表于 2023-5-4 17:22:41 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:22:41 3097 11 看全部
目录
  • 多层感知器(Multilayer Perceptron)
  • 卷积神经网络(Convolutional Neural Network)
  • 循环神经网络(Recurrent Neural Network)
  • Bidirectional recurrent neural network
  • 共享输入层模型(Shared Input Layer Model)
  • Shared Feature Extraction Layer
  • 多输入模型(Multiple Input Model)
  • 多输出模型(Multiple Output Model)
  • 总结
    多层感知器(Multilayer Perceptron)
    定义了用于二分类的多层感知器模型。
    模型输入32维特征,经过三个全连接层,每层使用relu线性激活函数,并且在输出层中使用sigmoid激活函数,最后用于二分类。
    ##------ Multilayer Perceptron ------##
    from keras.models import Model
    from keras.layers import Input, Dense
    from keras import backend as K
    K.clear_session()
    # MLP model
    x = Input(shape=(32,))
    hidden1 = Dense(10, activation='relu')(x)
    hidden2 = Dense(20, activation='relu')(hidden1)
    hidden3 = Dense(10, activation='relu')(hidden2)
    output = Dense(1, activation='sigmoid')(hidden3)
    model = Model(inputs=x, outputs=output)
    # summarize layers
    model.summary()


    模型的结构和参数如下:

    202302220829501.png

    202302220829501.png


    卷积神经网络(Convolutional Neural Network)
    定义用于图像分类的卷积神经网络。
    该模型接收3通道的64×64图像作为输入,然后经过两个卷积和池化层的序列作为特征提取器,接着过一个全连接层,最后输出层过softmax激活函数进行10个类别的分类。
    ##------ Convolutional Neural Network ------##
    from keras.models import Model
    from keras.layers import Input
    from keras.layers import Dense, Flatten
    from keras.layers import Conv2D, MaxPooling2D
    from keras import backend as K
    K.clear_session()
    # CNN model
    x = Input(shape=(64,64,3))
    conv1 = Conv2D(16, (5,5), activation='relu')(x)
    pool1 = MaxPooling2D((2,2))(conv1)
    conv2 = Conv2D(32, (3,3), activation='relu')(pool1)
    pool2 = MaxPooling2D((2,2))(conv2)
    conv3 = Conv2D(32, (3,3), activation='relu')(pool2)
    pool3 = MaxPooling2D((2,2))(conv3)
    flat = Flatten()(pool3)
    hidden1 = Dense(512, activation='relu')(flat)
    output = Dense(10, activation='softmax')(hidden1)
    model = Model(inputs=x, outputs=output)
    # summarize layers
    model.summary()


    模型的结构和参数如下:

    202302220829502.png

    202302220829502.png


    循环神经网络(Recurrent Neural Network)
    定义一个用于文本序列分类的LSTM网络。
    该模型需要100个时间步长作为输入,然后经过一个Embedding层,每个时间步变成128维特征表示,然后经过一个LSTM层,LSTM输出过一个全连接层,最后输出用sigmoid激活函数用于进行二分类预测。
    ##------ Recurrent Neural Network ------##
    from keras.models import Model
    from keras.layers import Input
    from keras.layers import Dense, LSTM, Embedding
    from keras import backend as K
    K.clear_session()
    VOCAB_SIZE = 10000
    EMBED_DIM = 128
    x = Input(shape=(100,), dtype='int32')
    embedding = Embedding(VOCAB_SIZE, EMBED_DIM, mask_zero=True)(x)
    hidden1 = LSTM(64)(embedding)
    hidden2 = Dense(32, activation='relu')(hidden1)
    output = Dense(1, activation='sigmoid')(hidden2)
    model = Model(inputs=x, outputs=output)
    # summarize layers
    model.summary()

    模型的结构和参数如下:

    202302220829513.png

    202302220829513.png


    Bidirectional recurrent neural network
    定义一个双向循环神经网络,可以用来完成序列标注等任务,相比上面的LSTM网络,多了一个反向的LSTM,其它设置一样。
    ##------ Bidirectional recurrent neural network ------##
    from keras.models import Model
    from keras.layers import Input, Embedding
    from keras.layers import Dense, LSTM, Bidirectional
    from keras import backend as K
    K.clear_session()
    VOCAB_SIZE = 10000
    EMBED_DIM = 128
    HIDDEN_SIZE = 64
    # input layer
    x = Input(shape=(100,), dtype='int32')
    # embedding layer
    embedding = Embedding(VOCAB_SIZE, EMBED_DIM, mask_zero=True)(x)
    # BiLSTM layer
    hidden = Bidirectional(LSTM(HIDDEN_SIZE, return_sequences=True))(embedding)
    # prediction layer
    output = Dense(10, activation='softmax')(hidden)
    model = Model(inputs=x, outputs=output)
    model.summary()

    模型的结构和参数如下:

    202302220829514.png

    202302220829514.png


    共享输入层模型(Shared Input Layer Model)
    定义了具有不同大小内核的多个卷积层来解释图像输入。
    该模型采用尺寸为64×64像素的3通道图像。
    有两个共享此输入的CNN特征提取子模型; 第一个内核大小为5x5,第二个内核大小为3x3。
    把提取的特征展平为向量然后拼接成一个长向量,然后过一个全连接层,最后输出层完成10分类。
    ##------ Shared Input Layer Model ------##
    from keras.models import Model
    from keras.layers import Input
    from keras.layers import Dense, Flatten
    from keras.layers import Conv2D, MaxPooling2D, Concatenate
    from keras import backend as K
    K.clear_session()
    # input layer
    x = Input(shape=(64,64,3))
    # first feature extractor
    conv1 = Conv2D(32, (3,3), activation='relu')(x)
    pool1 = MaxPooling2D((2,2))(conv1)
    flat1 = Flatten()(pool1)
    # second feature extractor
    conv2 = Conv2D(16, (5,5), activation='relu')(x)
    pool2 = MaxPooling2D((2,2))(conv2)
    flat2 = Flatten()(pool2)
    # merge feature
    merge = Concatenate()([flat1, flat2])
    # interpretation layer
    hidden1 = Dense(128, activation='relu')(merge)
    # prediction layer
    output = Dense(10, activation='softmax')(merge)
    model = Model(inputs=x, outputs=output)
    model.summary()

    模型的结构和参数如下:

    202302220829515.png

    202302220829515.png


    Shared Feature Extraction Layer
    定义一个共享特征抽取层的模型,这里共享的是LSTM层的输出,具体共享参见代码
    ##------ Shared Feature Extraction Layer ------##
    from keras.models import Model
    from keras.layers import Input, Embedding
    from keras.layers import Dense, LSTM, Concatenate
    from keras import backend as K
    K.clear_session()
    # input layer
    x = Input(shape=(100,32))
    # feature extraction
    extract1 = LSTM(64)(x)
    # first interpretation model
    interp1 = Dense(32, activation='relu')(extract1)
    # second interpretation model
    interp11 = Dense(64, activation='relu')(extract1)
    interp12 = Dense(32, activation='relu')(interp11)
    # merge interpretation
    merge = Concatenate()([interp1, interp12])
    # output layer
    output = Dense(10, activation='softmax')(merge)
    model = Model(inputs=x, outputs=output)
    model.summary()
    模型的结构和参数如下:

    202302220829516.png

    202302220829516.png


    多输入模型(Multiple Input Model)
    定义有两个输入的模型,这里测试的是输入两张图片,一个输入是单通道的64x64,另一个是3通道的32x32,两个经过卷积层、池化层后,展平拼接,最后进行二分类。
    ##------ Multiple Input Model  ------##
    from keras.models import Model
    from keras.layers import Input
    from keras.layers import Dense, Flatten
    from keras.layers import Conv2D, MaxPooling2D, Concatenate
    from keras import backend as K
    K.clear_session()
    # first input model
    input1 = Input(shape=(64,64,1))
    conv11 = Conv2D(32, (5,5), activation='relu')(input1)
    pool11 = MaxPooling2D(pool_size=(2,2))(conv11)
    conv12 = Conv2D(16, (3,3), activation='relu')(pool11)
    pool12 = MaxPooling2D(pool_size=(2,2))(conv12)
    flat1 = Flatten()(pool12)
    # second input model
    input2 = Input(shape=(32,32,3))
    conv21 = Conv2D(32, (5,5), activation='relu')(input2)
    pool21 = MaxPooling2D(pool_size=(2,2))(conv21)
    conv22 = Conv2D(16, (3,3), activation='relu')(pool21)
    pool22 = MaxPooling2D(pool_size=(2,2))(conv22)
    flat2 = Flatten()(pool22)
    # merge input models
    merge = Concatenate()([flat1, flat2])
    # interpretation model
    hidden1 = Dense(20, activation='relu')(merge)
    output = Dense(1, activation='sigmoid')(hidden1)
    model = Model(inputs=[input1, input2], outputs=output)
    model.summary()
    模型的结构和参数如下:

    202302220829517.png

    202302220829517.png


    多输出模型(Multiple Output Model)
    定义有多个输出的模型,以文本序列输入LSTM网络为例,一个输出是对文本的分类,另外一个输出是对文本进行序列标注。
    ##------ Multiple Output Model ------ ##
    from keras.models import Model
    from keras.layers import Input
    from keras.layers import Dense, Flatten, TimeDistributed, LSTM
    from keras.layers import Conv2D, MaxPooling2D, Concatenate
    from keras import backend as K
    K.clear_session()
    x = Input(shape=(100,1))
    extract = LSTM(10, return_sequences=True)(x)
    class11 = LSTM(10)(extract)
    class12 = Dense(10, activation='relu')(class11)
    output1 = Dense(1, activation='sigmoid')(class12)
    output2 = TimeDistributed(Dense(1, activation='linear'))(extract)
    model = Model(inputs=x, outputs=[output1, output2])
    model.summary()

    模型的结构和参数如下:

    202302220829518.png

    202302220829518.png


    参考
    [1] https://machinelearningmastery.com/keras-functional-api-deep-learning/
    [2] https://keras.io/getting-started/functional-api-guide/
    [3] https://tensorflow.google.cn/alpha/guide/keras/functional

    总结
    以上为个人经验,希望能给大家一个参考,也希望大家多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-29 08:05:39 | 显示全部楼层
    术数古籍专卖疤 2023-6-29 08:05:39 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 13:56:04 | 显示全部楼层
    落败的青春阳落s 2023-6-29 13:56:04 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-29 17:41:29 | 显示全部楼层
    123456865 2023-6-29 17:41:29 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 23:40:32 | 显示全部楼层
    执着等待等wc 2023-6-29 23:40:32 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 00:21:54 | 显示全部楼层
    尘埃416 2023-6-30 00:21:54 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 01:56:02 | 显示全部楼层
    音乐之家1 2023-6-30 01:56:02 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-30 03:57:03 | 显示全部楼层
    胡37 2023-6-30 03:57:03 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 06:02:40 | 显示全部楼层
    我是的十八簿 2023-6-30 06:02:40 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 08:57:33 | 显示全部楼层
    xinting_6ym 2023-6-30 08:57:33 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表