2

기존의 conv2d()와 거의 비슷하지만 특별한 기능을 추가하고 싶습니다.TensorFlow의 사용자 정의 된 tf.nn.conv2d()를 만드는 방법은 무엇입니까?

우리는 5x5 필터의 모양과 100x100 입력의 모양을 가지고 있다고 가정합니다. 나의 이해에서

, conv2d() 내부적으로 수행합니다

  1. 전체 입력에서 5 × 5 입력 영역을 선택.
  2. 5x5 입력 영역과 필터 간의 컨벌루션을 계산합니다.
  3. 주어진 스트라이드만큼 다음 입력 영역으로 이동합니다.

    1. 전체 입력에서 5 × 5 입력 영역을 선택 : 반대로

    는 customized_conv2d()는 내부적으로 수행하고자. (동일)

  4. 5x5 입력 영역의 각 값에서 스칼라 값 f (5x5 입력 영역)를 뺍니다. (추가)
  5. 5x5 입력 영역과 필터의 뺄셈 값 사이에 컨벌루션을 계산합니다. (동일)
  6. 주어진 스트라이드만큼 다음 입력 영역으로 이동합니다. (동일)

여기서 F (X)는 인 (최대 (X) + 분 (X))/2

  • 그것을 쉽게 그것을 만드는?
  • 커스터마이징 된 코드가 GPU에서 실행될 수 있습니까?

관련 소스 코드 nn_ops.py, gen_nn_ops.py 및 nn_ops.cc를 찾아 보니 귀하의 도움을 요청합니다.

미리 감사드립니다.

추가 :

내가 지금까지 무엇을 배웠는가 :

1) 사용자 정의 TensorFlow을 만들 수 있습니다 CPU에서 실행하기위한 가장 쉬운 방법. 가능한 한 적은 조정 (tensorflow/core/kernels/conv_ops.cctensorflow/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를 실행하는 또 다른 희망이있을 수 있습니다.

+0

그래서 기본적으로 컨볼 루션을 수행하기 전에 스칼라 값을 빼고 싶습니다. 맞습니까? 그렇다면 새 conv2d를 코딩해야하며 매우 쉽다고 생각합니다. 이전에 설명한 내용 만 수행하면됩니다. 그러나, 나는 그것이 C로 코딩되어 있고 파이썬이 단지 래퍼라는 것을 알고 있기 때문에 원래의 회선만큼 빨리 실행 될 것이라고 기대하지는 않습니다. 이 커스텀 컨볼 루션 (custom convolution) 기능을 만들고 원래의 컨볼 루션 기능만큼 빠르게 만들고 싶다면 (GPU에 대해 묻는 이유가 아닐까?) 시간이 더 걸릴 것입니다. – kuonb

+0

@kuonb, 포인트가 있습니다! 감사! – Tora

+0

https://stackoverflow.com/questions/43700282/is-there-way-to-add-normalization-to-conv2d-in-tensorflow –

답변

3

컨볼 루션 자체가 선형이므로 임의의 선형 연산을 삽입하려면 먼저 tf.nn.conv2d을 통해 컨볼 루션을 수행 한 다음 해당 연산을 수행하면됩니다.

5x5 패치상의 (max(x) + min(x))/2(tf.nn.max_pool(x) - tf.nn.max_pool(-x)) * 0.5으로 구현할 수 있습니다. conv 이후에 이것을 빼기 위해서는 결과 곱셈 커널의 해당 합계로 결과를 배수해야합니다. 그런 다음 비선형 활성화 함수를 적용 할 수 있습니다.

그러나 일반적으로 비선형 연산을 효율적으로 추가하는 방법을 알지 못합니다. 컨볼 루션 곱하기 전에 각 5x5 패치에 대해 z- 점수를 얻으십시오. 아마도 다른 대답을 통해 통찰력을 얻을 수있을 것입니다.

+0

그게 좋습니다! ** (a) ** 커널 크기가 5x5이고 스트라이드 값이 (1, 1) 인 'max_pool'을 사용하고 동일한 패딩을 f (x)로 패딩합니다. ** (b) ** 동일한 매개 변수에 5 x 5를 곱한 필터에 'avg_pool'을 적용하면 필터의 5x5 패치 합계가 산출됩니다. ** (c) ** (a)와 (b) 요소를 곱하면 요소를 뺀 값이됩니다. 마지막으로,'conv2d'의 출력에서 ​​(c)를 뺍니다. 나는 올바른 길을 가고 있는가? – Tora