File: channel_backprop_stats_op_test.py

package info (click to toggle)
pytorch 1.13.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 139,252 kB
  • sloc: cpp: 1,100,274; python: 706,454; ansic: 83,052; asm: 7,618; java: 3,273; sh: 2,841; javascript: 612; makefile: 323; xml: 269; ruby: 185; yacc: 144; objc: 68; lex: 44
file content (62 lines) | stat: -rw-r--r-- 2,131 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62





from caffe2.python import core
import caffe2.python.hypothesis_test_util as hu
from hypothesis import given, settings
import caffe2.python.serialized_test.serialized_test_util as serial
import hypothesis.strategies as st
import numpy as np
import unittest


class TestChannelBackpropStats(serial.SerializedTestCase):
    @given(
        size=st.integers(7, 10),
        inputChannels=st.integers(1, 10),
        batchSize=st.integers(1, 3),
        **hu.gcs
    )
    @settings(deadline=10000)
    def testChannelBackpropStats(self, size, inputChannels, batchSize, gc, dc):

        op = core.CreateOperator(
            "ChannelBackpropStats",
            ["X", "mean", "invStdDev", "outputGrad"],
            ["scaleGrad", "biasGrad"],
        )

        def referenceChannelBackpropStatsTest(X, mean, invStdDev, outputGrad):
            scaleGrad = np.zeros(inputChannels)
            biasGrad = np.zeros(inputChannels)
            for n in range(batchSize):
                for c in range(inputChannels):
                    for h in range(size):
                        for w in range(size):
                            biasGrad[c] += outputGrad[n, c, h, w]
                            scaleGrad[c] += (
                                X[n, c, h, w] - mean[c]
                            ) * invStdDev[c] * outputGrad[n, c, h, w]
            return scaleGrad, biasGrad

        X = np.random.rand(batchSize, inputChannels, size, size)\
                     .astype(np.float32) - 0.5
        sums = np.sum(X, axis=(0, 2, 3), keepdims=False)
        numPixels = size * size * batchSize
        mean = sums / numPixels
        sumsq = np.sum(X**2, axis=(0, 2, 3), keepdims=False)
        var = ((sumsq -
                (sums * sums) / numPixels) / numPixels).astype(np.float32)
        invStdDev = 1 / np.sqrt(var)
        outputGrad = np.random.rand(batchSize, inputChannels, size, size)\
            .astype(np.float32) - 0.5
        self.assertReferenceChecks(
            gc, op, [X, mean, invStdDev, outputGrad],
            referenceChannelBackpropStatsTest
        )


if __name__ == "__main__":
    unittest.main()