背景
我已经完成了机器学习和神经网络的课程,在我遇到问题的下面,我们需要计算成本函数。有两种方法可以通过np.dot应用np.multiply和np.sum OR来实现。我在这个例子中分别称这些cost1和cost2。它们产生相同的结果。
问题:
我的问题是该函数(已经为我完成)断言使用isinstance()成本是浮点数。第一种方法产生一个通过该测试的值,而第二种方法则没有。但是,当我打印两个值及其关联的dtypes时,它们看起来都是浮点数,尽管cost2具有更高的精度。为什么cost2无法通过断言测试?
守则:
def compute_cost(A2, Y, parameters):
"""
Computes the cross-entropy cost given in equation (13)
Arguments:
A2 -- The sigmoid output of the second activation, of shape (1, number of examples)
Y -- "true" labels vector of shape (1, number of examples)
parameters -- python dictionary containing your parameters W1, b1, W2 and b2
Returns:
cost -- cross-entropy cost given equation (13)
"""
m = Y.shape[1] # number of example
# Compute the cross-entropy cost
### START CODE HERE ### (≈ 2 lines of code)
logprobs = np.multiply(np.log(A2), Y)
cost1 = -np.sum(logprobs)
cost2 = -np.dot(np.log(A2), Y.T)
### END CODE HERE ###
cost1 = np.squeeze(cost1) # makes sure cost is the dimension we expect.
cost2 = np.squeeze(cost2) # E.g., turns [[17]] into 17
# Troubleshooting
print(cost1.dtype,cost2.dtype)
print(cost1,cost2)
assert(isinstance(cost1, float))
assert(isinstance(cost2, float))
return cost1
A2, Y_assess, parameters = compute_cost_test_case()
print("cost = " + str(compute_cost(A2, Y_assess, parameters)))
输出:
float64 float64
0.692685886972 0.6926858869721941
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-84-92a25de13cb3> in <module>()
1 A2, Y_assess, parameters = compute_cost_test_case()
2
----> 3 print("cost = " + str(compute_cost(A2, Y_assess, parameters)))
<ipython-input-83-411aa6cb57b7> in compute_cost(A2, Y, parameters)
30
31 assert(isinstance(cost1, float))
---> 32 assert(isinstance(cost2, float))
33
34 return cost1
AssertionError:
答案 0 :(得分:4)
好的,让我从头开始。
首先,它与您提出的问题无关,而是针对科学秘书处的。 np.dot()
并不总是等于np.sum and np.multiply
,理论上它们是相等的,但是就成本函数计算而言,它们与np.dot
的计算并不相同矩阵与向量会有所不同,更不用说由于尺寸不匹配会给您带来错误。为了安全起见,请先使用相乘,然后再使用求和函数,然后可以查看此帖子以获取有关此问题的更多信息。 Python implementation of the cost function in logistic regression: why dot multiplication in one expression but element-wise multiplication in another
第二,这是您的原始问题,要解决此问题,您应打印有关cost1和cost2的所有信息。
例如,在使用keepdims = True
计算成本方程后,您会发现cost.shape = ()
,cost.dtype = float64
和type(cost) = numpy.ndarray
为scalar
,而为您的问题在这里。
函数squeeze
可以成功地缩小尺寸,例如[[.364]]
将是.364
。但是,.364
的类型为numpy.ndarray
。
因此,要从scalar
转换为float,只需执行此操作
解决方案:
cost = np.asscalar(cost) # make sure to convert scalar with shape () to normal float
因此,您的断言肯定可以正常工作。
您可以检查这个问题How to convert singleton array to a scalar value in Python?,也可以检查这个问题What is a ndarray of shape () returned after np.squeeze from shape (1,1)?