我有一组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'])
但是,我似乎找不到要用于输出层的激活类型,以使我具有多个输出值? 我该如何设置?
答案 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]范围内。
您可以将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)