ゼロから作るDeep Learning


「ゼロから作るDeep Learning」でP.104の勾配を求める関数 `numerical_gradient` に関してです。

[code]

    def f2(x):
        return x[0]**2 + x[1]**2
    
    
    def numerical_gradient(f, x):
        h = 1e-4 
        grad = np.zeros_like(x)
    
        for idx in range(x.size):
            tmp_val = x[idx]
            x[idx] = tmp_val + h
            fxh1 = f(x)
    
            x[idx] = tmp_val - h
            fxh2 = f(x)
    
            grad[idx] = (fxh1 - fxh2)/(2*h)
            x[idx] = tmp_val
    
        return grad
    
[/code]

f2の勾配をnumerical_gradientで求めたいのですが、

[code]

    numerical_gradient(f2, np.array([3.0, 4.0]))
    numerical_gradient(f2, np.array([3, 4]))
    
[/code]

この２つで結果が変わる理由がわかりません。  
なぜ下の方法だとうまくいかないのか、どなたかわかる方がいらっしゃれば教えてください。  
よろしくおねがいします。




ndarrayは内部に「型」をもちます。

[code]

    print(np.array([3.0, 4.0]).dtype)
    # float64
    print(np.array([3, 4]).dtype)
    # int32
    
[/code]

今回のような浮動小数点数の計算をしたい場合に、`int`系の型のndarrayを渡すと、結果がintに丸められてしまいます。

[code]

    x = np.array([3, 4])
    x[0] += 0.1
    print(x)
    # [3 4]
    
[/code]

次のようにすれば、`[3.0,4.0]`と同じ結果を得るはずです:

[code]

    numerical_gradient(f2, np.array([3, 4]).astype(np.float))
    
[/code]

参考:

  * <https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html#numpy.dtype>
  * <https://docs.scipy.org/doc/numpy/user/basics.types.html>




ndarrayは内部に「型」をもちます。

[code]

    print(np.array([3.0, 4.0]).dtype)
    # float64
    print(np.array([3, 4]).dtype)
    # int32
    
[/code]

今回のような浮動小数点数の計算をしたい場合に、`int`系の型のndarrayを渡すと、結果がintに丸められてしまいます。

[code]

    x = np.array([3, 4])
    x[0] += 0.1
    print(x)
    # [3 4]
    
[/code]

次のようにすれば、`[3.0,4.0]`と同じ結果を得るはずです:

[code]

    numerical_gradient(f2, np.array([3, 4]).astype(np.float))
    
[/code]

参考:

  * <https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html#numpy.dtype>
  * <https://docs.scipy.org/doc/numpy/user/basics.types.html>

