def array_equal(a, b): """True if two arrays have the same shape and elements, False otherwise. Args: a, b (numpy.ndarray or cupy.ndarray or dezero.Variable): input arrays to compare Returns: bool: True if the two arrays are equal. """ a = a.data if isinstance(a, Variable) else a b = b.data if isinstance(b, Variable) else b a, b = cuda.as_numpy(a), cuda.as_numpy(b) return np.array_equal(a, b)
def array_allclose(a, b, rtol=1e-4, atol=1e-5): """Returns True if two arrays(or variables) are element-wise equal within a tolerance. Args: a, b (numpy.ndarray or cupy.ndarray or dezero.Variable): input arrays to compare rtol (float): The relative tolerance parameter. atol (float): The absolute tolerance parameter. Returns: bool: True if the two arrays are equal within the given tolerance, False otherwise. """ a = a.data if isinstance(a, Variable) else a b = b.data if isinstance(b, Variable) else b a, b = cuda.as_numpy(a), cuda.as_numpy(b) return np.allclose(a, b, atol=atol, rtol=rtol)
def array_equal(a, b): """ 2つの array が同じ形状で同じ要素をもつ場合は True を返し、それ以外は False を返す Parameters ---------- a : ndarray (numpy or cupy) or Variable b : ndarray (numpy or cupy) or Variable Returns ------- c : bool """ a = a.data if isinstance(a, Variable) else a b = b.data if isinstance(b, Variable) else b a, b = cuda.as_numpy(a), cuda.as_numpy(b) return np.array_equal(a, b)
def array_allclose(a, b, atol=1e-5, rtol=1e-4): """2つの array が同じ形状で近い値の要素をもつ場合は True を返し、それ以外は False を返す Parameters ---------- a : ndarray (numpy or cupy) or Variable b : ndarray (numpy or cupy) or Variable atol : float numpy.allclose関数で使用する atol(絶対許容パラメータ) rtol : float numpy.allclose関数で使用する rtol(相対許容パラメータ) Returns ------- """ a = a.data if isinstance(a, Variable) else a b = b.data if isinstance(b, Variable) else b a, b = cuda.as_numpy(a), cuda.as_numpy(b) return np.allclose(a, b, atol=atol, rtol=rtol)
def numerical_grad(f, x, *args, **kwargs): """数値微分で勾配を求める Parameters ---------- f : DeZero function DeZeroの関数やレイヤ x : ndarray or dezero.Variable 勾配を求める変数 args : 可変長引数 f(x, y) のように、入力する変数が x 以外にある場合はここで与える kwargs : キーワード引数 f(x, key=y) のように、入力する変数が x 以外にある場合はここで与える Returns ------- grad : ndarray """ eps = 1e-4 x = x.data if isinstance(x, Variable) else x xp = cuda.get_array_module(x) if xp is not np: np_x = cuda.as_numpy(x) else: np_x = x grad = xp.zeros_like(x) it = np.nditer(np_x, flags=['multi_index'], op_flags=['readwrite']) while not it.finished: idx = it.multi_index tmp_val = x[idx].copy() x[idx] = tmp_val + eps y1 = f(x, *args, **kwargs) # f(x+h) if isinstance(y1, Variable): y1 = y1.data y1 = y1.copy() x[idx] = tmp_val - eps y2 = f(x, *args, **kwargs) # f(x-h) if isinstance(y2, Variable): y2 = y2.data y2 = y2.copy() diff = (y1 - y2).sum() grad[idx] = diff / (2 * eps) x[idx] = tmp_val it.iternext() return grad
def numerical_grad(f, x, *args, **kwargs): """Computes numerical gradient by finite differences. Args: f (callable): A function which gets `Variable`s and returns `Variable`s. x (`ndarray` or `dezero.Variable`): A target `Variable` for computing the gradient. *args: If `f` needs variables except `x`, you can specify with this argument. **kwargs: If `f` needs keyword variables, you can specify with this argument. Returns: `ndarray`: Gradient. """ eps = 1e-4 x = x.data if isinstance(x, Variable) else x xp = cuda.get_array_module(x) if xp is not np: np_x = cuda.as_numpy(x) else: np_x = x grad = xp.zeros_like(x) it = np.nditer(np_x, flags=['multi_index'], op_flags=['readwrite']) while not it.finished: idx = it.multi_index tmp_val = x[idx].copy() x[idx] = tmp_val + eps y1 = f(x, *args, **kwargs) # f(x+h) if isinstance(y1, Variable): y1 = y1.data y1 = y1.copy() x[idx] = tmp_val - eps y2 = f(x, *args, **kwargs) # f(x-h) if isinstance(y2, Variable): y2 = y2.data y2 = y2.copy() diff = (y1 - y2).sum() grad[idx] = diff / (2 * eps) x[idx] = tmp_val it.iternext() return grad