建立具有多标签分类的CNN网络

时间:2018-08-24 18:39:40

标签: python tensorflow keras

我有一组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'])

但是,我似乎找不到要用于输出层的激活类型,以使我具有多个输出值? 我该如何设置?

1 个答案:

答案 0 :(得分:1)

  

我不确定如何设置图层来处理它。

您的代码是处理此问题的一种方法,但正如您在文献中可能会读到的那样,它并不是最好的方法。最先进的模型通常使用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]范围内。

您可以将Softmaxtop_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)