孪生网络(1)_孪生网络的分类
孿生網絡
全文參考https://blog.csdn.net/qq_35826213/article/details/86313469
? 孿生網絡有兩種,一種是不共享參數的孿生網絡,另一種是共享參數的孿生網絡,
不共享參數的孿生網絡
from keras.layers import merge,Conv2D,MaxPool2D,Activation,Dense,concatenate,Flatten from keras.layers import Input from keras.models import Modeldef FeatureNetwork():"""特征提取網絡"""inp=Input(shape=(28,28,1),name="FeatureNet_ImageInput")models=Conv2D(filters=24,kernel_size=(3,3),strides=1,padding='same')(inp)models=Activation('relu')(models)models=MaxPool2D(pool_size=(3,3))(models)models=Conv2D(filters=64,kernel_size=(3,3),strides=1,padding='same')(models)models=Activation('relu')(models)models=Conv2D(filters=96,kernel_size=(3,3),strides=1,padding='valid')(models)models=Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models =Flatten()(models)models =Dense(512)(models)models=Activation('relu')(models)model=Model(inputs=inp,outputs=models)return model #此網絡為不共享參數的孿生網絡,實際是兩個網絡模型 def ClassiFilterNet():#孿生網絡中一個特征提取input1=FeatureNetwork()#孿生網絡中另一個特征提取input2=FeatureNetwork()for layer in input2.layers:layer.name=layer.name+str("_2")inp1=input1.inputinp2=input2.input#融合網絡,其實就是簡單地相加merget_layers=concatenate([input1.output,input2.output])fc1=Dense(1024,activation='relu')(merget_layers)fc2=Dense(1024,activation='relu')(fc1)fc3=Dense(2,activation='softmax')(fc2)class_models=Model(inputs=[inp1,inp2],outputs=[fc3])return class_models net=ClassiFilterNet() net.summary()上面的代碼是不共享參數的神經網絡模型,每個輸入都會訓練自己的網絡模型,訓練之后會把兩個神經網絡再組合,生成一個神經網絡,網絡圖如下
不共享網絡參數的參數
dense_3 (Dense) (None, 1024) 1049600 concatenate_1[0][0]
dense_4 (Dense) (None, 1024) 1049600 dense_3[0][0]
dense_5 (Dense) (None, 2) 2050 dense_4[0][0]
Total params: 4,864,994
Trainable params: 4,864,994
去掉最后全連接層的網絡后,參數大小為2763744
2.共享參數的神經網絡
代碼如下
#!/usr/bin/env python # -*- coding: utf-8 -*- from keras.models import Sequential from keras.layers import merge,Conv2D,MaxPool2D,Activation,Dense,concatenate,Flatten from keras.layers import Input from keras.models import Model from keras.utils import np_utils import tensorflow as tf import keras from keras.datasets import mnist import numpy as np from keras.utils import np_utils#此網絡為不共享參數的孿生網絡,實際是兩個網絡模型 def ClassiFilterNet(reuse=False):inp = Input(shape=(28, 28, 1), name="FeatureNet_ImageInput")models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)models = Activation('relu')(models)models = MaxPool2D(pool_size=(3, 3))(models)models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models = Flatten()(models)models = Dense(512)(models)models = Activation('relu')(models)model = Model(inputs=inp, outputs=models)inp1=Input(shape=(28,28,1))inp2=Input(shape=(28,28,1))model1=model(inp1)model2=model(inp2)merge=concatenate([model1,model2])fc1=Dense(1024,activation='relu')(merge)fc2=Dense(1024,activation='relu')(fc1)fc3=Dense(2,activation='softmax')(fc2)class_models=Model(inputs=[inp1,inp2],outputs=[fc3])return class_models net=ClassiFilterNet() net.summary()可以看到共享權重的神經網絡是兩個輸入共享一套網絡模型,使用同一套網絡,最后合并輸出,然后結合全連接層,
可以看到這個網絡是共享了權重的,參數數量一下就減少了
參數數量如下
dense_2 (Dense) (None, 1024) 1049600 concatenate_1[0][0]
dense_3 (Dense) (None, 1024) 1049600 dense_2[0][0]
dense_4 (Dense) (None, 2) 2050 dense_3[0][0]
Total params: 3,483,122
Trainable params: 3,483,122
去除全連接層后的網絡參數為
? 1381872,可以看到是2763744的二分之一
總結
以上是生活随笔為你收集整理的孪生网络(1)_孪生网络的分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用C++求坐标系中两点间距离
- 下一篇: C语言——可变参数