3.3 keras模型構建的三種方式
阿新 • • 發佈:2020-12-15
技術標籤:視覺
3.3 keras
模型構建的三種方式
1. 使用tf.keras.Sequential
按層順序構建模型,程式碼示例:
model = Sequential()
#卷積層conv_1_1
model.add(Cov2D(input_shape = (64, 64, 3),filters = 32,
kernel_size = 3, activation = 'relu', kernel_initializer = 'he_uniform', name = 'conv_1_1)
#卷積層 conv_1_2
model.add(Cov2D(filters = 32 , kernel_size = 3,
activation = 'relu', kernel_initializer = 'he_uniform', name = 'conv_1_2)
#池化層max_pool_1
model.add(MaxPool2D(pool_size = 32, name = 'max_pool_1))
#展平層
model.add(Flatten(name = 'flatten'))
#全連線層
model.add(Dense(unit = 6, activation = 'softmax', name = 'logit'))
#設定損失函式loss、優化器optimizer、評價指標metrics
model.compile(loss="categorical_crossentropy",
optimizer = tf.keras.optimizers.SGD(learning_rate = 0.001),
metrics = ["accuracy"])
或者:
model = Sequential([
Conv2D(input_shape = (64, 64, 3), filters = 32,
kernel_size = 3, activation = 'relu', name = 'conv_1_1'),
Conv2D( filters = 32, kernel_size = 3, activation = 'relu', name = 'conv_1_2'),
MaxPool2D(poo_size = 2, anme = 'max_pool_1'),
Flatten(name = 'flatten'),
Dense(units = 6, activation = "softmax", name = 'logit')])
#設定損失函式loss、優化器optimizer、評價標準metrics
model.compile(loss="categorical_crossentropy",
optimizer = tf.keras.optimizers.SGD(learning_rate = 0.001),
metrics = ["accuracy"])
適用場合:對於順序結構的模型(沒有多個輸入輸出,也沒有分支),優先使用Sequential
方法構建。
缺點:不能建立以下模型結構
- 共享層
- 模型分支
- 多個輸入分支
- 多個輸出分支
2. Keras
函式式API建立模型,程式碼示例:
#輸入層input
input = input(shape = (64, 64, 3), name = 'input')
#卷積層conv_1_2
x = Conv2D(filters = 32, kernel_size = 3, activation = 'relu', name = 'conv_1_1')(input)
#卷積層con_1_2
x = Conv2D(filters = 32, kernel_size = 3, activation = 'relu', name = 'conv_1_2)(x)
#池化層max_pool_1
x = MaxPool2D(pool_size = 2, name = 'max_pool_1)(x)
#展平層
x = Flatten(name = 'flatten')(x)
#全連線層
output = Dense(units = 6, activation = "softmax", name = 'logit')(x)
model = Model(inputs = input, outputs = output)
#設定損失函式loss、優化器optimizer、評價標準metrics
model.compile(loss="categorical_crossentropy",
optimizer = tf.keras.optimizers.SGD(learning_rate = 0.001),
metrics = ["accuracy"])
適用場合:如果模型有多輸入或者多輸出,或者模型需要共享權重,或者模型具有分支連線、迴圈連線等非順序結構,推薦使用函式式API進行建立。
3. Keras Model Subclassing
方式,程式碼示例:
#定義一個子類來搭建模型
class ConvModel(Model):
def __init__(self):
#父類初始化
super(ConvModel, self).__init__()
#卷積層conv_1_1
self.conv_1_1 = Conv2D(input_shape = (64, 64, 3),
filters = 32, kernel_size = 3, activation = 'relu', name = 'con_1_1')
#卷積層conv_1_2
self.conv_1_2 = Conv2D(filters = 32, kernel_size = 3,
activation = 'relu', name = 'conv_1_2')
#池化層max_pool_1
self.max_pool_1 = MaxPool2D(pool.size = 2, name = 'max_pool_1')
#展平層flatten
self.dense = Dense(units = 6, activation = "softmax", name = 'logit')
def call(selfm, x):
x = self.conv_1_1(x)
x = self.conv_1_2(x)
x = self.max_pool_1(x)
x = self.conv_2_1(x)
x = self.conv_2_2(x)
x = self.max_pool_2(x)
x = self.flatten(x)
x = self.dense(x)
return x
#類例項化
model = ConvModel()
構造tf.keras.Model
的子類來編寫模型,需要覆寫Model類中的__init__
方法和call
方法。
__init__
方法中定義我們要使用的層,這裡可以使用Keras
自帶的層;
call
方法中實現模型的網路層。
適用場合:需要編寫自定義的模型,如在網路中使用自定義的層、自定義的損失函式、自定義的啟用函式等。