[英]Setting up a CNN network with multi-label classification
我有一組100x100的圖像,以及一個與輸入大小(即10000長)相對應的輸出數組,其中每個元素可以是1或0。
我正在嘗試使用TensorFlow / Keras編寫一個python程序來訓練有關此數據的CNN,但是,我不確定如何設置圖層來處理它或要使用的網絡類型。
目前,我正在執行以下操作(基於TensorFlow教程):
model = keras.Sequential([
keras.layers.Flatten(input_shape=(100, 100)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10000, activation=tf.nn.softmax)
])
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
但是,我似乎找不到用於輸出層的激活類型,以使我具有多個輸出值? 我該如何設置?
我不確定如何設置圖層來處理它。
您的代碼是處理此問題的一種方法,但正如您可能在文獻中所讀到的那樣,它並不是最佳方法。 最先進的模型通常使用2D Convolution Neural Networks
。 例如:
img_input = keras.layers.Input(shape=img_shape)
conv1 = keras.layers.Conv2D(16, 3, activation='relu', padding='same')(img_input)
pol1 = keras.layers.MaxPooling2D(2)(conv1)
conv2 = keras.layers.Conv2D(32, 3, activation='relu', padding='same')(pol1)
pol2 = keras.layers.MaxPooling2D(2)(conv2)
conv3 = keras.layers.Conv2D(64, 3, activation='relu', padding='same')(pol2)
pol3 = keras.layers.MaxPooling2D(2)(conv3)
flatten = keras.layers.Flatten()(pol3)
dens1 = keras.layers.Dense(512, activation='relu')(flatten)
dens2 = keras.layers.Dense(512, activation='relu')(dens1)
drop1 = keras.layers.Dropout(0.2)(dens2)
output = keras.layers.Dense(10000, activation='softmax')(drop1)
我似乎找不到要用於輸出層的激活類型,以使我具有多個輸出值
Softmax
是一個不錯的選擇。 它將任意實數值的K維向量壓縮為實數值的K維向量,其中每個條目的范圍為(0,1]。
您可以將Softmax
輸出輸出到top_k
函數,以提取前k個預測:
softmax_out = tf.nn.softmax(logit)
tf.nn.top_k(softmax_out, k=5, sorted=True)
如果您需要multi-label classification
,則應更改上述網絡。 上次激活功能將更改為S型:
output = keras.layers.Dense(10000, activation='sigmoid')(drop1)
然后使用tf.round
和tf.where
提取標簽:
indices = tf.where(tf.round(output) > 0.5)
final_output = tf.gather(x, indices)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.