如何使用CNN进行像素分类?

时间:2019-01-29 17:11:12

标签: conv-neural-network pixel pytorch

我已经了解了使用NNist进行CNN分类的方法。但是最近我收到了一个由向量​​集组成的数据集。普通图像数据集(mnist)类似于nxcxwxh。我收到的是(w * h)x1xc。目标是训练网络对这些像素进行分类(据我所知,是对像素进行分类)。标签长度为地面图片。

我对这项工作有些困惑。据我了解,对于图像处理,我们使用具有不同接收范围的CNN进行卷积操作,以便获得代表图像的特征。但是在这种情况下,图像已经扩展到像素集。为什么卷积神经网络仍然合适?

我仍然不确定这项工作,但我开始尝试。我在网络中使用1d卷积而不是2d卷积。 4-Conv1d之后,将输出连接到softmax层,然后馈入交叉熵损失函数。看来,我在输出尺寸方面存在一些问题,因此网络无法进行训练。

我使用pytorch来完成这项工作。以下是我尝试构建的网络表格。尺寸与交叉熵损失函数的尺寸不匹配。将122500设置为样本编号。所以我认为卷积是沿1-200方向进行的。

首先,我想知道,当我要对像素进行分类时,是否可以使用conv1d这样的实现?

如果这个想法是正确的,我如何继续将功能提供给损失功能?

如果这是错误的,我可以为这种工作提供一些类似的例子吗?我是python的新手,所以,如果有一些愚蠢的错误,请指出。

谢谢。

class network(nn.Module):
"""
    Building network

"""
def __init__(self):
    super(network, self).__init__()
    self.conv1 = nn.Conv1d(in_channels = 1,out_channels = 32,stride = 1,kernel_size = 3)
    self.conv2 = nn.Conv1d(in_channels = 32,out_channels = 64,stride = 1,kernel_size = 3)
    self.conv3 = nn.Conv1d(in_channels = 64,out_channels = 128,stride = 1,kernel_size = 3)
    self.conv4 = nn.Conv1d(in_channels = 128,out_channels = 256,stride = 1,kernel_size = 3)
    self.fc = nn.Linear(13, 2)

def forward(self,s):
    s = self.conv1(s)
    s = F.relu(F.max_pool1d(s, 2)) 
    s = self.conv2(s)
    s = F.relu(F.max_pool1d(s, 2)) 
    s = self.conv3(s)
    s = F.relu(F.max_pool1d(s, 2)) 
    s = self.conv4(s)
    s = F.relu(F.max_pool1d(s, 2)) 

    s = self.fc(s)

    s = F.softmax(s,1)


output = model(input)
loss = loss_fn(output, labels)

1 个答案:

答案 0 :(得分:1)

我猜您应该做的是image segmentation,按照您得到的标签的形状,最后一个200的尺寸对应200个可能的像素类别(这对我来说听起来很多,但是没有更多背景,我无法判断)。图像分割的问题太宽泛了,无法在SO答案中进行解释,但是我建议您检查诸如this tutorial之类的资源并检查influential papers在这个领域。