Pytorch1.4 ATEN/native 코드 분석
ATEN/native 소개
코드 경로:
pytorch/aten/src/ATEN/native
aten/THNN(즉TH 시리즈)과 구별되는 라이브러리는 공식 문서를 인용하면native
:ATen "native"functions are the modern mechanism for adding operators and functions to ATen (they are "native"in contrast to legacy functions, which are bound via TH/THC cwrap metadata). Native functions are declared in native_functions.yaml and have implementations defined in one of the cpp files in this directory.
즉,
ATEN/native
아래의 파일은 C++로 이루어진 것이다operaters
(또는'층')특징
at::
사용자 정의operator 정보:
operator를 추가하려면:
native 폴더 아래의 Readme 보기
사용자 정의operator의 자동 미분
tools/autograd/derivatives.yaml
activation을 예로 들면 다음과 같습니다.
native/Activation.cpp
나는 이것이'입구'라는 것을 이해하고activation의 각 실현을 포장한다
엘루를 예로 들다
native/Activation.cpp
는 다음과 같은 인터페이스를 정의합니다.Tensor elu(
const Tensor& self,
Scalar alpha,
Scalar scale,
Scalar input_scale) {
Tensor result;
auto iter = TensorIterator::unary_op(result, self);
elu_stub(iter.device_type(), iter, alpha, scale, input_scale);
return iter.output();
}
전방향 코드가 호출된 것은
elu_stub
정의:native/cpu/Activation.cpp
: REGISTER_DISPATCH(elu_stub, &elu_kernel); native/cuda/Activation.cu
: REGISTER_DISPATCH(elu_stub, &elu_kernel); 역방향 코드도 유사합니다. 등록된 것을 호출합니다
_backward_stub
.Tensor elu_backward(
const Tensor& grad_output,
Scalar alpha,
Scalar scale,
Scalar input_scale,
const Tensor& output) {
Tensor result;
auto iter = TensorIterator::binary_op(result, grad_output, output);
elu_backward_stub(iter.device_type(), iter, alpha, scale, input_scale);
return iter.output();
}
native/cpu/Activation.cpp
이 파일은 함수를 활성화하는 cpu 코드입니다.
void elu_kernel(TensorIterator& it, Scalar alpha, Scalar scale, Scalar input_scale) {
AT_DISPATCH_FLOATING_TYPES(it.dtype(), "elu_cpu", [&]() {
auto negcoef = alpha.to() * scale.to();
auto poscoef = scale.to();
auto negiptcoef = input_scale.to();
cpu_kernel(it, [=](scalar_t a) -> scalar_t {
return a <= scalar_t(0) ? (std::exp(a * negiptcoef) - scalar_t(1)) * negcoef : a * poscoef;
});
});
}
전방향:
x*scale
negcoef*(e^(x*neginputcoef) - 1)
void elu_backward_kernel(TensorIterator& it, Scalar alpha, Scalar scale, Scalar input_scale) {
AT_DISPATCH_FLOATING_TYPES(it.dtype(), "elu_backward_cpu", [&]() {
auto negcoef = alpha.to() * scale.to();
auto poscoef = scale.to();
auto negiptcoef = input_scale.to();
cpu_kernel(it, [=](scalar_t a, scalar_t b) -> scalar_t {
return b <= scalar_t(0) ? a * negiptcoef * (b + negcoef) : a * poscoef;
});
});
}
여기에 a, b 두 개의 매개 변수가 있는데, 각각grad 이어야 한다.output, output
elu의 사다리꼴:
grad_output*neginputcoef*output
output*scale
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.