向后传播 - 渐变错误[Python]

时间:2017-08-15 11:49:29

标签: python machine-learning deep-learning gradient

我正在通过Andrew Ng新的深度学习Coursera课程,第2周。

我们应该实施逻辑回归算法 我陷入渐变代码(dw) - 给我一个语法错误。

算法如下:

import numpy as np

def propagate(w, b, X, Y):
    m = X.shape[1]

    A = sigmoid(np.dot(w.T,X) + b )  # compute activation
    cost = -(1/m)*(np.sum(np.multiply(Y,np.log(A)) + np.multiply((1-Y),np.log(1-A)), axis=1)    

    dw =(1/m)*np.dot(X,(A-Y).T)
    db = (1/m)*(np.sum(A-Y))
    assert(dw.shape == w.shape)
    assert(db.dtype == float)
    cost = np.squeeze(cost)
    assert(cost.shape == ())

    grads = {"dw": dw,
             "db": db}

    return grads, cost

为什么我继续获取此语法错误的任何想法?

File "<ipython-input-1-d104f7763626>", line 32
    dw =(1/m)*np.dot(X,(A-Y).T)
     ^
SyntaxError: invalid syntax

3 个答案:

答案 0 :(得分:4)

安德鲁·吴是灵感的,不可思议但是,为了更好的代码设计,可能会采取一些步骤:

提示1
如果认真维护更大的代码库,请开始使用更好的IDE,两者兼备 (a)括号 - 与GUI突出显示匹配,以及
(b)支持跳转到匹配的括号KBD快捷方式

    cost = - ( 1 / m ) * ( np.sum(   np.multiply(       Y,   np.log(     A ) )
                                   + np.multiply( ( 1 - Y ), np.log( 1 - A ) ),
                                   axis = 1
                                   )
                           ) # missing-parenthesis

提示2:
在所有教学大纲任务得到自动评分之后,尝试提高代码性能 - 并非所有步骤都经过性能优化,这对小规模学习任务来说是宽容的,而一旦缩放到较大的 {{ N 维度中的 O( N^k ) 中的1}}

对于1E + 3而言似乎足够耐用,无法为1E + 6或1E + 9个示例提供训练,如果某些ML管道迭代ML模型的“HyperPARAMETER” {{1 }} - 搜索域名。那伤害了。然后,一旦[PTIME,PSPACE] - 问题大小不适合RAM内处理中的计算基础架构,就会开始更谨慎地制定代码以进行权衡,以过高的[EXPTIME,EXPSPACE][PTIME]付费。

其中?

- 避免对同一事物进行重复计算,如果将数组考虑在内则越多(在所有迭代方法中, ML管道中的越多+ ML-model-HyperPARAMETER'很大,实际上VAST SPACE搜索
每次浪费[ns]很快就会变成累积[us],如果不是[ms],每个< / strong>浪费[ms]很快就会长成累积[s],如果不是几十[min],每次浪费[min]很快就会累积成[hrs],如果不是[天...]是的,可以在代码设计不佳的情况下放松一天)

示例:

[EXPTIME]

[PSPACE]是一个很好的设计实践,但是# here, A[] is .ALLOC'd + .SET -----------------------------[PTIME] A = sigmoid( np.dot( w.T, X ) + b ) # compute activations, .SET in A[] # ----------------------------------------------------------[PTIME]-cost was paid cost = -( 1 / m ) * ( np.sum( np.multiply( Y, np.log( A ) ) + np.multiply( (1 - Y ), np.log( 1 - A ) ), axis = 1 ) ) # ----------------------------------------------------------[PTIME]-cost again? dw = ( 1 / m ) * np.dot( X, ( A - Y ).T ) # consumes ( A - Y ) db = ( 1 / m ) * ( np.sum( A - Y ) ) # consumes ( A - Y ) again # ----------------------------------------------# last but not least, # # A[] is not consumed # # till EoFun/return # a better approach is to use powerful + faster [PTIME] numpy in-place operations # that also avoid additional dynamic allocation [PSPACE] -> saving more [PTIME] DIV_byM = 1 / m # re-use O(N^2) times A -= Y # way faster in-place + re-used # ----------------------------------------------# [PTIME]-cost avoided 2x dw = np.dot( X, A.T ) # +1st re-use dw *= DIV_byM # way faster in-place assert( dw.shape == w.shape and "INF: a schoolbook assert()-ion test, " and "of not much value in PRODUCTION-code" ) return { 'dw': dw, 'db': DIV_byM * np.sum( A ) # +2nd re-use } # MUCH better to design # # the whole as in-place mods # # of static .ALLOC'd np.view-s, # # instead of new dict()-s 扩展对成熟代码更重要 - 评估的一个好习惯:

一个好的工程实践是将一个人自己的代码与一些现实的操作状态/条件进行对比。

鉴于使用了,人们可以假设一组缩放视野 - 一个~20 M神经元,一个~30 M神经元 - 来基准和自我记录代码执行时间:

[TEST-ME]

答案 1 :(得分:2)

在第cost = ...行中,您最后缺少一个括号,或者只删除*之后的一个括号:

# ...
cost = -(1/m)*np.sum(np.multiply(Y,np.log(A)) + np.multiply((1-Y),np.log(1-A)), axis=1)
# ...

答案 2 :(得分:0)

“费用”行中缺少一个右括号“)”,从而在下一行中生成语法错误。

尝试一下-

cost = -(1/m) * sum(np.multiply(Y, np.log(A)) + np.multiply((1 - Y), np.log(1 - A)))