Lua판 제로로부터 만드는 Deep Learning 그 10[1차원의 수치 미분]
과거 기사 요약
Lua판 제로로부터 만드는 Deep Learning 정리
소개
이번은 원서 4장의 수치 미분의 부분을 실장합니다.
CNN을 구현하는데 있어서는 이 부분은 날려도 상관없습니다. Torch를 이용한 그래프 묘사의 참고 정도로서 주시면 좋겠습니다.
스크립트는 다음과 같습니다.
gradient_1.lua
require 'gnuplot'
---数値微分関数.
-- 入力値に対する一変数関数の数値微分を求める
-- @param f 一変数関数 (Type:function)
-- @param x 入力値 (Type:Tensor)
-- @return 入力値に対する数値微分の値 (Type:Tensor)
function numerical_diff(f, x)
local h = 1e-4 -- 0.0001
return (f(x+h) - f(x-h)) / (2*h)
end
---(0.01x^2+0.1x)一変数関数.
-- @param x 入力値 (Type:Tensor)
-- @return 出力値 (Type:Tensor)
function function_1(x)
return 0.01*torch.pow(x,2) + 0.1*x
end
---接線生成関数.
-- 入力値に対する関数の接線関数を求める
-- @param f 一変数関数 (Type:function)
-- @param x 入力値 (Type:number)
-- @return 接線関数 (Type:function)
function tangent_line(f, x)
d = numerical_diff(f, x)
print(d)
y = f(x) - d*x
return function(t) return d*t + y end
end
--function_1(x)のグラフを描写
local x = torch.range(0.0, 20.0, 0.1)
local y = function_1(x)
gnuplot.figure(1)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'})
--数値微分の値
print(numerical_diff(function_1, torch.Tensor({5})))
print(numerical_diff(function_1, torch.Tensor({10})))
--接線のグラフ描写
--x=5の場合
local function_t1 = tangent_line(function_1, 5)
local L_5 = function_t1(x)
gnuplot.figure(2)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'},{x, L_5, '-'},{torch.Tensor({5}), function_t1(torch.Tensor({5})), '+'})
--x=10の場合
local function_t2 = tangent_line(function_1, 10)
local L_10 = function_t2(x)
gnuplot.figure(3)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'},{x, L_10, '-'},{torch.Tensor({10}), function_t1(torch.Tensor({10})), '+'})
그래프의 설명에 관해서는 공식 매뉴얼 의 설명이 몹시 알기 쉽습니다.
실행 결과는 다음과 같습니다.
실행 결과
$ th gradient_1.lua
0.2000
[torch.DoubleTensor of size 1]
0.3000
[torch.DoubleTensor of size 1]
0.19999999999909
0.29999999999863
f(x) = 0.01x^2 + 0.1x 그래프
f(x) = 0.01x^2 + 0.1x 그래프와 x=5에서의 접선
f(x) = 0.01x^2 + 0.1x 그래프와 x=10에서의 접선
결론
이번은 이상입니다.
다음 번은 편미분의 경우를 보고 싶습니다.
고맙습니다.
Reference
이 문제에 관하여(Lua판 제로로부터 만드는 Deep Learning 그 10[1차원의 수치 미분]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kazuki-Nakamae/items/c0daa63a3d9d1046ab77텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)