【问题标题】:CNN weights getting stuckCNN 权重卡住了
【发布时间】:2018-12-24 03:42:09
【问题描述】:

这是一个有点理论的问题。下图描绘了 CNN 正在接受训练时的损失。 Y轴为MSE,X轴为Epochs数。

CNN 描述:

class Net(nn.Module):

def __init__ (self):
    super(Net, self).__init__()
    self.conv1 = nn.Conv1d(in_channels = 1, out_channels = 5, kernel_size = 9) #.double
    self.pool1 = nn.MaxPool1d(3)
    self.fc1 = nn.Linear(5*30, 200)
    #self.dropout = nn.Dropout(p = 0.5)
    self.fc2 = nn.Linear(200, 99)

def forward(self, x):
    x = self.pool1(F.relu(self.conv1(x)))
    x = x.view(-1, 5 * 30)
    #x = self.dropout(F.relu(self.fc1(x)))
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return x

def init_weights(m):
    if type(m) == nn.Linear:
       nn.init.xavier_uniform_(m.weight)
       m.bias.data.fill_(0.01)


 net = Net()
 net.apply(init_weights)

 criterion = nn.MSELoss()
 optimizer = optim.Adam(net.parameters(), lr=0.01-0.0001) # depends

输入和输出都是一个数字数组。这是一个多元回归输出问题。

如果我使用较低的学习率,损失/权重卡在错误位置的问题不会发生太多。但是,它仍然会发生。从某种意义上说,这意味着由 CNN 的参数创建的超维空间带有许多局部最小值。这可能是真的,因为 CNN 的输入非常相似。增加卷积层和全连接线性的 CNN 层是否有助于解决这个问题,因为它们的超维空间可能更平滑?还是这种直觉完全不正确? 一个更广泛的问题,你应该何时倾向于添加更多的卷积层?我知道在实践中你几乎不应该从头开始,而是使用另一个模型的前几层。但是,我使用的输入与我在网上找到的任何输入都非常不同,因此无法做到这一点。

【问题讨论】:

    标签: conv-neural-network pytorch gradient hyperparameters


    【解决方案1】:

    这是一个多类分类问题吗?如果是这样,您可以尝试使用cross entropy loss。和输出之前的softmax层可能吗?我不确定,因为我不知道模型的输入和输出是什么。

    【讨论】:

    • 我很抱歉没有指定。输入和输出都是数字数组。这是一个多元回归输出问题。
    • 尝试增加conv1d层的输出通道?有 5 个输出通道和 9 个内核大小,它只有 50 个可学习参数(45 个权重 + 5 个偏差),而 fc1 有 30200 个。也许还不够?
    • 我减小了内核大小并增加了输出数量,它似乎工作得稍微好一些;但是,准确性稍微变差了。从概念上讲,您什么时候决定增加参数?这只是一个非常迭代的过程吗?更改激活功能也有帮助吗?因为 RELU 刚刚变为 0?
    • 我认为这取决于要解决的问题的复杂性。迭代是的,但我更喜欢使用一个既宽又深的模型来看看它是如何工作的;如果结果正常,则减少层或参数以获得(次)最佳模型大小。
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多