normalisasi yaitu mengubah skala menjadi rentang 0 sampai dengan 1 ataupun -1 sampai +1 dengan rumus sebagai berikut
image = (image – mean) / std
Misalkan Parameter
- mean = 0.5 dan
- std = 0.5
maka akan menormalkan gambar dalam rentang [-1,1]
Jika kalian ingin mengembalikan gambar ke rentang [0,1], bisa menggunakan rumus
image = ((image * std) + mean)
Secara umum Pillow akan membaca gambar menjadi rentang 0 sampai 1, sedangkan openCV akan menggunakan uint8 yaitu rentang 0 sampai 255, oleh sebab itu kalian harus hati2 menggunakan OpenCV sebaiknya nanti value nya dibagi dengan 255.0 akan sesuai dengan rentang 0 sampai 1.
Saya akan ambil contoh berikut
import torchvision.transforms as transforms import torch image = torch.randint(0,255,(1, 5, 3), dtype=torch.float)/255 print(image) T = transforms.Compose( [ transforms.Normalize((0.5), (0.5)) ]) print(T(image))
hasil dari normalisasi yang semulai rentang 0 sampai 1 menjadi -1 sampai +1
tensor([[[0.4118, 0.4784, 0.9020], [0.7922, 0.1176, 0.0902], [0.8627, 0.5098, 0.6510], [0.8627, 0.7529, 0.4235], [0.4980, 0.1333, 0.2627]]]) tensor([[[-0.1765, -0.0431, 0.8039], [ 0.5843, -0.7647, -0.8196], [ 0.7255, 0.0196, 0.3020], [ 0.7255, 0.5059, -0.1529], [-0.0039, -0.7333, -0.4745]]])
sesuai dengan rumus diatas mari kita coba
nilai input 0.4118 apakah hasilnya -0.1764?
(0.4118-0.5)/0.5 Out[38]: -0.1764
Apakah normalisasi bagus?
Tentang apakah ini membantu CNN belajar lebih baik, saya tidak yakin. Tetapi mayoritas makalah yang saya baca menggunakan beberapa skema normalisasi, yang diatas adalah salah satunya. (lebih tepatnya jika kalian banyak menggunakan fungsi aktifasi yang melibatkan nilai rentang -1 sampai +1, serta kebanyakan bobot yang digunakan mempunyai nilai rentang sesuai hal tersebut)
Mari kita cek mengenai bobot pada convolution yang berisikan nilai rentang -1 sampai dengan +1 berdistribusi normal https://softscients.com/2024/05/05/operasi-convolution-pada-pytorch-filter-kernel-weight/
conv = torch.nn.Conv2d(in_channels=1,out_channels=1,kernel_size = 3) conv.weight Out[41]: Parameter containing: tensor([[[[ 0.0522, 0.0030, -0.2677], [-0.1826, 0.1313, 0.0576], [-0.1420, 0.0884, 0.1058]]]], requires_grad=True)