我在Andrew Ng的深度学习课程中看到了一种在图像https://www.youtube.com/watch?v=GSwYGkTfOKk上定位单个对象的方法。 据我了解,您可以例如将一个点绑定到对象的特定部分,将坐标:x,y作为标签y并训练CNN。
我想训练一个CNN神经网络来定位我的眼睛(而不是直视)。我为我拍了200张照片:60x60像素的灰度。我标记了左眼和右眼,将标记眼的每个坐标标准化为0-1。 y标签为:[eye1的x,eye1的y,eye2的x,eye2的y]。我在MSE损失和输出层Sigmoid函数中使用了SGD优化器。
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(64, (3,3), input_shape= (60,60, 1)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Conv2D(32, (3,3)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(4, activation='sigmoid'))
sgd= tf.keras.optimizers.SGD(lr = 0.01)
model.compile(loss = 'mean_squared_error', optimizer=sgd, metrics=['accuracy'])
model.fit(x,y, batch_size=3, epochs=15, validation_split=0.2)
它不能完成此任务,那么解决此问题的方法是什么?我在某处看到了:将CNN应用于图像(我想没有密集的层),然后在来自CNN的平坦数据上,对每个x / y坐标使用线性回归(多变量logistic回归)。这是解决方案吗?据我了解,我将每个图像输入Conv和MaxPool层,然后进行Flatten,然后将数据输入lin。回归并对其进行训练,但是我不知道如何在keras中做到这一点。我是这个领域的新手,所以任何想法对我都有帮助。
答案 0 :(得分:1)
首先,对您的代码进行一些观察。
由于最后一层含有 2个以上的神经元,因此您需要使用的激活功能是 softmax ,不是乙状结肠(请注意,这是分类的情况,不是回归)。
仅在执行二进制分类时才应使用Sigmoid,而在具有两个以上的类时则不应使用Sigmoid(请注意,您也可以将softmax用于2个类,但是从较小的计算开销的角度来看,不一定建议这样做)。
您的问题既是回归又是分类!。
卷积神经网络的第一层包含64个特征图,每个特征图的内核大小为3x3。尽管将图像馈送到神经网络的方法是正确的,但您仅馈送灰度图像,而不馈送x1,x2,y1,y2坐标。
对于具有回归的ANN,请看一下本教程:https://machinelearningmastery.com/regression-tutorial-keras-deep-learning-library-python/。
您的直觉是正确的;目标检测神经网络用卷积层代替完全连接的层。 Yann LeCun甚至声称完全连接的层不应成为CNN的一部分。
由于您是该领域的新手,所以我建议采用以下管道。
1)找到用您喜欢的深度学习库(Keras / PyTorch / TensorFlow等)编写的在线github模型。
2)按照说明/教程进行操作,以便重现github用户获得的结果。
3)通过后者,您还应该了解代码/获得良好的直观了解。
4)使模型适应所需的问题。
您可以在这里开始的一个地方(这是对象检测-检测多个对象以及不同类别的对象):https://github.com/pierluigiferrari/ssd_keras。
如果您还有其他问题,请写下来,我们很乐意为您提供帮助!
答案 1 :(得分:0)
是的,您正在尝试解决回归问题,softmax
主要用于回归的情况。请尝试运行此代码,看看它是否有效。通过添加BatchNormalization
和后来在output_layer
和optimizer
中进行了一些其他修改,我对模型体系结构进行了小的更改。
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(64, (3,3), kernel_initializer='he_normal', input_shape= (60,60, 1)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Conv2D(32, kernel_initializer='he_normal', (3,3)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(64, activation='relu'))
# by default "linear" activation: a(x) = x
model.add(tf.keras.layers.Dense(4, name='output_layer'))
sgd = tf.keras.optimizers.SGD(lr = 0.01, momentum = 0.9, nesterov=True)
model.compile(loss = 'mean_squared_error', optimizer=sgd)
# ideally batch_size must be 2^n
model.fit(x,y, batch_size=2, epochs=15, validation_split=0.1)