기존의 conv2d()와 거의 비슷하지만 특별한 기능을 추가하고 싶습니다.TensorFlow의 사용자 정의 된 tf.nn.conv2d()를 만드는 방법은 무엇입니까?
우리는 5x5 필터의 모양과 100x100 입력의 모양을 가지고 있다고 가정합니다. 나의 이해에서
, conv2d() 내부적으로 수행합니다
- 전체 입력에서 5 × 5 입력 영역을 선택.
- 5x5 입력 영역과 필터 간의 컨벌루션을 계산합니다.
- 주어진 스트라이드만큼 다음 입력 영역으로 이동합니다.
- 전체 입력에서 5 × 5 입력 영역을 선택 : 반대로
는 customized_conv2d()는 내부적으로 수행하고자. (동일)
- 5x5 입력 영역의 각 값에서 스칼라 값 f (5x5 입력 영역)를 뺍니다. (추가)
- 5x5 입력 영역과 필터의 뺄셈 값 사이에 컨벌루션을 계산합니다. (동일)
- 주어진 스트라이드만큼 다음 입력 영역으로 이동합니다. (동일)
여기서 F (X)는 인 (최대 (X) + 분 (X))/2
- 그것을 쉽게 그것을 만드는?
- 커스터마이징 된 코드가 GPU에서 실행될 수 있습니까?
관련 소스 코드 nn_ops.py, gen_nn_ops.py 및 nn_ops.cc를 찾아 보니 귀하의 도움을 요청합니다.
미리 감사드립니다.
추가 :
내가 지금까지 무엇을 배웠는가 :
1) 사용자 정의 TensorFlow을 만들 수 있습니다 CPU에서 실행하기위한 가장 쉬운 방법. 가능한 한 적은 조정 (tensorflow/core/kernels/conv_ops.cc 및 tensorflow/core/kernels/deep_conv2d.cc). 이 특별한 TensorFlow를 사용하면 conv2d()가 원래의 TensorFlow 대신 원하는 방식으로 동작합니다. 관련 라인을 복제하고 파이썬 래퍼에서 모든 함수/메소드의 이름을 C++ 코드로 변경하여 customized_conv2d()와 같은 새로운 연산을 추가하면이 경우 과도한 노력이 될 수 있습니다.
2) CUDA를 통해 GPU를 실행할 수는 없습니다. TensorFlow의 conv2d()가 결국 NVIDIA CUDA 심 신경 네트워크 라이브러리 (cuDNN)에서 cudnnConvolutionForward()을 호출하는 것 같습니다. conv2d()의 주요 부분은이 라이브러리에서 수행됩니다. Software License Agreement (SLA) for NVIDIA cuDNN은 리버스 엔지니어링 또는 수정을 허용하지 않습니다. 라이브러리의 소스 코드가 제공되지 않습니다.
3) OpenCL을 통해 GPU를 실행하는 또 다른 희망이있을 수 있습니다.
그래서 기본적으로 컨볼 루션을 수행하기 전에 스칼라 값을 빼고 싶습니다. 맞습니까? 그렇다면 새 conv2d를 코딩해야하며 매우 쉽다고 생각합니다. 이전에 설명한 내용 만 수행하면됩니다. 그러나, 나는 그것이 C로 코딩되어 있고 파이썬이 단지 래퍼라는 것을 알고 있기 때문에 원래의 회선만큼 빨리 실행 될 것이라고 기대하지는 않습니다. 이 커스텀 컨볼 루션 (custom convolution) 기능을 만들고 원래의 컨볼 루션 기능만큼 빠르게 만들고 싶다면 (GPU에 대해 묻는 이유가 아닐까?) 시간이 더 걸릴 것입니다. – kuonb
@kuonb, 포인트가 있습니다! 감사! – Tora
https://stackoverflow.com/questions/43700282/is-there-way-to-add-normalization-to-conv2d-in-tensorflow –