VGG16 adalah salah satu arsitektur jaringan saraf tiruan yang sangat terkenal dalam bidang pengolahan citra. Dikembangkan oleh tim peneliti dari Visual Geometry Group (VGG) di Universitas Oxford pada tahun 2014, VGG16 terkenal karena kegunaannya dalam klasifikasi gambar.
Arsitektur VGG16 terdiri dari total 16 lapisan (dari situlah namanya berasal). Ini terdiri dari 13 lapisan konvolusi (convolutional layers) yang diikuti oleh 3 lapisan fully connected (FC) yang menghubungkan setiap fitur yang diekstraksi dari gambar ke lapisan output yang memberikan prediksi kelas. Setiap lapisan konvolusi biasanya diikuti oleh lapisan aktivasi ReLU, yang membantu dalam mempercepat pelatihan dan meningkatkan keakuratan model.
VGG16 cukup sederhana dan mudah dipahami dibandingkan dengan beberapa arsitektur jaringan saraf yang lebih canggih. Namun, keunggulannya terletak pada keberhasilannya dalam menghasilkan fitur-fitur gambar yang berguna untuk tugas-tugas seperti klasifikasi gambar, deteksi objek, dan segmentasi semantik.
Meskipun VGG16 telah digantikan oleh arsitektur yang lebih canggih seperti ResNet, Inception, dan EfficientNet, namun kontribusinya yang signifikan terhadap bidang penglihatan komputer membuatnya tetap relevan dan sering digunakan sebagai dasar dalam pengembangan model yang lebih lanjut.
Model VGG16 dengan PyTorch
Contents
Sebenarnya mudah kok membuat model VGG16, mari kita buat menggunakan library pytorch saja.
Kode dibawah ini akan tampil jika kalian sudah login
Pada model diatas, kalian bisa melihat bahwa out terakhir hanya menggunakan function Linear saja sehingga nanti fungsi loss yang digunakan yaitu nn.CrossEntropyLoss()
Kita bisa hitung berapa jumlah parameternya, mari kita pakai summary
from torchsummary import summary num_classes = 10 batch_size = 4 model = VGG16(num_classes = num_classes) summary(model,(3,227,227))
menghasilkan informasi sebagai berikut yaitu sekitar 134 juta parameter
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 64, 227, 227] 1,792
BatchNorm2d-2 [-1, 64, 227, 227] 128
ReLU-3 [-1, 64, 227, 227] 0
Conv2d-4 [-1, 64, 227, 227] 36,928
BatchNorm2d-5 [-1, 64, 227, 227] 128
ReLU-6 [-1, 64, 227, 227] 0
MaxPool2d-7 [-1, 64, 113, 113] 0
Conv2d-8 [-1, 128, 113, 113] 73,856
BatchNorm2d-9 [-1, 128, 113, 113] 256
ReLU-10 [-1, 128, 113, 113] 0
Conv2d-11 [-1, 128, 113, 113] 147,584
BatchNorm2d-12 [-1, 128, 113, 113] 256
ReLU-13 [-1, 128, 113, 113] 0
MaxPool2d-14 [-1, 128, 56, 56] 0
Conv2d-15 [-1, 256, 56, 56] 295,168
BatchNorm2d-16 [-1, 256, 56, 56] 512
ReLU-17 [-1, 256, 56, 56] 0
Conv2d-18 [-1, 256, 56, 56] 590,080
BatchNorm2d-19 [-1, 256, 56, 56] 512
ReLU-20 [-1, 256, 56, 56] 0
Conv2d-21 [-1, 256, 56, 56] 590,080
BatchNorm2d-22 [-1, 256, 56, 56] 512
ReLU-23 [-1, 256, 56, 56] 0
MaxPool2d-24 [-1, 256, 28, 28] 0
Conv2d-25 [-1, 512, 28, 28] 1,180,160
BatchNorm2d-26 [-1, 512, 28, 28] 1,024
ReLU-27 [-1, 512, 28, 28] 0
Conv2d-28 [-1, 512, 28, 28] 2,359,808
BatchNorm2d-29 [-1, 512, 28, 28] 1,024
ReLU-30 [-1, 512, 28, 28] 0
Conv2d-31 [-1, 512, 28, 28] 2,359,808
BatchNorm2d-32 [-1, 512, 28, 28] 1,024
ReLU-33 [-1, 512, 28, 28] 0
MaxPool2d-34 [-1, 512, 14, 14] 0
Conv2d-35 [-1, 512, 14, 14] 2,359,808
BatchNorm2d-36 [-1, 512, 14, 14] 1,024
ReLU-37 [-1, 512, 14, 14] 0
Conv2d-38 [-1, 512, 14, 14] 2,359,808
BatchNorm2d-39 [-1, 512, 14, 14] 1,024
ReLU-40 [-1, 512, 14, 14] 0
Conv2d-41 [-1, 512, 14, 14] 2,359,808
BatchNorm2d-42 [-1, 512, 14, 14] 1,024
ReLU-43 [-1, 512, 14, 14] 0
MaxPool2d-44 [-1, 512, 7, 7] 0
Dropout-45 [-1, 25088] 0
Linear-46 [-1, 4096] 102,764,544
ReLU-47 [-1, 4096] 0
Dropout-48 [-1, 4096] 0
Linear-49 [-1, 4096] 16,781,312
ReLU-50 [-1, 4096] 0
Linear-51 [-1, 10] 40,970
================================================================
Total params: 134,309,962
Trainable params: 134,309,962
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.59
Forward/backward pass size (MB): 327.49
Params size (MB): 512.35
Estimated Total Size (MB): 840.44
----------------------------------------------------------------
Visualisasi VGG16 menggunakan tensorboard
Kita bisa menggunakan tensorboard untuk visualisasi modelnya
from torch.utils.tensorboard import SummaryWriter
model = VGG16(num_classes = num_classes)
inputs = torch.rand(1,3,227,227)
outs = model(inputs)
writer = SummaryWriter('runs/Vgg16')
writer.add_graph(model, (inputs), verbose=False)
writer.close()
setelah itu via terminal kita panggil tensorboard
tensorboard --logdir=runs
akan tampil pesan sebagai berikut
(base) user@MacBook-Air Kinerja Model VGG16 % tensorboard --logdir=runs
TensorFlow installation not found - running with reduced feature set.
NOTE: Using experimental fast data loading logic. To disable, pass
"--load_fast=false" and report issues on GitHub. More details:
https://github.com/tensorflow/tensorboard/issues/4784
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.16.2 at http://localhost:6006/ (Press CTRL+C to quit)
kita buka saja http://localhost:6006

Persiapan dataset
Untuk dataset yang akan kita gunakan, bisa menggunakan MNIST saja serta mengubah ukuran dan channel nya
transform = T.Compose([
T.transforms.Resize((227,227)),
T.Grayscale(num_output_channels=3),
T.ToTensor(),
T.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
dataset = datasets.MNIST('data/',
train=True,
download=True,
transform=transform)
kita hanya akan menggunakan 100 record saja karena akan banyak memakan waktu jika ditraining semua serta hanya 4 batch agar RAM nya kuat buat loading dataset nya
batch_size = 4
num_classes = 10
evens = list(range(0,100,1))
trainset_1 = torch.utils.data.Subset(dataset, evens)
dataloader = DataLoader(trainset_1,
batch_size = batch_size,
shuffle= False)
Setting training
Berikut jenis loss dan fungsi optimasinya yang digunakan
torch.manual_seed(0) #biar nggak random lagi device = getdevice() model = VGG16(num_classes).to(device) criterion = nn.CrossEntropyLoss() # karena hanya pakai Linear saja learning_rate = 0.005 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay = 0.005, momentum = 0.9)
setelah siap, kita akan lakukan training
kode dibawah ini akan tampil jika kalian sudah login
hasil training sudah mencapai 46 iterasi
loss: 1.803: 100%|██████████████████████████████| 25/25 [03:31<00:00, 8.45s/it] loss: 1.446: 100%|██████████████████████████████| 25/25 [03:04<00:00, 7.36s/it] loss: 1.163: 100%|██████████████████████████████| 25/25 [03:03<00:00, 7.35s/it] loss: 0.973: 100%|██████████████████████████████| 25/25 [03:05<00:00, 7.42s/it] loss: 1.089: 100%|██████████████████████████████| 25/25 [03:04<00:00, 7.39s/it] loss: 1.154: 100%|██████████████████████████████| 25/25 [03:03<00:00, 7.34s/it] loss: 0.961: 100%|██████████████████████████████| 25/25 [03:05<00:00, 7.42s/it] loss: 1.866: 100%|██████████████████████████████| 25/25 [03:04<00:00, 7.37s/it] loss: 0.956: 100%|██████████████████████████████| 25/25 [03:15<00:00, 7.81s/it] loss: 0.664: 100%|██████████████████████████████| 25/25 [03:42<00:00, 8.88s/it] loss: 1.19: 88%|███████████████████████████▎ | 22/25 [03:23<00:27, 9.25s/it]

Mari kita coba akurasinya
#lakukan evaluasi
model.eval()
jumlah_benar = 0
jumlah_data = 0
with torch.no_grad():
for i,batch in enumerate(tqdm(dataloader)):
images,labels = batch
images = images.to(device)
labels = labels.to(device)
out = model(images)
prediksi = torch.argmax(out,dim=1)
n = len(labels)
benar = (prediksi==labels).sum()
jumlah_data = jumlah_data + n
jumlah_benar = jumlah_benar+benar
#buat nampilkan gambar per batch
acc = (jumlah_benar/jumlah_data)*100
print("\n akurasi acc : ",np.round(acc.item(),decimals=2)," %")
hasil
akurasi acc : 96.0 %
sebagai tambahan, berikut ada beberapa function yang belum dibuat diatas yaitu
import torch
from sys import platform
def getdevice():
print('Torch', torch.__version__, 'CUDA', torch.version.cuda)
if platform=='darwin':
device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
else:
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("running dengan ",device)
return device