簡體   English   中英

建立具有多標簽分類的CNN網絡

[英]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.roundtf.where提取標簽:

indices = tf.where(tf.round(output) > 0.5)
final_output = tf.gather(x, indices)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM