lanny xu commited on
Commit
6b60426
ยท
1 Parent(s): 447a3ac

delete VAE all files

Browse files
Channel่ฎฒ่งฃ.txt DELETED
@@ -1,337 +0,0 @@
1
- ไป€ไนˆๆ˜ฏ้€š้“๏ผˆChannel๏ผ‰๏ผŸ
2
- 1. ๅ›พๅƒ็š„้€š้“
3
- ้€š้“็š„ๅŸบๆœฌๆฆ‚ๅฟต๏ผš
4
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
5
-
6
- ้€š้“ = ๅ›พๅƒ็š„"็ปดๅบฆ"ๆˆ–"ๅฑ‚"
7
- ๆฏไธช้€š้“ๆ˜ฏไธ€ไธช 2D ็Ÿฉ้˜ต๏ผŒๅŒ…ๅซ็‰นๅฎš็š„ไฟกๆฏ
8
-
9
-
10
- ็คบไพ‹ 1: ็ฐๅบฆๅ›พๅƒ๏ผˆ1 ้€š้“๏ผ‰
11
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
12
-
13
- ๅฝข็Šถ: (1, 28, 28)
14
- โ†‘ โ†‘ โ†‘
15
- ้€š้“ๆ•ฐ ้ซ˜ ๅฎฝ
16
-
17
- ๅชๆœ‰ไธ€ไธช้€š้“๏ผŒๅญ˜ๅ‚จ็ฐๅบฆๅ€ผ:
18
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
19
- โ”‚ ้€š้“ 0 (็ฐๅบฆๅ€ผ) โ”‚
20
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
21
- โ”‚ [0.2, 0.5, 0.8, ...]โ”‚
22
- โ”‚ [0.1, 0.9, 0.3, ...]โ”‚
23
- โ”‚ [0.7, 0.4, 0.6, ...]โ”‚
24
- โ”‚ ... โ”‚
25
- โ”‚ โ”‚
26
- โ”‚ 28ร—28 ็š„็Ÿฉ้˜ต โ”‚
27
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
28
-
29
- ๆฏไธชๅƒ็ด ๅ€ผ: 0.0 (้ป‘) ~ 1.0 (็™ฝ)
30
-
31
-
32
- ็คบไพ‹ 2: RGB ๅฝฉ่‰ฒๅ›พๅƒ๏ผˆ3 ้€š้“๏ผ‰
33
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
34
-
35
- ๅฝข็Šถ: (3, 224, 224)
36
- โ†‘ โ†‘ โ†‘
37
- 3้€š้“ ้ซ˜ ๅฎฝ
38
-
39
- ๆœ‰ไธ‰ไธช้€š้“๏ผŒๅˆ†ๅˆซๅญ˜ๅ‚จ RGB ไฟกๆฏ:
40
-
41
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
42
- โ”‚ ้€š้“ 0 (Red) โ”‚ โ”‚ ้€š้“ 1 (Green) โ”‚ โ”‚ ้€š้“ 2 (Blue) โ”‚
43
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
44
- โ”‚ [0.9, 0.2, 0.1, ...]โ”‚ โ”‚ [0.1, 0.8, 0.3, ...]โ”‚ โ”‚ [0.2, 0.3, 0.9, ...]โ”‚
45
- โ”‚ [0.8, 0.3, 0.2, ...]โ”‚ โ”‚ [0.2, 0.7, 0.4, ...]โ”‚ โ”‚ [0.1, 0.4, 0.8, ...]โ”‚
46
- โ”‚ [0.7, 0.4, 0.3, ...]โ”‚ โ”‚ [0.3, 0.6, 0.5, ...]โ”‚ โ”‚ [0.3, 0.5, 0.7, ...]โ”‚
47
- โ”‚ ... โ”‚ โ”‚ ... โ”‚ โ”‚ ... โ”‚
48
- โ”‚ 224ร—224 โ”‚ โ”‚ 224ร—224 โ”‚ โ”‚ 224ร—224 โ”‚
49
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
50
- ็บข่‰ฒๅผบๅบฆ ็ปฟ่‰ฒๅผบๅบฆ ่“่‰ฒๅผบๅบฆ
51
-
52
- ไธ€ไธชๅƒ็ด ็‚น็š„ๅฎŒๆ•ด้ขœ่‰ฒ = (R, G, B)
53
- ไพ‹ๅฆ‚: ไฝ็ฝฎ (10, 15) ็š„้ขœ่‰ฒ = (0.9, 0.1, 0.2) โ†’ ็บข่‰ฒๅๅคš
54
-
55
- 2. ๅท็งฏๅŽ็š„้€š้“๏ผˆ็‰นๅพๅ›พ Feature Map๏ผ‰
56
- 1 ้€š้“ โ†’ 32 ้€š้“็š„ๅซไน‰๏ผš
57
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
58
-
59
- ่พ“ๅ…ฅ: (1, 28, 28) # 1 ไธช็ฐๅบฆ้€š้“
60
- โ†“ ๅท็งฏๆ“ไฝœ
61
- ่พ“ๅ‡บ: (32, 14, 14) # 32 ไธช็‰นๅพ้€š้“
62
-
63
-
64
- ไป€ไนˆๆ˜ฏ 32 ไธช้€š้“๏ผŸ
65
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
66
-
67
- ๆฏไธช้€š้“ = ไธ€ไธชๅท็งฏๆ ธ๏ผˆๆปคๆณขๅ™จ๏ผ‰ๆฃ€ๆต‹ๅˆฐ็š„็‰นๅพ
68
- 32 ไธช้€š้“ = 32 ไธชไธๅŒ็š„็‰นๅพๆฃ€ๆต‹ๅ™จ
69
-
70
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
71
- โ”‚ ้€š้“ 0: ๆฃ€ๆต‹่พน็ผ˜ โ”‚ 14ร—14 ็Ÿฉ้˜ต
72
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
73
- โ”‚ [0.8, 0.1, 0.0, ...]โ”‚ ้ซ˜ๆฟ€ๆดปๅ€ผ โ†’ ๆฃ€ๆต‹ๅˆฐ่พน็ผ˜
74
- โ”‚ [0.9, 0.2, 0.0, ...]โ”‚
75
- โ”‚ ... โ”‚
76
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
77
-
78
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
79
- โ”‚ ้€š้“ 1: ๆฃ€ๆต‹ๅœ†ๅฝข โ”‚ 14ร—14 ็Ÿฉ้˜ต
80
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
81
- โ”‚ [0.0, 0.7, 0.0, ...]โ”‚ ้ซ˜ๆฟ€ๆดปๅ€ผ โ†’ ๆฃ€ๆต‹ๅˆฐๅœ†ๅฝข
82
- โ”‚ [0.0, 0.9, 0.1, ...]โ”‚
83
- โ”‚ ... โ”‚
84
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
85
-
86
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
87
- โ”‚ ้€š้“ 2: ๆฃ€ๆต‹็บน็† โ”‚ 14ร—14 ็Ÿฉ้˜ต
88
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
89
- โ”‚ [0.3, 0.4, 0.8, ...]โ”‚
90
- โ”‚ ... โ”‚
91
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
92
-
93
- ...
94
-
95
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
96
- โ”‚ ้€š้“ 31: ๆฃ€ๆต‹ๅคๆ‚ๆจกๅผโ”‚ 14ร—14 ็Ÿฉ้˜ต
97
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
98
- โ”‚ [0.2, 0.6, 0.3, ...]โ”‚
99
- โ”‚ ... โ”‚
100
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
101
-
102
- ๆ€ปๅ…ฑ 32 ไธช็‰นๅพๅ›พ๏ผŒๆฏไธช้ƒฝๆ˜ฏ 14ร—14 ็š„็Ÿฉ้˜ต
103
-
104
- 3. ๅท็งฏๅฆ‚ไฝ•ไบง็”Ÿๅคš้€š้“๏ผŸ
105
-
106
- Conv2d(in_channels=1, out_channels=32, kernel_size=4)
107
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๏ฟฝ๏ฟฝ๏ฟฝโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
108
-
109
- ๅ‚ๆ•ฐ่งฃ้‡Š๏ผš
110
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
111
- in_channels=1: ่พ“ๅ…ฅๆœ‰ 1 ไธช้€š้“๏ผˆ็ฐๅบฆๅ›พ๏ผ‰
112
- out_channels=32: ่พ“ๅ‡บๆœ‰ 32 ไธช้€š้“๏ผˆ32 ไธช็‰นๅพๅ›พ๏ผ‰
113
- kernel_size=4: ๆฏไธชๅท็งฏๆ ธๆ˜ฏ 4ร—4 ็š„็Ÿฉ้˜ต
114
-
115
-
116
- ๅ†…้ƒจๆœ‰ 32 ไธชๅท็งฏๆ ธ๏ผˆๆปคๆณขๅ™จ๏ผ‰๏ผš
117
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
118
-
119
- ๅท็งฏๆ ธ 1 (4ร—4): ๅท็งฏๆ ธ 2 (4ร—4): ๅท็งฏๆ ธ 32 (4ร—4):
120
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
121
- โ”‚ [ 1 1 1 1] โ”‚ โ”‚ [ 1 0 -1 0] โ”‚ โ”‚ [ 0 1 0 1] โ”‚
122
- โ”‚ [ 1 1 1 1] โ”‚ โ”‚ [ 0 1 0 -1] โ”‚ โ”‚ [ 1 0 1 0] โ”‚
123
- โ”‚ [-1 -1 -1 -1] โ”‚ โ”‚ [-1 0 1 0] โ”‚ โ”‚ [ 0 1 0 1] โ”‚
124
- โ”‚ [-1 -1 -1 -1] โ”‚ โ”‚ [ 0 -1 0 1] โ”‚ โ”‚ [ 1 0 1 0] โ”‚
125
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
126
- ๆฃ€ๆต‹ๆฐดๅนณ่พน็ผ˜ ๆฃ€ๆต‹ๅฏน่ง’็บฟ ๆฃ€ๆต‹ๆฃ‹็›˜ๆ ผ
127
-
128
-
129
- ๅท็งฏ่ฟ‡็จ‹๏ผš
130
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
131
-
132
- ่พ“ๅ…ฅๅ›พๅƒ (1, 28, 28):
133
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
134
- โ”‚ ่พ“ๅ…ฅ้€š้“ 0 โ”‚
135
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
136
- โ”‚ [0.2, 0.5, 0.8, 0.1, ...] โ”‚
137
- โ”‚ [0.1, 0.9, 0.3, 0.4, ...] โ”‚
138
- โ”‚ [0.7, 0.4, 0.6, 0.2, ...] โ”‚
139
- โ”‚ ... โ”‚
140
- โ”‚ 28ร—28 โ”‚
141
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
142
- โ†“
143
- โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ... โ”€โ”€โ”
144
- โ†“ โ†“ โ†“ โ†“
145
- ๅท็งฏๆ ธ 1 ๆ‰ซๆ ๅท็งฏๆ ธ 2 ๆ‰ซๆ ๅท็งฏๆ ธ 3 ๆ‰ซๆ ... ๅท็งฏๆ ธ 32 ๆ‰ซๆ
146
- โ†“ โ†“ โ†“ โ†“
147
- ่พ“ๅ‡บ้€š้“ 0 ่พ“ๅ‡บ้€š้“ 1 ่พ“ๅ‡บ้€š้“ 2 ... ่พ“ๅ‡บ้€š้“ 31
148
- (14ร—14) (14ร—14) (14ร—14) (14ร—14)
149
-
150
-
151
- ๆœ€็ปˆ่พ“ๅ‡บ (32, 14, 14):
152
- 32 ไธช็‰นๅพๅ›พ๏ผŒๆฏไธช 14ร—14
153
-
154
- 4. ไธบไป€ไนˆ้œ€่ฆๅคš้€š้“๏ผŸ
155
- ๅคš้€š้“็š„ไฝœ็”จ๏ผš
156
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
157
-
158
- 1. ๆๅ–ไธๅŒ็š„็‰นๅพ
159
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
160
-
161
- ่พ“ๅ…ฅ: ๆ‰‹ๅ†™ๆ•ฐๅญ— "8" ็š„ๅ›พๅƒ
162
-
163
- ้€š้“ 0: ๆฃ€ๆต‹ๅž‚็›ด่พน็ผ˜ โ†’ ๆฟ€ๆดปๅ€ผ้ซ˜ๅœจ 8 ็š„ไธคไธช็ซ–็บฟ
164
- ้€š้“ 1: ๆฃ€ๆต‹ๆฐดๅนณ่พน็ผ˜ โ†’ ๆฟ€ๆดปๅ€ผ้ซ˜ๅœจ 8 ็š„ไธŠไธญไธ‹ๆจช็บฟ
165
- ้€š้“ 2: ๆฃ€ๆต‹ๅœ†ๅฝข โ†’ ๆฟ€ๆดปๅ€ผ้ซ˜ๅœจ 8 ็š„ไธŠไธ‹ไธคไธชๅœ†
166
- ้€š้“ 3: ๆฃ€ๆต‹ไบคๅ‰็‚น โ†’ ๆฟ€ๆดปๅ€ผ้ซ˜ๅœจ 8 ็š„ไธญ้—ดไบคๅ‰ๅค„
167
- ...
168
- ้€š้“ 31: ๆฃ€ๆต‹ๅคๆ‚็บน็† โ†’ ๆฟ€ๆดปๅ€ผ้ซ˜ๅœจ็‰นๅฎšไฝ็ฝฎ
169
-
170
- ้€š่ฟ‡ 32 ไธชไธๅŒ็š„็‰นๅพ๏ผŒๆจกๅž‹ๅฏไปฅไปŽไธๅŒ่ง’ๅบฆ็†่งฃๅ›พๅƒ๏ผ
171
-
172
-
173
- 2. ้€ๅฑ‚ๆๅ–ๆŠฝ่ฑก็‰นๅพ
174
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
175
-
176
- Layer 1 (1โ†’32 ้€š้“):
177
- ๆฃ€ๆต‹ไฝŽ็บง็‰นๅพ: ่พน็ผ˜ใ€็บฟๆกใ€่ง’็‚น
178
-
179
- Layer 2 (32โ†’64 ้€š้“):
180
- ็ป„ๅˆไฝŽ็บง็‰นๅพ๏ผŒๆฃ€ๆต‹ไธญ็บง็‰นๅพ: ๆ›ฒ็บฟใ€็ฎ€ๅ•ๅฝข็Šถ
181
-
182
- Layer 3 (64โ†’128 ้€š้“):
183
- ็ป„ๅˆไธญ็บง็‰นๅพ๏ผŒๆฃ€ๆต‹้ซ˜็บง็‰นๅพ: ๅฎŒๆ•ด็š„ๆ•ฐๅญ—ๅฝข็Šถ
184
-
185
-
186
- 3. ๅขžๅผบ่กจ่พพ่ƒฝๅŠ›
187
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
188
-
189
- ๅฆ‚ๆžœๅชๆœ‰ 1 ไธช้€š้“๏ผˆ1 ไธชๅท็งฏๆ ธ๏ผ‰:
190
- โŒ ๅช่ƒฝๆฃ€ๆต‹ไธ€็งๆจกๅผ
191
- โŒ ่กจ่พพ่ƒฝๅŠ›ๆœ‰้™
192
- โŒ ๅ‡†็กฎ็އไฝŽ
193
-
194
- ๆœ‰ 32 ไธช้€š้“๏ผˆ32 ไธชๅท็งฏๆ ธ๏ผ‰:
195
- โœ… ๅฏไปฅๅŒๆ—ถๆฃ€ๆต‹ 32 ็งไธๅŒ็š„ๆจกๅผ
196
- โœ… ่กจ่พพ่ƒฝๅŠ›ๅผบ
197
- โœ… ๅ‡†็กฎ็އ้ซ˜
198
-
199
- 5. ้€š้“ๆ•ฐ็š„้€‰ๆ‹ฉ
200
- ไธบไป€ไนˆ้€‰ๆ‹ฉ 32ใ€64ใ€128 ็ญ‰๏ผŸ
201
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
202
-
203
- ๅ…ธๅž‹็š„ CNN ้€š้“ๆ•ฐ่ฎพ่ฎก๏ผš
204
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
205
-
206
- ่พ“ๅ…ฅ: 1 ้€š้“๏ผˆ็ฐๅบฆๅ›พ๏ผ‰ๆˆ– 3 ้€š้“๏ผˆRGB ๅ›พ๏ผ‰
207
- โ†“
208
- Conv1: 32 ๏ฟฝ๏ฟฝ้“ # ๆๅ–ๅŸบ็ก€็‰นๅพ
209
- โ†“
210
- Conv2: 64 ้€š้“ # ็‰นๅพๆ•ฐ้‡็ฟปๅ€
211
- โ†“
212
- Conv3: 128 ้€š้“ # ่ฟ›ไธ€ๆญฅๅขžๅŠ 
213
- โ†“
214
- Conv4: 256 ้€š้“ # ้ซ˜ๅฑ‚ๆŠฝ่ฑก็‰นๅพ
215
-
216
-
217
- ่ง„ๅพ‹๏ผš
218
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
219
-
220
- โœ… ้€š้“ๆ•ฐ้€ๅฑ‚ๅขžๅŠ ๏ผˆ32 โ†’ 64 โ†’ 128 โ†’ 256๏ผ‰
221
- - ็ฉบ้—ดๅฐบๅฏธ้€ๅฑ‚ๅ‡ๅฐ๏ผˆ28ร—28 โ†’ 14ร—14 โ†’ 7ร—7๏ผ‰
222
- - ็”จๆ›ดๅคš้€š้“ๅผฅ่กฅ็ฉบ้—ดไฟกๆฏ็š„ๆŸๅคฑ
223
-
224
- โœ… ้€šๅธธๆ˜ฏ 2 ็š„ๅน‚ๆฌก๏ผˆ32, 64, 128, 256๏ผ‰
225
- - ไพฟไบŽ GPU ่ฎก็ฎ—ไผ˜ๅŒ–
226
- - ๆ–นไพฟๅ†…ๅญ˜ๅฏน้ฝ
227
-
228
- โœ… ๆ นๆฎไปปๅŠกๅคๆ‚ๅบฆ่ฐƒๆ•ด
229
- - ็ฎ€ๅ•ไปปๅŠก: 16, 32, 64
230
- - ๅคๆ‚ไปปๅŠก: 64, 128, 256, 512
231
-
232
-
233
- ๅ‚ๆ•ฐ้‡ๅฏนๆฏ”๏ผš
234
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
235
-
236
- Conv2d(1, 32, kernel_size=4):
237
- ๅ‚ๆ•ฐ้‡ = 1 ร— 32 ร— 4 ร— 4 = 512
238
-
239
- Conv2d(1, 64, kernel_size=4):
240
- ๅ‚ๆ•ฐ้‡ = 1 ร— 64 ร— 4 ร— 4 = 1,024 # ็ฟปๅ€
241
-
242
- Conv2d(32, 64, kernel_size=4):
243
- ๅ‚ๆ•ฐ้‡ = 32 ร— 64 ร— 4 ร— 4 = 32,768 # ๆ›ดๅคš๏ผ
244
-
245
- ้€š้“ๆ•ฐ่ถŠๅคš โ†’ ๅ‚ๆ•ฐ้‡่ถŠๅคง โ†’ ่กจ่พพ่ƒฝๅŠ›่ถŠๅผบ๏ผŒไฝ†่ฎก็ฎ—ๆˆๆœฌไนŸ่ถŠ้ซ˜
246
-
247
- 6. ็›ด่ง‚็ฑปๆฏ”
248
- ้€š้“็š„็ฑปๆฏ”็†่งฃ๏ผš
249
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
250
-
251
- ็ฑปๆฏ” 1: ๅคšไธชไธ“ๅฎถ
252
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
253
-
254
- ่พ“ๅ…ฅๅ›พๅƒ = ไธ€ไปฝ็—…ๅކ
255
-
256
- 1 ไธช้€š้“ = 1 ไธชๅŒป็”Ÿ็œ‹็—…ๅކ
257
- โ†’ ๅชๆœ‰ไธ€ไธช่ง†่ง’๏ผŒๅฏ่ƒฝๆผ่ฏŠ
258
-
259
- 32 ไธช้€š้“ = 32 ไธชไธ“ๅฎถๅŒๆ—ถ็œ‹็—…ๅކ
260
- โ†’ ไธ“ๅฎถ 1: ็œ‹่พน็ผ˜๏ผˆๆ˜ฏๅฆๆœ‰ๅค–ไผค๏ผ‰
261
- โ†’ ไธ“ๅฎถ 2: ็œ‹้ขœ่‰ฒ๏ผˆๆ˜ฏๅฆๆœ‰็‚Ž็—‡๏ผ‰
262
- โ†’ ไธ“ๅฎถ 3: ็œ‹ๅฝข็Šถ๏ผˆๆ˜ฏๅฆๆœ‰่‚ฟ็˜ค๏ผ‰
263
- โ†’ ...
264
- โ†’ ไธ“ๅฎถ 32: ็œ‹ๅคๆ‚ๆจกๅผ
265
-
266
- ็ปผๅˆ 32 ไธชไธ“ๅฎถ็š„ๆ„่ง โ†’ ๆ›ดๅ‡†็กฎ็š„่ฏŠๆ–ญ๏ผ
267
-
268
-
269
- ็ฑปๆฏ” 2: ๅคšไธชๆปค้•œ
270
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
271
-
272
- ่พ“ๅ…ฅๅ›พๅƒ = ๅŽŸๅง‹็…ง็‰‡
273
-
274
- 1 ไธช้€š้“ = ๅบ”็”จ 1 ไธชๆปค้•œ
275
- โ†’ ๅชๆœ‰ไธ€็งๆ•ˆๆžœ
276
-
277
- 32 ไธช้€š้“ = ๅŒๆ—ถๅบ”็”จ 32 ไธชๆปค้•œ
278
- โ†’ ๆปค้•œ 1: ่พน็ผ˜ๅขžๅผบ
279
- โ†’ ๆปค้•œ 2: ๅฏนๆฏ”ๅบฆๅขžๅผบ
280
- โ†’ ๆปค้•œ 3: ้ซ˜ๆ–ฏๆจก็ณŠ
281
- โ†’ ...
282
- โ†’ ๆปค้•œ 32: ๅคๆ‚ๅ˜ๆข
283
-
284
- ๆฏไธชๆปค้•œๆๅ–ไธๅŒ็š„่ง†่ง‰ไฟกๆฏ๏ผ
285
-
286
-
287
- ็ฑปๆฏ” 3: ๅคšไธชไพฆๆŽข
288
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
289
-
290
- ่พ“ๅ…ฅๅ›พๅƒ = ๆกˆๅ‘็Žฐๅœบ
291
-
292
- 1 ไธช้€š้“ = 1 ไธชไพฆๆŽข่ฐƒๆŸฅ
293
- โ†’ ๅฏ่ƒฝ้—ๆผ็บฟ็ดข
294
-
295
- 32 ไธช้€š้“ = 32 ไธชไพฆๆŽขๅŒๆ—ถ่ฐƒๆŸฅ
296
- โ†’ ไพฆๆŽข 1: ๆฃ€ๆŸฅๆŒ‡็บน
297
- โ†’ ไพฆๆŽข 2: ๅˆ†ๆž่ถณ่ฟน
298
- โ†’ ไพฆๆŽข 3: ๆŸฅ็œ‹็›‘ๆŽง
299
- โ†’ ...
300
- โ†’ ไพฆๆŽข 32: ็ปผๅˆๅˆ†ๆž
301
-
302
- ๆฏไธชไพฆๆŽขๅ…ณๆณจไธๅŒ็š„็บฟ็ดข๏ผŒๆœ€ๅŽ็ปผๅˆๅพ—ๅ‡บ็ป“่ฎบ๏ผ
303
-
304
- ๆ€ป็ป“
305
- ้€š้“๏ผˆChannel๏ผ‰ๆ€ป็ป“๏ผš
306
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
307
-
308
- ๅฎšไน‰๏ผš
309
- ้€š้“ = ็‰นๅพๅ›พ็š„"ๅฑ‚"ๆˆ–"็ปดๅบฆ"
310
- ๆฏไธช้€š้“ๆ˜ฏไธ€ไธช 2D ็Ÿฉ้˜ต๏ผŒๅญ˜ๅ‚จ็‰นๅฎš็š„็‰นๅพไฟกๆฏ
311
-
312
- ไฝœ็”จ๏ผš
313
- โœ… 1 ไธช้€š้“ โ†’ 1 ไธชๅท็งฏๆ ธ โ†’ ๆฃ€ๆต‹ 1 ็ง็‰นๅพ
314
- โœ… 32 ไธช้€š้“ โ†’ 32 ไธชๅท็งฏๆ ธ โ†’ ๆฃ€ๆต‹ 32 ็งไธๅŒ็‰นๅพ
315
- โœ… ้€š้“ๆ•ฐ่ถŠๅคš โ†’ ็‰นๅพ่ถŠไธฐๅฏŒ โ†’ ่กจ่พพ่ƒฝๅŠ›่ถŠๅผบ
316
-
317
- ๆผ”ๅ˜๏ผš
318
- ่พ“ๅ…ฅ: 1 ้€š้“๏ผˆ็ฐๅบฆๅ›พ๏ผ‰ๆˆ– 3 ้€š้“๏ผˆRGB๏ผ‰
319
- โ†“
320
- Conv1: 32 ้€š้“๏ผˆๆฃ€ๆต‹ๅŸบ็ก€็‰นๅพ๏ผ‰
321
- โ†“
322
- Conv2: 64 ้€š้“๏ผˆๆฃ€ๆต‹ไธญ็บง็‰นๅพ๏ผ‰
323
- โ†“
324
- ๆ›ดๅคšๅฑ‚: 128, 256 ้€š้“๏ผˆๆฃ€ๆต‹้ซ˜็บงๆŠฝ่ฑก็‰นๅพ๏ผ‰
325
-
326
- ๅ…ณ้”ฎ็‚น๏ผš
327
- ๐Ÿ“Œ ๆฏไธช้€š้“ = ไธ€ไธช็‹ฌ็ซ‹็š„็‰นๅพๆฃ€ๆต‹ๅ™จ
328
- ๐Ÿ“Œ ๅคš้€š้“ๅนถ่กŒๅทฅไฝœ๏ผŒไปŽไธๅŒ่ง’ๅบฆ็†่งฃๅ›พๅƒ
329
- ๐Ÿ“Œ ้€š้“ๆ•ฐๆ˜ฏๅฏไปฅ่ฎพ่ฎก็š„่ถ…ๅ‚ๆ•ฐ
330
- ๐Ÿ“Œ ้€šๅธธ้€ๅฑ‚ๅขžๅŠ ๏ผŒๅผฅ่กฅ็ฉบ้—ดๅฐบๅฏธ็š„ๅ‡ๅฐ
331
-
332
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
333
-
334
- 1 ้€š้“ โ†’ 32 ้€š้“ = ไปŽๅ•ไธ€่ง†่ง’ โ†’ ๅคšไธชไธ“ๅฎถ็š„็ปผๅˆ่ง†่ง’๏ผ
335
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
336
-
337
- ็ฎ€ๅ•ๆฅ่ฏด๏ผŒ้€š้“ๅฐฑๅƒๅคšไธชไธ“ๅฎถๅŒๆ—ถ็œ‹ๅŒไธ€ๅผ ๅ›พๅƒ๏ผŒๆฏไธชไธ“ๅฎถ๏ผˆ้€š้“๏ผ‰ๅ…ณๆณจไธๅŒ็š„็‰นๅพ๏ผŒๆœ€ๅŽ็ปผๅˆๆ‰€ๆœ‰ไธ“ๅฎถ็š„ๆ„่ง๏ผŒๅพ—ๅˆฐๅฏนๅ›พๅƒๆ›ดๅ…จ้ข็š„็†่งฃ๏ผ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vae_model_structure.py DELETED
@@ -1,162 +0,0 @@
1
- import torch
2
- import torch.nn as nn
3
- import torch.nn.functional as F
4
-
5
-
6
- class VAE(nn.Module):
7
- """ๅ˜ๅˆ†่‡ช็ผ–็ ๅ™จ"""
8
-
9
- def __init__(self, latent_dim=20):
10
- super(VAE, self).__init__()
11
-
12
- # ============================================
13
- # Encoder (็ผ–็ ๅ™จ)
14
- # ============================================
15
-
16
- # ๅท็งฏๅฑ‚ 1: 1โ†’32 channels, 28ร—28โ†’14ร—14
17
- self.conv1 = nn.Conv2d(
18
- in_channels=1,
19
- out_channels=32,
20
- kernel_size=4,
21
- stride=2,
22
- padding=1
23
- )
24
-
25
- # ๅท็งฏๅฑ‚ 2: 32โ†’64 channels, 14ร—14โ†’7ร—7
26
- self.conv2 = nn.Conv2d(
27
- in_channels=32,
28
- out_channels=64,
29
- kernel_size=4,
30
- stride=2,
31
- padding=1
32
- )
33
-
34
- # ๅ…จ่ฟžๆŽฅๅฑ‚: 3136โ†’256
35
- self.fc1 = nn.Linear(64 * 7 * 7, 256)
36
-
37
- # ๆฝœๅœจ็ฉบ้—ดๅˆ†ๆ”ฏ
38
- self.fc_mu = nn.Linear(256, latent_dim) # ๅ‡ๅ€ผ
39
- self.fc_logvar = nn.Linear(256, latent_dim) # ๅฏนๆ•ฐๆ–นๅทฎ
40
-
41
- # ============================================
42
- # Decoder (่งฃ็ ๅ™จ)
43
- # ============================================
44
-
45
- # ๅ…จ่ฟžๆŽฅๅฑ‚: 20โ†’256โ†’3136
46
- self.fc2 = nn.Linear(latent_dim, 256)
47
- self.fc3 = nn.Linear(256, 64 * 7 * 7)
48
-
49
- # ่ฝฌ็ฝฎๅท็งฏ 1: 64โ†’32 channels, 7ร—7โ†’14ร—14
50
- self.deconv1 = nn.ConvTranspose2d(
51
- in_channels=64,
52
- out_channels=32,
53
- kernel_size=4,
54
- stride=2,
55
- padding=1
56
- )
57
-
58
- # ่ฝฌ็ฝฎๅท็งฏ 2: 32โ†’1 channels, 14ร—14โ†’28ร—28
59
- self.deconv2 = nn.ConvTranspose2d(
60
- in_channels=32,
61
- out_channels=1,
62
- kernel_size=4,
63
- stride=2,
64
- padding=1
65
- )
66
-
67
- def encode(self, x):
68
- """็ผ–็ ๅ™จ: x โ†’ ฮผ, log(ฯƒยฒ)"""
69
- # x: (batch, 1, 28, 28)
70
-
71
- h = F.relu(self.conv1(x)) # โ†’ (batch, 32, 14, 14)
72
- h = F.relu(self.conv2(h)) # โ†’ (batch, 64, 7, 7)
73
- h = h.view(-1, 64 * 7 * 7) # โ†’ (batch, 3136)
74
- h = F.relu(self.fc1(h)) # โ†’ (batch, 256)
75
-
76
- mu = self.fc_mu(h) # โ†’ (batch, 20)
77
- logvar = self.fc_logvar(h) # โ†’ (batch, 20)
78
-
79
- return mu, logvar
80
-
81
- def reparameterize(self, mu, logvar):
82
- """้‡ๅ‚ๆ•ฐๅŒ–: z = ฮผ + ฯƒฮต"""
83
- std = torch.exp(0.5 * logvar) # ฯƒ = exp(log(ฯƒยฒ)/2)
84
- eps = torch.randn_like(std) # ฮต ~ N(0,1)
85
- z = mu + eps * std # z = ฮผ + ฯƒฮต
86
- return z
87
-
88
- def decode(self, z):
89
- """่งฃ็ ๅ™จ: z โ†’ x'"""
90
- # z: (batch, 20)
91
-
92
- h = F.relu(self.fc2(z)) # โ†’ (batch, 256)
93
- h = F.relu(self.fc3(h)) # โ†’ (batch, 3136)
94
- h = h.view(-1, 64, 7, 7) # โ†’ (batch, 64, 7, 7)
95
- h = F.relu(self.deconv1(h)) # โ†’ (batch, 32, 14, 14)
96
- x_recon = torch.sigmoid(self.deconv2(h)) # โ†’ (batch, 1, 28, 28)
97
-
98
- return x_recon
99
-
100
- def forward(self, x):
101
- """ๅ‰ๅ‘ไผ ๆ’ญ"""
102
- mu, logvar = self.encode(x) # ็ผ–็ 
103
- z = self.reparameterize(mu, logvar) # ้‡‡ๆ ท
104
- x_recon = self.decode(z) # ่งฃ็ 
105
- return x_recon, mu, logvar
106
-
107
-
108
- # ============================================
109
- # ๆŸๅคฑๅ‡ฝๆ•ฐ
110
- # ============================================
111
-
112
- def vae_loss(x_recon, x, mu, logvar):
113
- """
114
- VAE ๆŸๅคฑ = ้‡ๅปบๆŸๅคฑ + KL ๆ•ฃๅบฆ
115
-
116
- Args:
117
- x_recon: ้‡ๅปบๅ›พๅƒ (batch, 1, 28, 28)
118
- x: ๅŽŸๅง‹ๅ›พๅƒ (batch, 1, 28, 28)
119
- mu: ๅ‡ๅ€ผ (batch, latent_dim)
120
- logvar: ๅฏนๆ•ฐๆ–นๅทฎ (batch, latent_dim)
121
- """
122
- # 1. ้‡ๅปบๆŸๅคฑ (Binary Cross Entropy)
123
- # ่กก้‡้‡ๅปบๅ›พๅƒไธŽๅŽŸๅ›พ็š„ๅทฎๅผ‚
124
- recon_loss = F.binary_cross_entropy(
125
- x_recon, x, reduction='sum'
126
- )
127
-
128
- # 2. KL ๆ•ฃๅบฆ (Kullback-Leibler Divergence)
129
- # ่กก้‡ q(z|x) ไธŽๅ…ˆ้ชŒ p(z)=N(0,1) ็š„ๅทฎๅผ‚
130
- # KL(q||p) = -0.5 * ฮฃ(1 + log(ฯƒยฒ) - ฮผยฒ - ฯƒยฒ)
131
- kl_loss = -0.5 * torch.sum(
132
- 1 + logvar - mu.pow(2) - logvar.exp()
133
- )
134
-
135
- # ๆ€ปๆŸๅคฑ
136
- total_loss = recon_loss + kl_loss
137
-
138
- return total_loss, recon_loss, kl_loss
139
-
140
-
141
- # ============================================
142
- # ไฝฟ็”จ็คบไพ‹
143
- # ============================================
144
-
145
- # ๅˆ›ๅปบๆจกๅž‹
146
- model = VAE(latent_dim=20)
147
-
148
- # ่พ“ๅ…ฅๅ›พๅƒ (batch_size=32, channels=1, height=28, width=28)
149
- x = torch.randn(32, 1, 28, 28)
150
-
151
- # ๅ‰ๅ‘ไผ ๆ’ญ
152
- x_recon, mu, logvar = model(x)
153
-
154
- # ่ฎก็ฎ—ๆŸๅคฑ
155
- loss, recon_loss, kl_loss = vae_loss(x_recon, x, mu, logvar)
156
-
157
- print(f"้‡ๅปบๅฝข็Šถ: {x_recon.shape}") # (32, 1, 28, 28)
158
- print(f"ฮผ ๅฝข็Šถ: {mu.shape}") # (32, 20)
159
- print(f"log(ฯƒยฒ) ๅฝข็Šถ: {logvar.shape}") # (32, 20)
160
- print(f"ๆ€ปๆŸๅคฑ: {loss.item():.2f}")
161
- print(f"้‡ๅปบๆŸๅคฑ: {recon_loss.item():.2f}")
162
- print(f"KLๆ•ฃๅบฆ: {kl_loss.item():.2f}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vae_structrue.txt DELETED
@@ -1,506 +0,0 @@
1
- ### VAE ๆจกๅž‹ๅฎŒๆ•ดๆžถๆž„
2
- VAE ๆ•ดไฝ“็ป“ๆž„๏ผš
3
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
4
-
5
- ่พ“ๅ…ฅๅ›พๅƒ (x)
6
- โ†“
7
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
8
- โ”‚ Encoder (็ผ–็ ๅ™จ) โ”‚
9
- โ”‚ ๅฐ†่พ“ๅ…ฅๅŽ‹็ผฉๅˆฐๆฝœๅœจ็ฉบ้—ด โ”‚
10
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
11
- โ†“
12
- ๆฝœๅœจ่กจ็คบ (z) = ๅ‡ๅ€ผ (ฮผ) + ๆ ‡ๅ‡†ๅทฎ (ฯƒ) ร— ฮต
13
- โ†“
14
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
15
- โ”‚ Decoder (่งฃ็ ๅ™จ) โ”‚
16
- โ”‚ ไปŽๆฝœๅœจ็ฉบ้—ด้‡ๅปบ่พ“ๅ…ฅ โ”‚
17
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
18
- โ†“
19
- ้‡ๅปบๅ›พๅƒ (x')
20
-
21
- ๆŸๅคฑ = ้‡ๅปบๆŸๅคฑ + KL ๆ•ฃๅบฆ
22
-
23
- ่ฏฆ็ป† Layer ็ป“ๆž„่งฃๆž
24
-
25
- 1. Encoder (็ผ–็ ๅ™จ)
26
-
27
- Encoder ็ป“ๆž„๏ผˆไปฅ MNIST 28ร—28 ๅ›พๅƒไธบไพ‹๏ผ‰
28
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
29
-
30
- ่พ“ๅ…ฅ: (batch_size, 1, 28, 28) # ็ฐๅบฆๅ›พๅƒ
31
-
32
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
33
- โ”‚ Layer 1: Conv2d โ”‚
34
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
35
- โ”‚ ่พ“ๅ…ฅ้€š้“: 1 โ”‚
36
- โ”‚ ่พ“ๅ‡บ้€š้“: 32 โ”‚
37
- โ”‚ ๅท็งฏๆ ธ: 4ร—4 โ”‚
38
- โ”‚ ๆญฅ้•ฟ: 2 โ”‚
39
- โ”‚ ๅกซๅ……: 1 โ”‚
40
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 32, 14, 14) โ”‚
41
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
42
- โ†“
43
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
44
- โ”‚ Activation: ReLU โ”‚
45
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
46
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 32, 14, 14) โ”‚
47
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
48
- โ†“
49
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
50
- โ”‚ Layer 2: Conv2d โ”‚
51
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
52
- โ”‚ ่พ“ๅ…ฅ้€š้“: 32 โ”‚
53
- โ”‚ ่พ“ๅ‡บ้€š้“: 64 โ”‚
54
- โ”‚ ๅท็งฏๆ ธ: 4ร—4 โ”‚
55
- โ”‚ ๆญฅ้•ฟ: 2 โ”‚
56
- โ”‚ ๅกซๅ……: 1 โ”‚
57
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 64, 7, 7) โ”‚
58
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
59
- โ†“
60
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
61
- โ”‚ Activation: ReLU โ”‚
62
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
63
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 64, 7, 7) โ”‚
64
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
65
- โ†“
66
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
67
- โ”‚ Flatten โ”‚
68
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
69
- โ”‚ ่พ“ๅ…ฅ: (batch, 64, 7, 7) โ”‚
70
- โ”‚ ่พ“ๅ‡บ: (batch, 3136) # 64ร—7ร—7=3136 โ”‚
71
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
72
- โ†“
73
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
74
- โ”‚ Layer 3: Linear (ๅ…จ่ฟžๆŽฅๅฑ‚) โ”‚
75
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
76
- โ”‚ ่พ“ๅ…ฅ็ปดๅบฆ: 3136 โ”‚
77
- โ”‚ ่พ“ๅ‡บ็ปดๅบฆ: 256 โ”‚
78
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 256) โ”‚
79
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
80
- โ†“
81
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
82
- โ”‚ Activation: ReLU โ”‚
83
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
84
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 256) โ”‚
85
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
86
- โ†“
87
- โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
88
- โ†“ โ†“ โ†“
89
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
90
- โ”‚ fc_mu โ”‚ โ”‚ fc_logvar โ”‚ โ”‚ (ไธคไธชๅˆ†ๆ”ฏ) โ”‚
91
- โ”‚ Linear โ”‚ โ”‚ Linear โ”‚ โ”‚ โ”‚
92
- โ”‚ 256 โ†’ 20 โ”‚ โ”‚ 256 โ†’ 20 โ”‚ โ”‚ ๆฝœๅœจ็ปดๅบฆ=20 โ”‚
93
- โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
94
- โ”‚ ฮผ (ๅ‡ๅ€ผ) โ”‚ โ”‚ log(ฯƒยฒ) โ”‚ โ”‚ โ”‚
95
- โ”‚ (batch, 20) โ”‚ โ”‚ (batch, 20) โ”‚ โ”‚ โ”‚
96
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
97
- โ†“ โ†“
98
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’
99
- ้‡ๅ‚ๆ•ฐๅŒ–ๆŠ€ๅทง
100
- z = ฮผ + ฯƒ ร— ฮต
101
- (batch, 20)
102
-
103
-
104
- ๅ‚ๆ•ฐ็ปŸ่ฎก๏ผš
105
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
106
- Conv1: 1ร—32ร—4ร—4 + 32 bias = 544
107
- Conv2: 32ร—64ร—4ร—4 + 64 bias = 32,832
108
- Linear: 3136ร—256 + 256 bias = 803,072
109
- fc_mu: 256ร—20 + 20 bias = 5,140
110
- fc_logvar: 256ร—20 + 20 bias = 5,140
111
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
112
- ๆ€ป่ฎก: ~846,728 ๅ‚ๆ•ฐ
113
-
114
- 2. ้‡ๅ‚ๆ•ฐๅŒ–ๆŠ€ๅทง (Reparameterization Trick)
115
-
116
- ้‡ๅ‚ๆ•ฐๅŒ–ๅฑ‚๏ผš
117
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
118
-
119
- ่พ“ๅ…ฅ: ฮผ (ๅ‡ๅ€ผ), log(ฯƒยฒ) (ๅฏนๆ•ฐๆ–นๅทฎ)
120
- (batch, 20), (batch, 20)
121
-
122
- ๆญฅ้ชค:
123
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
124
-
125
- 1. ่ฎก็ฎ—ๆ ‡ๅ‡†ๅทฎ:
126
- ฯƒ = exp(0.5 ร— log(ฯƒยฒ))
127
- = exp(log(ฯƒ))
128
- = ฯƒ
129
-
130
- 2. ้‡‡ๆ ท้šๆœบๅ™ชๅฃฐ:
131
- ฮต ~ N(0, 1) # ๆ ‡ๅ‡†ๆญฃๆ€ๅˆ†ๅธƒ
132
- ๅฝข็Šถ: (batch, 20)
133
-
134
- 3. ้‡ๅ‚ๆ•ฐๅŒ–:
135
- z = ฮผ + ฯƒ ร— ฮต
136
-
137
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
138
- โ”‚ ไธบไป€ไนˆ่ฟ™ๆ ทๅš๏ผŸ โ”‚
139
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
140
- โ”‚ ็›ดๆŽฅไปŽ N(ฮผ, ฯƒยฒ) ้‡‡ๆ ทไธๅฏๅพฎๅˆ† โ”‚
141
- โ”‚ ้€š่ฟ‡ ฮต ~ N(0,1) ไฝฟๆขฏๅบฆๅฏไปฅๅ›žไผ  โ”‚
142
- โ”‚ ฮผ ๅ’Œ ฯƒ ้ƒฝๅฏไปฅ่ขซไผ˜ๅŒ– โ”‚
143
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
144
-
145
- ่พ“ๅ‡บ: z (ๆฝœๅœจๅ‘้‡)
146
- (batch, 20)
147
-
148
-
149
- ไปฃ็ ๅฎž็Žฐ:
150
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
151
-
152
- def reparameterize(mu, logvar):
153
- std = torch.exp(0.5 * logvar) # ฯƒ = exp(log(ฯƒยฒ)/2)
154
- eps = torch.randn_like(std) # ฮต ~ N(0,1)
155
- z = mu + eps * std # z = ฮผ + ฯƒฮต
156
- return z
157
-
158
- 3. Decoder (่งฃ็ ๅ™จ)
159
-
160
- Decoder ็ป“ๆž„๏ผš
161
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”๏ฟฝ๏ฟฝ๏ฟฝโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
162
-
163
- ่พ“ๅ…ฅ: z (ๆฝœๅœจๅ‘้‡)
164
- (batch, 20)
165
-
166
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
167
- โ”‚ Layer 1: Linear (ๅ…จ่ฟžๆŽฅๅฑ‚) โ”‚
168
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
169
- โ”‚ ่พ“ๅ…ฅ็ปดๅบฆ: 20 โ”‚
170
- โ”‚ ่พ“ๅ‡บ็ปดๅบฆ: 256 โ”‚
171
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 256) โ”‚
172
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
173
- โ†“
174
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
175
- โ”‚ Activation: ReLU โ”‚
176
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
177
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 256) โ”‚
178
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
179
- โ†“
180
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
181
- โ”‚ Layer 2: Linear โ”‚
182
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
183
- โ”‚ ่พ“ๅ…ฅ็ปดๅบฆ: 256 โ”‚
184
- โ”‚ ่พ“ๅ‡บ็ปดๅบฆ: 3136 # 64ร—7ร—7 โ”‚
185
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 3136) โ”‚
186
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
187
- โ†“
188
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
189
- โ”‚ Activation: ReLU โ”‚
190
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
191
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 3136) โ”‚
192
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
193
- โ†“
194
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
195
- โ”‚ Reshape (Unflatten) โ”‚
196
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
197
- โ”‚ ่พ“ๅ…ฅ: (batch, 3136) โ”‚
198
- โ”‚ ่พ“ๅ‡บ: (batch, 64, 7, 7) โ”‚
199
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
200
- โ†“
201
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
202
- โ”‚ Layer 3: ConvTranspose2d (่ฝฌ็ฝฎๅท็งฏ/ไธŠ้‡‡ๆ ท) โ”‚
203
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
204
- โ”‚ ่พ“ๅ…ฅ้€š้“: 64 โ”‚
205
- โ”‚ ่พ“ๅ‡บ้€š้“: 32 โ”‚
206
- โ”‚ ๅท็งฏๆ ธ: 4ร—4 โ”‚
207
- โ”‚ ๆญฅ้•ฟ: 2 โ”‚
208
- โ”‚ ๅกซๅ……: 1 โ”‚
209
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 32, 14, 14) โ”‚
210
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
211
- โ†“
212
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
213
- โ”‚ Activation: ReLU โ”‚
214
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
215
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 32, 14, 14) โ”‚
216
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
217
- โ†“
218
- โ”Œโ”€โ”€๏ฟฝ๏ฟฝ๏ฟฝโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
219
- โ”‚ Layer 4: ConvTranspose2d โ”‚
220
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
221
- โ”‚ ่พ“ๅ…ฅ้€š้“: 32 โ”‚
222
- โ”‚ ่พ“ๅ‡บ้€š้“: 1 โ”‚
223
- โ”‚ ๅท็งฏๆ ธ: 4ร—4 โ”‚
224
- โ”‚ ๆญฅ้•ฟ: 2 โ”‚
225
- โ”‚ ๅกซๅ……: 1 โ”‚
226
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 1, 28, 28) โ”‚
227
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
228
- โ†“
229
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
230
- โ”‚ Activation: Sigmoid โ”‚
231
- โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚
232
- โ”‚ ไฝœ็”จ: ๅฐ†่พ“ๅ‡บๅŽ‹็ผฉๅˆฐ [0, 1] ่Œƒๅ›ด โ”‚
233
- โ”‚ ่พ“ๅ‡บๅฝข็Šถ: (batch, 1, 28, 28) โ”‚
234
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
235
- โ†“
236
- ่พ“ๅ‡บ: ้‡ๅปบๅ›พๅƒ x'
237
- (batch, 1, 28, 28)
238
-
239
-
240
- ๅ‚ๆ•ฐ็ปŸ่ฎก๏ผš
241
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
242
- Linear1: 20ร—256 + 256 bias = 5,376
243
- Linear2: 256ร—3136 + 3136 bias = 806,016
244
- ConvTranspose1: 64ร—32ร—4ร—4 + 32 bias = 32,800
245
- ConvTranspose2: 32ร—1ร—4ร—4 + 1 bias = 513
246
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
247
- ๆ€ป่ฎก: ~844,705 ๅ‚ๆ•ฐ
248
-
249
- ๅฎŒๆ•ด PyTorch ๅฎž็Žฐ
250
-
251
- import torch
252
- import torch.nn as nn
253
- import torch.nn.functional as F
254
-
255
-
256
- class VAE(nn.Module):
257
- """ๅ˜ๅˆ†่‡ช็ผ–็ ๅ™จ"""
258
-
259
- def __init__(self, latent_dim=20):
260
- super(VAE, self).__init__()
261
-
262
- # ============================================
263
- # Encoder (็ผ–็ ๅ™จ)
264
- # ============================================
265
-
266
- # ๅท็งฏๅฑ‚ 1: 1โ†’32 channels, 28ร—28โ†’14ร—14
267
- self.conv1 = nn.Conv2d(
268
- in_channels=1,
269
- out_channels=32,
270
- kernel_size=4,
271
- stride=2,
272
- padding=1
273
- )
274
-
275
- # ๅท็งฏๅฑ‚ 2: 32โ†’64 channels, 14ร—14โ†’7ร—7
276
- self.conv2 = nn.Conv2d(
277
- in_channels=32,
278
- out_channels=64,
279
- kernel_size=4,
280
- stride=2,
281
- padding=1
282
- )
283
-
284
- # ๅ…จ่ฟžๆŽฅๅฑ‚: 3136โ†’256
285
- self.fc1 = nn.Linear(64 * 7 * 7, 256)
286
-
287
- # ๆฝœๅœจ็ฉบ้—ดๅˆ†ๆ”ฏ
288
- self.fc_mu = nn.Linear(256, latent_dim) # ๅ‡ๅ€ผ
289
- self.fc_logvar = nn.Linear(256, latent_dim) # ๅฏนๆ•ฐๆ–นๅทฎ
290
-
291
- # ============================================
292
- # Decoder (่งฃ็ ๅ™จ)
293
- # ============================================
294
-
295
- # ๅ…จ่ฟžๆŽฅๅฑ‚: 20โ†’256โ†’3136
296
- self.fc2 = nn.Linear(latent_dim, 256)
297
- self.fc3 = nn.Linear(256, 64 * 7 * 7)
298
-
299
- # ่ฝฌ็ฝฎๅท็งฏ 1: 64โ†’32 channels, 7ร—7โ†’14ร—14
300
- self.deconv1 = nn.ConvTranspose2d(
301
- in_channels=64,
302
- out_channels=32,
303
- kernel_size=4,
304
- stride=2,
305
- padding=1
306
- )
307
-
308
- # ่ฝฌ็ฝฎๅท็งฏ 2: 32โ†’1 channels, 14ร—14โ†’28ร—28
309
- self.deconv2 = nn.ConvTranspose2d(
310
- in_channels=32,
311
- out_channels=1,
312
- kernel_size=4,
313
- stride=2,
314
- padding=1
315
- )
316
-
317
- def encode(self, x):
318
- """็ผ–็ ๅ™จ: x โ†’ ฮผ, log(ฯƒยฒ)"""
319
- # x: (batch, 1, 28, 28)
320
-
321
- h = F.relu(self.conv1(x)) # โ†’ (batch, 32, 14, 14)
322
- h = F.relu(self.conv2(h)) # โ†’ (batch, 64, 7, 7)
323
- h = h.view(-1, 64 * 7 * 7) # โ†’ (batch, 3136)
324
- h = F.relu(self.fc1(h)) # โ†’ (batch, 256)
325
-
326
- mu = self.fc_mu(h) # โ†’ (batch, 20)
327
- logvar = self.fc_logvar(h) # โ†’ (batch, 20)
328
-
329
- return mu, logvar
330
-
331
- def reparameterize(self, mu, logvar):
332
- """้‡ๅ‚ๆ•ฐๅŒ–: z = ฮผ + ฯƒฮต"""
333
- std = torch.exp(0.5 * logvar) # ฯƒ = exp(log(ฯƒยฒ)/2)
334
- eps = torch.randn_like(std) # ฮต ~ N(0,1)
335
- z = mu + eps * std # z = ฮผ + ฯƒฮต
336
- return z
337
-
338
- def decode(self, z):
339
- """่งฃ็ ๅ™จ: z โ†’ x'"""
340
- # z: (batch, 20)
341
-
342
- h = F.relu(self.fc2(z)) # โ†’ (batch, 256)
343
- h = F.relu(self.fc3(h)) # โ†’ (batch, 3136)
344
- h = h.view(-1, 64, 7, 7) # โ†’ (batch, 64, 7, 7)
345
- h = F.relu(self.deconv1(h)) # โ†’ (batch, 32, 14, 14)
346
- x_recon = torch.sigmoid(self.deconv2(h)) # โ†’ (batch, 1, 28, 28)
347
-
348
- return x_recon
349
-
350
- def forward(self, x):
351
- """ๅ‰ๅ‘ไผ ๆ’ญ"""
352
- mu, logvar = self.encode(x) # ็ผ–็ 
353
- z = self.reparameterize(mu, logvar) # ้‡‡ๆ ท
354
- x_recon = self.decode(z) # ่งฃ็ 
355
- return x_recon, mu, logvar
356
-
357
-
358
- # ============================================
359
- # ๆŸๅคฑๅ‡ฝๆ•ฐ
360
- # ============================================
361
-
362
- def vae_loss(x_recon, x, mu, logvar):
363
- """
364
- VAE ๆŸๅคฑ = ้‡ๅปบๆŸๅคฑ + KL ๆ•ฃๅบฆ
365
-
366
- Args:
367
- x_recon: ้‡ๅปบๅ›พๅƒ (batch, 1, 28, 28)
368
- x: ๅŽŸๅง‹ๅ›พๅƒ (batch, 1, 28, 28)
369
- mu: ๅ‡ๅ€ผ (batch, latent_dim)
370
- logvar: ๅฏนๆ•ฐๆ–นๅทฎ (batch, latent_dim)
371
- """
372
- # 1. ้‡ๅปบๆŸๅคฑ (Binary Cross Entropy)
373
- # ่กก้‡้‡ๅปบๅ›พๅƒไธŽๅŽŸๅ›พ็š„ๅทฎๅผ‚
374
- recon_loss = F.binary_cross_entropy(
375
- x_recon, x, reduction='sum'
376
- )
377
-
378
- # 2. KL ๆ•ฃๅบฆ (Kullback-Leibler Divergence)
379
- # ่กก้‡ q(z|x) ไธŽๅ…ˆ้ชŒ p(z)=N(0,1) ็š„ๅทฎๅผ‚
380
- # KL(q||p) = -0.5 * ฮฃ(1 + log(ฯƒยฒ) - ฮผยฒ - ฯƒยฒ)
381
- kl_loss = -0.5 * torch.sum(
382
- 1 + logvar - mu.pow(2) - logvar.exp()
383
- )
384
-
385
- # ๆ€ปๆŸๅคฑ
386
- total_loss = recon_loss + kl_loss
387
-
388
- return total_loss, recon_loss, kl_loss
389
-
390
-
391
- # ============================================
392
- # ไฝฟ็”จ็คบไพ‹
393
- # ============================================
394
-
395
- # ๅˆ›ๅปบๆจกๅž‹
396
- model = VAE(latent_dim=20)
397
-
398
- # ่พ“ๅ…ฅๅ›พๅƒ (batch_size=32, channels=1, height=28, width=28)
399
- x = torch.randn(32, 1, 28, 28)
400
-
401
- # ๅ‰ๅ‘ไผ ๆ’ญ
402
- x_recon, mu, logvar = model(x)
403
-
404
- # ่ฎก็ฎ—ๆŸๅคฑ
405
- loss, recon_loss, kl_loss = vae_loss(x_recon, x, mu, logvar)
406
-
407
- print(f"้‡ๅปบๅฝข็Šถ: {x_recon.shape}") # (32, 1, 28, 28)
408
- print(f"ฮผ ๅฝข็Šถ: {mu.shape}") # (32, 20)
409
- print(f"log(ฯƒยฒ) ๅฝข็Šถ: {logvar.shape}") # (32, 20)
410
- print(f"ๆ€ปๆŸๅคฑ: {loss.item():.2f}")
411
- print(f"้‡ๅปบๆŸๅคฑ: {recon_loss.item():.2f}")
412
- print(f"KLๆ•ฃๅบฆ: {kl_loss.item():.2f}")
413
-
414
- #### ๅฑ‚็บงๆ•ฐๆฎๆตๅŠจ่ฏฆ่งฃ
415
-
416
- ๅฎŒๆ•ดๆ•ฐๆฎๆตๅŠจ๏ผš
417
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
418
-
419
- ่พ“ๅ…ฅๅ›พๅƒ x:
420
- (32, 1, 28, 28) # batch=32, ็ฐๅบฆๅ›พ, 28ร—28ๅƒ็ด 
421
- โ†“
422
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
423
- Encoder
424
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
425
- Conv1 + ReLU:
426
- (32, 1, 28, 28) โ†’ (32, 32, 14, 14)
427
- โ†“
428
- Conv2 + ReLU:
429
- (32, 32, 14, 14) โ†’ (32, 64, 7, 7)
430
- โ†“
431
- Flatten:
432
- (32, 64, 7, 7) โ†’ (32, 3136)
433
- โ†“
434
- FC1 + ReLU:
435
- (32, 3136) โ†’ (32, 256)
436
- โ†“
437
- โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
438
- fc_mu fc_logvar
439
- (32, 256)โ†’(32,20) (32, 256)โ†’(32,20)
440
- โ†“ โ†“
441
- ฮผ log(ฯƒยฒ)
442
-
443
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
444
- Reparameterization
445
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
446
- z = ฮผ + exp(0.5ร—log(ฯƒยฒ)) ร— ฮต
447
- โ†“
448
- (32, 20) # ๆฝœๅœจๅ‘้‡
449
-
450
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
451
- Decoder
452
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
453
- FC2 + ReLU:
454
- (32, 20) โ†’ (32, 256)
455
- โ†“
456
- FC3 + ReLU:
457
- (32, 256) โ†’ (32, 3136)
458
- โ†“
459
- Reshape:
460
- (32, 3136) โ†’ (32, 64, 7, 7)
461
- โ†“
462
- ConvTranspose1 + ReLU:
463
- (32, 64, 7, 7) โ†’ (32, 32, 14, 14)
464
- โ†“
465
- ConvTranspose2 + Sigmoid:
466
- (32, 32, 14, 14) โ†’ (32, 1, 28, 28)
467
- โ†“
468
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
469
-
470
- ่พ“ๅ‡บ้‡ๅปบๅ›พๅƒ x':
471
- (32, 1, 28, 28) # ไธŽ่พ“ๅ…ฅ็›ธๅŒๅฝข็Šถ
472
-
473
- ๅ…ณ้”ฎ่ฎพ่ฎก่ฆ็‚น
474
-
475
- VAE ็š„ๆ ธๅฟƒ่ฎพ่ฎก๏ผš
476
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
477
-
478
- 1. ๅฏน็งฐ็š„ Encoder-Decoder ็ป“ๆž„
479
- โœ… Encoder ๅŽ‹็ผฉ: 28ร—28 โ†’ 20
480
- โœ… Decoder ่งฃๅŽ‹: 20 โ†’ 28ร—28
481
-
482
- 2. ๆฝœๅœจ็ฉบ้—ด็š„ๆฆ‚็އๆ€ง
483
- โœ… ไธๆ˜ฏ็กฎๅฎšๆ€ง็š„ๅ‘้‡๏ผŒ่€Œๆ˜ฏๅˆ†ๅธƒ N(ฮผ, ฯƒยฒ)
484
- โœ… ๅ…่ฎธๅนณๆป‘ๆ’ๅ€ผๅ’Œ้‡‡ๆ ทๆ–ฐๆ ทๆœฌ
485
-
486
- 3. ้‡ๅ‚ๆ•ฐๅŒ–ๆŠ€ๅทง
487
- โœ… ไฝฟ้šๆœบ้‡‡ๆ ท่ฟ‡็จ‹ๅฏๅพฎๅˆ†
488
- โœ… ๅ…่ฎธ๏ฟฝ๏ฟฝ๏ฟฝๅบฆๅ›žไผ 
489
-
490
- 4. ๅŒ้‡ๆŸๅคฑ
491
- โœ… ้‡ๅปบๆŸๅคฑ: ็กฎไฟ้‡ๅปบ่ดจ้‡
492
- โœ… KL ๆ•ฃๅบฆ: ๆญฃๅˆ™ๅŒ–ๆฝœๅœจ็ฉบ้—ด
493
-
494
- 5. ไธŽ BERT ็š„ๅฏนๆฏ”
495
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
496
- BERT: ๅŒๅ‘็ผ–็ ๅ™จ๏ผŒ็”จไบŽ็†่งฃ
497
- VAE: ็ผ–็ -่งฃ็ ๅ™จ๏ผŒ็”จไบŽ็”Ÿๆˆ
498
-
499
- BERT: ็กฎๅฎšๆ€ง่พ“ๅ‡บ (ๅ›บๅฎš็š„ embedding)
500
- VAE: ๆฆ‚็އๆ€ง่พ“ๅ‡บ (ไปŽๅˆ†ๅธƒไธญ้‡‡ๆ ท)
501
-
502
- BERT: [CLS] ่šๅˆๅ…จๅฑ€่ฏญไน‰
503
- VAE: z ็ผ–็ ๆฝœๅœจ็‰นๅพ๏ผŒๅฏ็”Ÿๆˆๆ–ฐๆ ทๆœฌ
504
- โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
505
-
506
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vae_training_example.py DELETED
@@ -1,239 +0,0 @@
1
- """
2
- VAE่ฎญ็ปƒ่ฟ‡็จ‹่ฏฆ็ป†็คบไพ‹
3
- ๅฑ•็คบVAEๅœจMNISTๆ•ฐๆฎ้›†ไธŠ็š„ๅฎŒๆ•ด่ฎญ็ปƒๆต็จ‹
4
- """
5
-
6
- import torch
7
- import torch.nn as nn
8
- import torch.optim as optim
9
- import torchvision
10
- import torchvision.transforms as transforms
11
- from torch.utils.data import DataLoader
12
- import matplotlib.pyplot as plt
13
- import numpy as np
14
-
15
- from vae_model_structure import VAE, VAELoss
16
-
17
-
18
- class VAEVisualizer:
19
- """VAEๅฏ่ง†ๅŒ–ๅทฅๅ…ท็ฑป"""
20
-
21
- @staticmethod
22
- def plot_reconstruction(original, reconstructed, epoch):
23
- """็ป˜ๅˆถๅŽŸๅง‹ๅ›พๅƒๅ’Œ้‡ๅปบๅ›พๅƒ็š„ๅฏนๆฏ”"""
24
- fig, axes = plt.subplots(2, 10, figsize=(15, 3))
25
-
26
- for i in range(10):
27
- # ๅŽŸๅง‹ๅ›พๅƒ
28
- axes[0, i].imshow(original[i].cpu().detach().numpy().reshape(28, 28), cmap='gray')
29
- axes[0, i].set_title('Original')
30
- axes[0, i].axis('off')
31
-
32
- # ้‡ๅปบๅ›พๅƒ
33
- axes[1, i].imshow(reconstructed[i].cpu().detach().numpy().reshape(28, 28), cmap='gray')
34
- axes[1, i].set_title('Reconstructed')
35
- axes[1, i].axis('off')
36
-
37
- plt.suptitle(f'Epoch {epoch} - Reconstruction Comparison')
38
- plt.tight_layout()
39
- plt.show()
40
-
41
- @staticmethod
42
- def plot_latent_space(model, test_loader, device):
43
- """ๅฏ่ง†ๅŒ–ๆฝœๅœจ็ฉบ้—ด"""
44
- model.eval()
45
-
46
- latent_vectors = []
47
- labels = []
48
-
49
- with torch.no_grad():
50
- for data, target in test_loader:
51
- data = data.to(device)
52
- mu, _ = model.encoder(data.view(-1, 784))
53
- latent_vectors.append(mu.cpu().numpy())
54
- labels.append(target.numpy())
55
-
56
- latent_vectors = np.concatenate(latent_vectors)
57
- labels = np.concatenate(labels)
58
-
59
- plt.figure(figsize=(10, 8))
60
- scatter = plt.scatter(latent_vectors[:, 0], latent_vectors[:, 1],
61
- c=labels, cmap='tab10', alpha=0.6)
62
- plt.colorbar(scatter)
63
- plt.title('2D Latent Space Visualization')
64
- plt.xlabel('Latent Dimension 1')
65
- plt.ylabel('Latent Dimension 2')
66
- plt.show()
67
-
68
-
69
- class VAETrainer:
70
- """VAE่ฎญ็ปƒๅ™จ็ฑป"""
71
-
72
- def __init__(self, model, train_loader, test_loader, device, learning_rate=1e-3):
73
- self.model = model.to(device)
74
- self.train_loader = train_loader
75
- self.test_loader = test_loader
76
- self.device = device
77
- self.optimizer = optim.Adam(self.model.parameters(), lr=learning_rate)
78
-
79
- # ่ฎฐๅฝ•่ฎญ็ปƒๅކๅฒ
80
- self.train_losses = []
81
- self.test_losses = []
82
-
83
- def train_epoch(self, epoch):
84
- """่ฎญ็ปƒไธ€ไธชepoch"""
85
- self.model.train()
86
- train_loss = 0
87
-
88
- for batch_idx, (data, _) in enumerate(self.train_loader):
89
- data = data.to(self.device)
90
- self.optimizer.zero_grad()
91
-
92
- # ๅ‰ๅ‘ไผ ๆ’ญ
93
- recon_batch, mu, logvar = self.model(data.view(-1, 784))
94
-
95
- # ่ฎก็ฎ—ๆŸๅคฑ
96
- loss = VAELoss.loss_function(recon_batch, data.view(-1, 784), mu, logvar)
97
-
98
- # ๅๅ‘ไผ ๆ’ญ
99
- loss.backward()
100
- train_loss += loss.item()
101
- self.optimizer.step()
102
-
103
- if batch_idx % 100 == 0:
104
- print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(self.train_loader.dataset)} '
105
- f'({100. * batch_idx / len(self.train_loader):.0f}%)]\tLoss: {loss.item() / len(data):.6f}')
106
-
107
- avg_loss = train_loss / len(self.train_loader.dataset)
108
- self.train_losses.append(avg_loss)
109
- return avg_loss
110
-
111
- def test_epoch(self, epoch):
112
- """ๆต‹่ฏ•ไธ€ไธชepoch"""
113
- self.model.eval()
114
- test_loss = 0
115
-
116
- with torch.no_grad():
117
- for data, _ in self.test_loader:
118
- data = data.to(self.device)
119
- recon_batch, mu, logvar = self.model(data.view(-1, 784))
120
- test_loss += VAELoss.loss_function(recon_batch, data.view(-1, 784), mu, logvar).item()
121
-
122
- avg_loss = test_loss / len(self.test_loader.dataset)
123
- self.test_losses.append(avg_loss)
124
-
125
- print(f'====> Test set loss: {avg_loss:.4f}')
126
- return avg_loss
127
-
128
- def train(self, epochs=10):
129
- """ๅฎŒๆ•ด่ฎญ็ปƒ่ฟ‡็จ‹"""
130
- print("๐Ÿš€ ๅผ€ๅง‹VAE่ฎญ็ปƒ...")
131
-
132
- for epoch in range(1, epochs + 1):
133
- train_loss = self.train_epoch(epoch)
134
- test_loss = self.test_epoch(epoch)
135
-
136
- # ๆฏ5ไธชepochๅฏ่ง†ๅŒ–ไธ€ๆฌก
137
- if epoch % 5 == 0:
138
- self.visualize_reconstruction(epoch)
139
-
140
- print("โœ… ่ฎญ็ปƒๅฎŒๆˆ๏ผ")
141
- self.plot_training_history()
142
-
143
- def visualize_reconstruction(self, epoch):
144
- """ๅฏ่ง†ๅŒ–้‡ๅปบ็ป“ๆžœ"""
145
- self.model.eval()
146
-
147
- with torch.no_grad():
148
- # ่Žทๅ–ไธ€ๆ‰นๆต‹่ฏ•ๆ•ฐๆฎ
149
- data_iter = iter(self.test_loader)
150
- test_data, _ = next(data_iter)
151
- test_data = test_data.to(self.device)
152
-
153
- # ้‡ๅปบ
154
- recon_batch, _, _ = self.model(test_data.view(-1, 784))
155
-
156
- # ๅฏ่ง†ๅŒ–
157
- VAEVisualizer.plot_reconstruction(test_data.view(-1, 784)[:10],
158
- recon_batch[:10], epoch)
159
-
160
- def plot_training_history(self):
161
- """็ป˜ๅˆถ่ฎญ็ปƒๅކๅฒ"""
162
- plt.figure(figsize=(10, 6))
163
- plt.plot(self.train_losses, label='Train Loss')
164
- plt.plot(self.test_losses, label='Test Loss')
165
- plt.xlabel('Epoch')
166
- plt.ylabel('Loss')
167
- plt.title('VAE Training History')
168
- plt.legend()
169
- plt.grid(True)
170
- plt.show()
171
-
172
-
173
- # ============================================================================
174
- # ๆ•ฐๆฎๅ‡†ๅค‡
175
- # ============================================================================
176
-
177
- def load_mnist_data(batch_size=128):
178
- """ๅŠ ่ฝฝMNISTๆ•ฐๆฎ้›†"""
179
-
180
- transform = transforms.Compose([
181
- transforms.ToTensor(),
182
- ])
183
-
184
- # ่ฎญ็ปƒ้›†
185
- train_dataset = torchvision.datasets.MNIST(
186
- root='./data',
187
- train=True,
188
- download=True,
189
- transform=transform
190
- )
191
-
192
- # ๆต‹่ฏ•้›†
193
- test_dataset = torchvision.datasets.MNIST(
194
- root='./data',
195
- train=False,
196
- download=True,
197
- transform=transform
198
- )
199
-
200
- train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
201
- test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
202
-
203
- return train_loader, test_loader
204
-
205
-
206
- # ============================================================================
207
- # ไธปๅ‡ฝๆ•ฐ
208
- # ============================================================================
209
-
210
- def main():
211
- """ไธป่ฎญ็ปƒๅ‡ฝๆ•ฐ"""
212
-
213
- # ่ฎพ็ฝฎ่ฎพๅค‡
214
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
215
- print(f"ไฝฟ็”จ่ฎพๅค‡: {device}")
216
-
217
- # ๅŠ ่ฝฝๆ•ฐๆฎ
218
- print("๐Ÿ“ฆ ๅŠ ่ฝฝMNISTๆ•ฐๆฎ้›†...")
219
- train_loader, test_loader = load_mnist_data()
220
-
221
- # ๅˆ›ๅปบVAEๆจกๅž‹
222
- print("๐Ÿ—๏ธ ๅˆ›ๅปบVAEๆจกๅž‹...")
223
- model = VAE(input_dim=784, hidden_dims=[512, 256], latent_dim=20)
224
-
225
- # ๅˆ›ๅปบ่ฎญ็ปƒๅ™จ
226
- trainer = VAETrainer(model, train_loader, test_loader, device)
227
-
228
- # ๅผ€ๅง‹่ฎญ็ปƒ
229
- trainer.train(epochs=10)
230
-
231
- # ๅฏ่ง†ๅŒ–ๆฝœๅœจ็ฉบ้—ด
232
- print("\n๐ŸŒŒ ๅฏ่ง†ๅŒ–ๆฝœๅœจ็ฉบ้—ด...")
233
- VAEVisualizer.plot_latent_space(model, test_loader, device)
234
-
235
- return model, trainer
236
-
237
-
238
- if __name__ == "__main__":
239
- model, trainer = main()