keras函数式模型和序贯模型的使用

函数式模型和序贯模型

在 Keras 中有两类主要的模型:Sequential 顺序模型 和 使用函数式 API 的 Model 类模型。
序贯模型是多个网络层的线性堆叠,是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不发生分叉。

函数式模型比序贯模型要复杂,更灵活,可以同时/分阶段输入变量,分阶段输出想要的模型。Keras函数式模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径。一句话,只要你的模型不是类似VGG一样一条路走到黑的模型,或者你的模型需要多于一个的输出,那么你总应该选择函数式模型。函数式模型是最广泛的一类模型,序贯(Sequential)模型只是它的一种特殊情况。

序贯模型实例

4层cnn

dr = 0.5 # dropout rate (%)
model = models.Sequential()
model.add(Reshape(in_shp + [1], input_shape=in_shp))#在网络第一步做了变换,in_shp---in_shp+[1],也可以对输入数据reshape
model.add(Conv2D(160, (5, 5), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
model.add(Conv2D(160, (5, 5), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
model.add(Dropout(0.5))

model.add(Conv2D(64, (3, 3), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
model.add(Conv2D(64, (3, 3), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(128, kernel_initializer="glorot_normal", activation="relu", name="dense1"))
model.add(Dropout(dr))
# model.add(Dense(1, activation='sigmoid'))

model.add(Dense(len(classes), kernel_initializer="he_normal", name="dense2"))
model.add(Activation('softmax'))
model.add(Reshape([len(classes)]))


model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])

函数式模型实例

双通道cnn

######tcnn model####
model = models.Sequential()
model.add(Reshape(in_shp + [1], input_shape=in_shp))
input=Input(shape=in_shp + [1])

####up channel##
# with tf.variable_scope("y_pred",reuse=None):
cnnup=Conv2D(160, (5, 5), activation='relu')(input)
# BatchNormalization(epsilon=1e-6, weights=None)
cnnup=Conv2D(160, (5, 5), activation='relu')(cnnup)
cnnup = Dropout(dr)(cnnup)
# cnnup = BatchNormalization(epsilon=1e-6, weights=None)(cnnup)
cnnup=Conv2D(64, (3, 3), activation='relu')(cnnup)
cnnup = Dropout(dr)(cnnup)
# cnnup = BatchNormalization(epsilon=1e-6, weights=None)(cnnup)
cnnup=Conv2D(64, (3, 3), activation='relu')(cnnup)
# cnnup = BatchNormalization(epsilon=1e-6, weights=None)(cnnup)

print cnnup

####down channel##
cnndown=Conv2D(160, (7, 7), activation='relu')(input)
cnndown = Dropout(dr)(cnndown)
# cnndown = BatchNormalization(epsilon=1e-6, weights=None)(cnndown)
cnndown=Conv2D(64, (5, 5), activation='relu')(cnndown)
cnndown = Dropout(dr)(cnndown)
# cnndown = BatchNormalization(epsilon=1e-6, weights=None)(cnndown)
cnndown=Conv2D(32, (3, 3), activation='relu')(cnndown)
# cnndown = BatchNormalization(epsilon=1e-6, weights=None)(cnndown)

print cnndown

cnnout=concatenate([cnndown,cnnup])
fl=Flatten()(cnnout)
output=Dense(128,kernel_initializer="glorot_uniform", activation='relu',name="dense1")(fl)
output = Dropout(dr, name='dense_drp')(output)
output=Dense(len(classes),kernel_initializer="glorot_normal", activation='softmax',name="dense2")(output)

model1=Model(input,output)
model.add(model1)

model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])

混合模型实例

双通道cnn

dr = 0.5 # dropout rate (%)
######tcnn model###
input=Input(shape=in_shp)

####up channel##############################
up_model = Sequential()
up_model.add(Reshape(in_shp + [1], input_shape=in_shp))#网络第一层reshape
up_model.add(Conv2D(160, (5, 5), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
up_model.add(Conv2D(160, (5, 5), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
up_model.add(Dropout(0.5))

up_model.add(Conv2D(64, (3, 3), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
up_model.add(Conv2D(64, (3, 3), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
up_model.add(Dropout(0.5))
up_model.add(Flatten())
up_model.summary()
# plot_model(up_model, to_file='upmodel.png',show_shapes=True)

cnnup = up_model(input)

####down channel##################################
down_model = Sequential()
down_model.add(Reshape(in_shp + [1], input_shape=in_shp))
down_model.add(Conv2D(128, (7, 7), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
# down_model.add(Conv2D(160, (5, 5), activation='relu'))
# down_model.add(BatchNormalization(epsilon=1e-6, weights=None))
down_model.add(Dropout(0.5))

down_model.add(Conv2D(64, (5, 5), activation='relu'))
BatchNormalization(epsilon=1e-6, weights=None)
down_model.add(Dropout(0.5))

down_model.add(Flatten())
cnndown = down_model(input)
print cnndown
cnnout=concatenate([cnndown,cnnup])
print cnnout

output=Dense(128,kernel_initializer="glorot_uniform", activation='relu',name="dense1")(cnnout)
output = Dropout(dr, name='dense_drp')(output)
output=Dense(len(classes),kernel_initializer="glorot_normal", activation='softmax',name="dense2")(output)

model=Model(input,output)

model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])

官方实例

from keras.layers import Conv2D, MaxPooling2D, Flatten
from keras.layers import Input, LSTM, Embedding, Dense
from keras.models import Model, Sequential

# 首先,让我们用 Sequential 来定义一个视觉模型。
# 这个模型会把一张图像编码为向量。
vision_model = Sequential()
vision_model.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)))
vision_model.add(Conv2D(64, (3, 3), activation='relu'))
vision_model.add(MaxPooling2D((2, 2)))
vision_model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
vision_model.add(Conv2D(128, (3, 3), activation='relu'))
vision_model.add(MaxPooling2D((2, 2)))
vision_model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
vision_model.add(Conv2D(256, (3, 3), activation='relu'))
vision_model.add(Conv2D(256, (3, 3), activation='relu'))
vision_model.add(MaxPooling2D((2, 2)))
vision_model.add(Flatten())

# 现在让我们用视觉模型来得到一个输出张量:
image_input = Input(shape=(224, 224, 3))
encoded_image = vision_model(image_input)

# 接下来,定义一个语言模型来将问题编码成一个向量。
# 每个问题最长 100 个词,词的索引从 1 到 9999.
question_input = Input(shape=(100,), dtype='int32')
embedded_question = Embedding(input_dim=10000, output_dim=256, input_length=100)(question_input)
encoded_question = LSTM(256)(embedded_question)

# 连接问题向量和图像向量:
merged = keras.layers.concatenate([encoded_question, encoded_image])

# 然后在上面训练一个 1000 词的逻辑回归模型:
output = Dense(1000, activation='softmax')(merged)

# 最终模型:
vqa_model = Model(inputs=[image_input, question_input], outputs=output)

猜你喜欢

转载自blog.csdn.net/Adupanfei/article/details/84584547