Почему увеличение количества слоев не делает мою сеть более точной? - PullRequest
0 голосов
/ 31 января 2020

Я надеюсь, что некоторые из вас могут помочь мне с этим:

Итак, у меня есть сеть, состоящая из 36 входов. Обычно эта сеть имеет более полумиллиона полей данных, но в настоящее время я работаю с меньшим количеством данных. (Около 40.000 данных)

Цель сетей - предсказать количество людей в комнате в зависимости от их среды. Окружение представлено 36 входными нейронами.

Во-первых, я попытался использовать 4 слоя с 36 входами и выходами. Абсолютная разница между прогнозируемыми людьми и количеством людей, которые должны быть там, составляет около 160. Это довольно много, когда сумма перемещается только между 0 и 2100. Когда я делаю это со всеми данными, это около 200.

Итак, теперь я попытался увеличить количество слоев и нейронов в моей сети. Как вы можете видеть в моем коде, у меня есть 10 слоев, все они имеют по крайней мере 10.000 выходных нейронов. Как может быть, что моя сеть все еще настолько неточна? Влияет ли изменение на мою сеть каким-либо образом? Может кто-нибудь сказать мне, пожалуйста? Я знаю схему нейронных сетей, и увеличение всех этих параметров должно помочь ... обычно ...

Итак, это мой класс сети:

    class Network(nn.Module):
    def __init__(self):
        super(Network, self).__init__()
        self.linear1 = nn.Linear(36, 10000)  #36 Input-Neurons, 36 Output-Neurons, Linearer Layer
        self.linear2 = nn.Linear(36, 10000)
        self.linear3 = nn.Linear(36, 10000)
        self.linear4 = nn.Linear(36, 10000)
        self.linear5 = nn.Linear(36, 20000)
        self.linear6 = nn.Linear(36, 20000)
        self.linear7 = nn.Linear(36, 10000)
        self.linear8 = nn.Linear(36, 10000)
        self.linear9 = nn.Linear(36, 10000)
        self.linear10 = nn.Linear(36, 1)


    def forward(self, x):
        pax_predict = F.torch.relu(self.linear1(x))
        pax_predict = F.torch.relu(self.linear2(x))
        pax_predict = F.torch.relu(self.linear3(x))
        pax_predict = F.torch.relu(self.linear4(x))
        pax_predict = F.torch.relu(self.linear5(x))
        pax_predict = F.torch.relu(self.linear6(x))
        pax_predict = F.torch.relu(self.linear7(x))
        pax_predict = F.torch.relu(self.linear8(x))
        pax_predict = F.torch.relu(self.linear9(x))
        pax_predict = self.linear10(x)
        return pax_predict

    def num_flat_features(self, pax_predict):
        size = pax_predict.size()[1:]
        num = 1
        for i in size:
            num *= i
        return num



network = Network()
print('Netzwerk:')
print(network)
print()

После обучения:


optimizer = torch.optim.Adam(network.parameters(), lr=50)
#optimizer = torch.optim.SGD(network.parameters(), lr=0.0022, momentum=0.8)



switch = 1


def training():

    target = y_train_tensor

    for epoch in range(200):

        input = x_train_tensor
        y_prediction = network(input)
        loss = criterion(y_prediction, target)
        wurzel = math.sqrt(loss)
        loss_avg = loss /len(y_train_tensor)
        wurzel_avg = math.sqrt(loss_avg)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        print('Epoch:', epoch, ' Total Loss:', loss.data,'Sqroot:', wurzel)
        print('Average Loss:', loss_avg, 'Avg. Sqrt:', wurzel_avg)
        print()

        plt.scatter(epoch, loss_avg.data, color='r', s=10, marker='.')


    plt.xlabel('Epochen')
    plt.ylabel('Loss')
    plt.savefig('./plot/loss/figure.png', dpi = 300)


    ## Gewichtsausgabe #########################################################################################
    ############################################################################################################


    weights_list = list(network.parameters())
    print('Gewichtsliste:')
    print (weights_list)

    weights_numpy = np.asarray(weights_list)

    print('Array:', weights_numpy)

Я надеюсь, что кто-то из вас сможет мне помочь.

Большое спасибо заранее! Большое сообщество

С уважением, Кристиан Рихтер

...