Как использовать CNN для классификации пикселей? - PullRequest
0 голосов
/ 29 января 2019

Я уже узнал о некоторой классификации, использующей CNN, как для Mnist.Но недавно я получил набор данных, который состоит из набора векторов.Обычный набор данных изображения (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 голосов
/ 29 января 2019

Я предполагаю, что вы должны сделать это сегментация изображения и в форме полученных вами меток последнее измерение 200 соответствует 200 возможным категориям пикселей (это звучит какя, но без большего контекста я не могу судить).Проблема сегментации изображения в способе слишком широка, чтобы объяснить его в SO-ответе, но я предлагаю вам проверить такие ресурсы, как это руководство и проверить влиятельное документов в этом поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...