【问题标题】:PyTorch - How to set Activation Rules of neurons to increase efficiency of Neural Network?PyTorch - 如何设置神经元的激活规则以提高神经网络的效率?
【发布时间】:2018-04-26 07:31:15
【问题描述】:

我正在尝试使用 PyTorch 制作反向传播神经网络。我可以成功执行并测试它的准确性,但它的工作效率不是很高。现在,我应该通过为神经元设置不同的激活规则来提高它的效率,这样那些对最终输出没有贡献的神经元就会从计算中排除(修剪),从而增加时间和准确性。

我的代码看起来像这样(提取的 sn-ps)-

# 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 很陌生。

【问题讨论】:

    标签: python pandas neural-network pytorch


    【解决方案1】:

    我不确定这个问题是否应该出现在 stackoverflow 上,但无论如何我都会给你一个提示。您目前正在使用 sigmoid 激活函数,如果输入值太大或太小,则其梯度会消失。一种常用的方法是使用 ReLU 激活函数(表示 rectified linear unit)。

    ReLU(x) 是正域的标识,负域的标识为 0,在 Python 中可以这样写:

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

    它应该在 PyTorch 中很容易获得

    【讨论】:

    • 谢谢!这可以稍微提高准确性。但是,由于某种原因,执行在 Epochs 450/500 处停止。但是,这并不是我想要提高准确性的确切方法。
    • 你可能想澄清你的问题;)
    • 现在看起来好点了吗?
    • 明白了,你的意思是修剪的名称,甚至还有一种方法的 PyTorch 实现:jacobgil.github.io/deeplearning/pruning-deep-learning
    • 将空间维度都减少到 1,并将通道作为架构中的神经元,您就在那里。 NN 就像对大小为 1x1 的图像进行 1x1 卷积
    猜你喜欢
    • 2012-12-14
    • 2016-08-17
    • 2018-12-16
    • 2014-01-18
    • 2017-12-08
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多