PyTorch - Как установить правила активации нейронов для повышения эффективности нейронной сети? - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь создать нейронную сеть обратного распространения с PyTorch.Я могу успешно выполнить и проверить ее точность, но она работает не очень эффективно.Теперь я должен повысить его эффективность, установив различные правила активации для нейронов, чтобы те нейроны, которые не участвуют в окончательном выводе, исключались (сокращались) из вычислений, тем самым увеличивая время и точность.

Мой код выглядит следующим образом (извлеченные фрагменты) -

# Hyper Parameters
input_size = 20
hidden_size = 50
num_classes =130
num_epochs = 500
batch_size = 5
learning_rate = 0.1

# normalise input data
for column in data:
# the last column is target
if column != data.shape[1] - 1:
    data[column] = data.loc[:, [column]].apply(lambda x: (x - x.mean()) / x.std())

# randomly split data into training set (80%) and testing set (20%)
msk = np.random.rand(len(data)) < 0.8
train_data = data[msk]
test_data = data[~msk]

# define train dataset and a data loader
train_dataset = DataFrameDataset(df=train_data)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# Neural Network
class Net(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.sigmoid = nn.Sigmoid()
        self.fc2 = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        out = self.fc1(x)
        out = self.sigmoid(out)
        out = self.fc2(out)
        return out
net = Net(input_size, hidden_size, num_classes)

# train the model by batch
for epoch in range(num_epochs):
    for step, (batch_x, batch_y) in enumerate(train_loader):
        # convert torch tensor to Variable
        X = Variable(batch_x)
        Y = Variable(batch_y.long())

        # Forward + Backward + Optimize
        optimizer.zero_grad()  # zero the gradient buffer
        outputs = net(X)
        loss = criterion(outputs, Y)
        all_losses.append(loss.data[0])
        loss.backward()
        optimizer.step()

        if epoch % 50 == 0:
            _, predicted = torch.max(outputs, 1)
            # calculate and print accuracy
            total = predicted.size(0)
            correct = predicted.data.numpy() == Y.data.numpy()

            print('Epoch [%d/%d], Step [%d/%d], Loss: %.4f, Accuracy: %.2f %%' % (epoch + 1, num_epochs, step + 1, len(train_data) // batch_size + 1, loss.data[0], 100 * sum(correct)/total))

Может кто-нибудь сказать мне, как это сделать в PyTorch, так как я очень новичок в PyTorch.

1 Ответ

0 голосов
/ 25 апреля 2018

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

ReLU (x) - это идентификатор положительного домена и 0 для отрицательного домена в Python, который будет записан какследует:

def ReLU(x):
    if(x > 0):
        return x
    else:
        return 0

Он должен быть легко доступен в PyTorch

...