以下三個方法都使用同樣的model數量及階層,但會使用不同的方法撰寫。
方法1 初階使用方法,適合只使用一次的狀況,這樣子做既快又有效率
# 直接定義model 層數及類型
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(img_height, img_width, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')
])
方法2 建立一個python function,這就有機會在不直接修改model下,修改他的input數目以及全連階層的數目,需要開放甚麼接口可以自己在新增。
def model_setting(rows, cols, channel, dense1, dense2):
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(rows, cols, channel)),
tf.keras.layers.Dense(dense1, activation='relu'),
# tf.keras.layers.Dropout(0.05),
tf.keras.layers.Dense(dense2, activation='softmax')
])
return model
方法3 建立一個class 定義自己的model,跟方法二雷同
我覺得方法3的好處是可以快速切換model模型,只要我的model指向不同模型的塊就可以完成了,所以這些model可以多多建立起來,以便後面操作使用。
class SimpleDenseModel(tf.keras.Model):
def __init__(self, rows=10, cols=10, channels=3, class_count=3, name="Simple_Dense_Model", **kwargs):
super(SimpleDenseModel, self).__init__(name=name, **kwargs)
self.flatten = tf.keras.layers.Flatten(input_shape=(rows, cols, channels))
self.dense1 = tf.keras.layers.Dense(128, activation='relu')
self.dense2 = tf.keras.layers.Dense(class_count, activation='softmax')
def call(self, inputs):
x = self.flatten(inputs)
x = self.dense1(x)
return self.dense2(x)
方法三在使用上,會發現跟方法一、方法二有差異,首先是在呼叫summary的部分,方法一、二都可以直接建立完model後直接使用summary看看層數,但方法三無法,需要先呼叫過build或是fit函式後,才可以呼叫,詳細可以參考下面這篇。自行build的library與原生model的差異