我正在通过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
答案 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
扩展对成熟代码更重要 - 评估的一个好习惯:一个好的工程实践是将一个人自己的代码与一些现实的操作状态/条件进行对比。
鉴于使用了deep-learning,人们可以假设一组缩放视野 - 一个~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)))