如何使用CNN进行像素分类



我已经学习了一些使用CNN的分类,比如Mnist。但最近我收到了一个由向量集组成的数据集。正常图像数据集(mnist)类似于nxcxwxh。我收到的是(w*h)x1xc。目标是训练一个网络来对这些像素进行分类(据我所知,这是对像素的分类)。标签长度为地面实况图片。

我对这项工作有点困惑。据我所知,对于图像处理,我们使用具有不同接收场的CNN进行卷积运算,从而可以获得表示图像的特征。但在这种情况下,图像已经扩展到像素集。为什么卷积神经网络仍然适用?

我仍然不确定这项工作,但我开始尝试。我在网络中使用了1d卷积而不是2d。在4-Conv1d之后,输出被连接到softmax层,然后被馈送到交叉熵损失函数。看起来,我的输出维度有一些问题,所以网络无法训练。

我用pytorch来执行工作。下面是我尝试建立的网络形式。这些尺寸与交叉熵损失函数的需要不匹配。122500被设置为样本编号。所以我认为卷积是沿着1-200的方向进行的。

首先,我想知道,当我想对像素进行分类时,使用conf1d实现这样的功能是正确的吗?

如果这个想法是正确的,我如何才能继续向损失函数提供功能?

如果这是错误的,我能为这类工作提供一些类似的例子吗?我是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)

我想你应该做的是图像分割,在你得到的标签的形状中,200的最后一个维度对应于200个可能的像素类别(这对我来说听起来很多,但如果没有更多的上下文,我无法判断)。图像分割的问题是方式过于宽泛,无法在SO答案中解释,但我建议您查看本教程等资源,并查看该领域有影响力的论文。

最新更新