nn.Module中定义参数:不需要加cuda,可以求导,反向传播
1
2
3
4
5
6
|
class BiFPN(nn.Module):
def __init__( self , fpn_sizes):
self .w1 = nn.Parameter(torch.rand( 1 ))
print ( "no---------------------------------------------------" , self .w1.data, self .w1.grad)
|
下面这个例子说明中间变量可能没有梯度,但是最终变量有梯度:
cy1 cd都有梯度
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import torch
xP = torch.Tensor([[ 3233.8557 , 3239.0657 , 3243.4355 , 3234.4507 , 3241.7087 ,
3243.7292 , 3234.6826 , 3237.6609 , 3249.7937 , 3244.8623 ,
3239.5349 , 3241.4626 , 3251.3457 , 3247.4263 , 3236.4924 ,
3251.5735 , 3246.4731 , 3242.4692 , 3239.4958 , 3247.7283 ,
3251.7134 , 3249.0237 , 3247.5637 ],
[ 1619.9011 , 1619.7140 , 1620.4883 , 1620.0642 , 1620.2191 ,
1619.9796 , 1617.6597 , 1621.1522 , 1621.0869 , 1620.9725 ,
1620.7130 , 1620.6071 , 1620.7437 , 1621.4825 , 1620.5107 ,
1621.1519 , 1620.8462 , 1620.5944 , 1619.8038 , 1621.3364 ,
1620.7399 , 1621.1178 , 1618.7080 ],
[ 1619.9330 , 1619.8542 , 1620.5176 , 1620.1167 , 1620.1577 ,
1620.0579 , 1617.7155 , 1621.1718 , 1621.1338 , 1620.9572 ,
1620.6288 , 1620.6621 , 1620.7074 , 1621.5305 , 1620.5656 ,
1621.2281 , 1620.8346 , 1620.6021 , 1619.8228 , 1621.3936 ,
1620.7616 , 1621.1954 , 1618.7983 ],
[ 1922.6078 , 1922.5680 , 1923.1331 , 1922.6604 , 1922.9589 ,
1922.8818 , 1920.4602 , 1923.8107 , 1924.0142 , 1923.6907 ,
1923.4465 , 1923.2820 , 1923.5728 , 1924.4071 , 1922.8853 ,
1924.1107 , 1923.5465 , 1923.5121 , 1922.4673 , 1924.1871 ,
1923.6248 , 1923.9086 , 1921.9496 ],
[ 1922.5948 , 1922.5311 , 1923.2850 , 1922.6613 , 1922.9734 ,
1922.9271 , 1920.5950 , 1923.8757 , 1924.0422 , 1923.7318 ,
1923.4889 , 1923.3296 , 1923.5752 , 1924.4948 , 1922.9866 ,
1924.1642 , 1923.6427 , 1923.6067 , 1922.5214 , 1924.2761 ,
1923.6636 , 1923.9481 , 1921.9005 ]])
yP = torch.Tensor([[ 2577.7729 , 2590.9868 , 2600.9712 , 2579.0195 , 2596.3684 ,
2602.2771 , 2584.0305 , 2584.7749 , 2615.4897 , 2603.3164 ,
2589.8406 , 2595.3486 , 2621.9116 , 2608.2820 , 2582.9534 ,
2619.2073 , 2607.1233 , 2597.7888 , 2591.5735 , 2608.9060 ,
2620.8992 , 2613.3511 , 2614.2195 ],
[ 673.7830 , 693.8904 , 709.2661 , 675.4254 , 702.4049 ,
711.2085 , 683.1571 , 684.6160 , 731.3878 , 712.7546 ,
692.3011 , 701.0069 , 740.6815 , 720.4229 , 681.8199 ,
736.9869 , 718.5508 , 704.3666 , 695.0511 , 721.5912 ,
739.6672 , 728.0584 , 729.3143 ],
[ 673.8367 , 693.9529 , 709.3196 , 675.5266 , 702.3820 ,
711.2159 , 683.2151 , 684.6421 , 731.5291 , 712.6366 ,
692.1913 , 701.0057 , 740.6229 , 720.4082 , 681.8656 ,
737.0168 , 718.4943 , 704.2719 , 695.0775 , 721.5616 ,
739.7233 , 728.1235 , 729.3387 ],
[ 872.9419 , 891.7061 , 905.8004 , 874.6565 , 899.2053 ,
907.5082 , 881.5528 , 883.0028 , 926.3083 , 908.9742 ,
890.0403 , 897.8606 , 934.6913 , 916.0902 , 880.4689 ,
931.3562 , 914.4233 , 901.2154 , 892.5759 , 916.9590 ,
933.9291 , 923.0745 , 924.4461 ],
[ 872.9661 , 891.7683 , 905.8128 , 874.6301 , 899.2887 ,
907.5155 , 881.6916 , 883.0234 , 926.3242 , 908.9561 ,
890.0731 , 897.9221 , 934.7324 , 916.0806 , 880.4300 ,
931.3933 , 914.5662 , 901.2715 , 892.5501 , 916.9894 ,
933.9813 , 923.0823 , 924.3654 ]])
shape = [ 4000 , 6000 ]
cx,cy1 = torch.rand( 1 ,requires_grad = True ),torch.rand( 1 ,requires_grad = True )
cd = torch.rand( 1 ,requires_grad = True )
ox,oy = cx,cy1
print ( 'cx:{},cy:{}' . format ( id (cx), id (cy1)))
print ( 'ox:{},oy:{}' . format ( id (ox), id (oy)))
cx,cy = cx * shape[ 1 ],cy1 * shape[ 0 ]
print ( 'cx:{},cy:{}' . format ( id (cx), id (cy)))
print ( 'ox:{},oy:{}' . format ( id (ox), id (oy)))
distance = torch.sqrt(torch. pow ((xP - cx), 2 ) + torch. pow ((yP - cy), 2 ))
mean = torch.mean(distance, 1 )
starsFC = cd * torch. pow ((distance - mean[..., None ]), 2 )
loss = torch. sum (torch.mean(starsFC, 1 ).squeeze(), 0 )
loss.backward()
print (loss)
print (cx)
print (cy1)
print ( "cx" ,cx.grad)
print ( "cy" ,cy1.grad)
print ( "cd" ,cd.grad)
print (ox.grad)
print (oy.grad)
print ( 'cx:{},cy:{}' . format ( id (cx), id (cy)))
print ( 'ox:{},oy:{}' . format ( id (ox), id (oy)))
|
以上这篇pytorch 自定义参数不更新方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/jacke121/article/details/103672674