1. 程式人生 > 其它 >3.3 keras模型構建的三種方式

3.3 keras模型構建的三種方式

技術標籤:視覺

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方法中實現模型的網路層。

適用場合:需要編寫自定義的模型,如在網路中使用自定義的層、自定義的損失函式、自定義的啟用函式等。