【问题标题】:Neural net optimization failing (using Scipy fmin_cg)神经网络优化失败(使用 Scipy fmin_cg)
【发布时间】:2016-07-27 05:02:51
【问题描述】:

只是一点上下文:我正在尝试实现一个 3 层神经网络(1 个隐藏层),用于在 Cifar-10 数据集上进行图像分类。我已经实现了反向传播,最初尝试简单地使用梯度下降来训练网络,但我的成本稳定在 40 左右(这有效地以相同的随机猜测率对新图像进行分类;实际上毫无意义)。

然后我尝试使用scipy.optimize.fmin_cg 函数来训练网络。我将展开的权重传递给函数,我的反向传播函数返回相同大小的梯度向量,满足函数的输入要求。

我的函数实现如下所示:

scipy.optimize.fmin_cg(cost, iw, fprime=fit_slim)

fitfit_slim 函数如下:

def fit(X, Y, w, l, predict=False, x=None):
    w_grad = ([np.mat(np.zeros(np.shape(w[i]))) 
              for i in range(len(w))])
    for i in range(len(X)):
        x = x if predict else X[i]
        y = Y[i]
        # forward propagate
        a = x
        a_s = []
        for j in range(len(w)):
            a = np.mat(np.append(1, a)).T
            a_s.append(a)
            z = w[j] * a
            a = sigmoid(z)
        if predict: return a
        # backpropagate
        delta = a - y.T
        w_grad[-1] += delta * a_s[-1].T
        for j in reversed(range(1, len(w))):
            delta = delta[1:] if j != len(w)-1 else delta
            delta = np.multiply(w[j].T*delta, s_prime(a_s[j]))
            w_grad[j-1] += (delta[1:] * a_s[j-1].T)
    # regularization
    for i in range(len(w)):
        w_grad[i] /= len(X)
        w_grad[i][:,1:] += (l/len(X)) * w[i][:,1:]
    return flatten(w_grad).T

def fit_slim(iw):
    iw = shape_back(iw)
    return fit(X, Y, iw, l)

cost 函数是:

def cost(iw):
    J = 0
    m = len(X)
    iw = shape_back(iw)
    for i in range(m):
        h = fit(X, Y, iw, l, True, X[i])
        J += ((1.0/m)*(np.sum((np.multiply(-Y[i],np.log(h))-
              np.multiply((1-Y[i]),np.log(1-h))).flatten())))
    for i in range(len(w)):
        J += np.sum(((l/(2.0*m))*np.power(w[i],2)).flatten())
    return J

iw 变量是将展开的权重转换为长向量,shape_back 函数只是将iw 重新整形为原始矩阵形状,以便在fitcost 函数中使用。

我面临的第一个问题是我的fit 函数需要永远运行一次迭代。永远,我的意思是大约一分钟,这似乎很慢。尽管如此,我已经让它一直运行到成本稳定在 40 左右,正如我所提到的,这仍然是一个非常高的成本。也就是说,实现一种替代优化技术对我来说似乎是合理的,我解决了 fmin_cg 函数。

当我运行它时,我收到以下错误:

  File "image_net.py", line 143, in <module>
    print scipy.optimize.fmin_cg(cost, iw, fprime=fit_slim, maxiter=2,  callback=callback)
  File "/Users/samgriesemer/anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1092, in fmin_cg
    res = _minimize_cg(f, x0, args, fprime, callback=callback, **opts)
  File "/Users/samgriesemer/anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1156, in _minimize_cg
    deltak = numpy.dot(gfk, gfk)
ValueError: shapes (616610,1) and (616610,1) not aligned: 1 (dim 1) != 616610 (dim 0)

在我看来,该函数正在尝试获取同一向量的点积,这对我来说没有任何意义。

所以回顾一下我的问题,我有两个问题。

1) 我能做些什么来更好地优化我的fit 函数吗?我的数据集有 10,000 个示例,所以我知道循环遍历所有示例需要时间,但它不明白为什么即使经过多次迭代,我的成本仍然很高。

2) 为什么我在运行fmin_cg 函数时会收到错误消息?我传递给函数的参数是相同大小的向量。我不明白为什么它会尝试在函数中取相同大小向量的点积。

非常感谢任何能够阐明这些问题/误解的人。

【问题讨论】:

    标签: python numpy scipy neural-network backpropagation


    【解决方案1】:

    在我看来,该函数正在尝试获取同一向量的点积,这对我来说没有任何意义。

    numpy.dot 不是这样工作的。问题正是错误消息所说的:它尝试执行矩阵乘法,但由于维度不匹配而失败。

    请注意,对于可以认为是“一维”的数组,numpy 区分形状(n,)(n, 1)(1, n):只有第一个是一维对于 numpy,它 not 被解释为行或列向量。

    >>> a = np.ones(3)      # a 1D array
    >>> np.dot(a, a)
    3.0
    >>> b = a.reshape(-1, 1)   # a column vector
    >>> b
    array([[ 1.],
           [ 1.],
           [ 1.]])
    >>> np.dot(b, b)           # column times column, fails
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: shapes (3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0)
    >>> np.dot(b, b.T)        # column times row, i.e. an outer product
    array([[ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    >>> np.dot(b.T, b)        # row times column, but notice the dimensions
    array([[ 3.]])            
    

    【讨论】:

    • 我不知道这一点,感谢您为我解决这个问题。
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2017-01-24
    • 1970-01-01
    • 2012-12-29
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多