Deep learning 如何使用动态输入创建用于图像分类的CNN

Deep learning 如何使用动态输入创建用于图像分类的CNN,deep-learning,conv-neural-network,Deep Learning,Conv Neural Network,我想在pytorch中创建一个用于二值图像分类的完全卷积网络,该网络可以获取动态输入图像大小,但我在概念上不太理解将最后一层从完全连接层更改为卷积层背后的想法。这两种方法都表示,通过使用1x1卷积,这是可能的 假设我有一个16x16x1的图像作为CNN的输入。经过多次卷积后,输出为16x16x32。如果使用完全连接的层,我可以通过创建16*16*32权重并将其输入单个神经元来产生单个值输出。我不明白的是,如何通过应用1x1卷积得到单值输出。您不会以16x16x1输出结束吗?检查此链接: 在这种情

我想在pytorch中创建一个用于二值图像分类的完全卷积网络,该网络可以获取动态输入图像大小,但我在概念上不太理解将最后一层从完全连接层更改为卷积层背后的想法。这两种方法都表示,通过使用1x1卷积,这是可能的

假设我有一个16x16x1的图像作为CNN的输入。经过多次卷积后,输出为16x16x32。如果使用完全连接的层,我可以通过创建16*16*32权重并将其输入单个神经元来产生单个值输出。我不明白的是,如何通过应用1x1卷积得到单值输出。您不会以16x16x1输出结束吗?

检查此链接:

在这种情况下,卷积层应该是一个具有1个输出通道的16 x 16滤波器。这将把16 x 16 x 32输入转换为单个输出

要测试的示例代码:

from keras.layers import Conv2D, Input
from keras.models import Model
import numpy as np
input = Input((16,16,32))
output = Conv2D(1, 16)(input)
model = Model(input, output)
print(model.summary()) # check the output shape
output = model.predict(np.zeros((1, 16, 16, 32))) # check on sample data
print(f'output is {np.squeeze(output)}')
这种完全卷积网络的方法在使用基于面片的方法的分割任务中非常有用,因为可以通过提供更大的图像部分来加速预测引用

对于分类任务,通常在末尾有一个fc层。在这种情况下,使用类似AdaptiveAvgPool2d的层,以确保fc层看到恒定的输入特征大小,而与输入图像大小无关。

请参阅torchvision VGG的拉动请求:

如果是Keras,则为GlobalAveragePoolig2D。请参见示例,在一组新类上微调InceptionV3。

我希望你更熟悉凯拉斯。现在看你的图像是16*16*1。图像将传递到keras颜色层,但首先我们必须创建模型。像model=Sequential这样,我们可以得到keras模型实例。现在,我们将给出我们的卷积层,参数如下

model.add(Conv2D(20,(2,2),padding="same"))
现在我们在图像中添加20个过滤器。现在我们的图像变成了16*16*20,为了获得更多的最佳功能,我们添加了更多conv层,如

model.add(Conv2D(32,(2,2),padding="same"))
现在,我们为您的图像添加32个过滤器。在此之后,您的图像大小将为16*16*32

别忘了在conv层之后放置激活。如果你是新手,你应该学习网络的激活、优化和丢失。这些是神经网络的基本部分

现在是向完全连接层移动的时候了。首先,我们需要展平我们的图像,因为完全连接的层只在2d向量上工作,在你们的情况下,没有图片 应用展平后的imgae尺寸将为16*16*32

model.add(Flatten())
在平坦化我们的图像后,您的网络将把它提供给完全连接的层

    model.add(Dense(32))
    model.add(Activation("relu"))
    model.add(Dense(8))
    model.add(Activation("relu"))
    model.add(Dense(2)) 
因为你有一个二元分类的问题,如果你必须分类3个类,那么最后一层将有3个神经元,如果你必须分类10个例子,那么最后一个密集层将有10个神经元

model.add(Activation("softmax"))
    model.compile(loss='binary_crossentropy',
                  optimizer=Adam(),
                  metrics=['accuracy'])
   return model
在这之后,你必须适应这个模型

estimator=model()
estimator.fit(X_train,y_train)
完整代码:

def model (classes):
    model=Sequential()

        # conv2d set  =====> Conv2d====>relu=====>MaxPooling
    model.add(Conv2D(20,(5,5),padding="same"))
    model.add(Activation("relu"))
    model.add(Conv2D(32,(5,5),padding="same"))
    model.add(Activation("relu"))

    model.add(Flatten())
    model.add(Dense(32))
    model.add(Activation("relu"))
    model.add(Dense(8))
    model.add(Activation("relu"))
    model.add(Dense(2))

        #now adding Softmax Classifer because we want to classify 10 class

    model.add(Dense(classes))
    model.add(Activation("softmax"))
    model.compile(loss='categorical_crossentropy',
                  optimizer=Adam(lr=0.0001, decay=1e-6),
                  metrics=['accuracy'])
    return model

这是否意味着我无法在不知道输入图像大小的情况下训练CNN进行二值分类,因为我需要这些信息来设置内核大小?