<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Machine Learning Archives - Structilmy</title>
	<atom:link href="https://structilmy.com/blog/category/machine-learning/feed/" rel="self" type="application/rss+xml" />
	<link>https://structilmy.com/category/machine-learning/</link>
	<description>Tutorial, Catatan, Dokumentasi</description>
	<lastBuildDate>Wed, 18 Jan 2023 19:30:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://i0.wp.com/structilmy.com/wp-content/uploads/2019/01/cropped-favs.png?fit=32%2C32&#038;ssl=1</url>
	<title>Machine Learning Archives - Structilmy</title>
	<link>https://structilmy.com/category/machine-learning/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">165056026</site>	<item>
		<title>Belajar Ragam Strategi Deep Learning dengan CIFAR10 Dataset</title>
		<link>https://structilmy.com/blog/2023/01/19/belajar-ragam-strategi-deep-learning-dengan-cifar10-dataset/</link>
					<comments>https://structilmy.com/blog/2023/01/19/belajar-ragam-strategi-deep-learning-dengan-cifar10-dataset/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 18 Jan 2023 23:28:00 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[pytorch]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=3944</guid>

					<description><![CDATA[Semester lalu di salah satu tugas kuliah Computer Vision, kita diminta untuk membuat model CNN dengan dataset CIFAR10. Awalnya ngira ini kayak MNIST dataset yang satset train nggak sampai 10 epoch dapet akurasi >90%. Ternyata dataset ini lebih kompleks. Menariknya, dari satu tugas sederhana ini, Pak Dosen mengenalkan para mahasiswa tentang beragam strategi di deep [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Semester lalu di salah satu tugas kuliah Computer Vision, kita diminta untuk membuat model CNN dengan dataset CIFAR10. Awalnya ngira ini kayak MNIST dataset yang <em>satset </em>train nggak sampai 10 epoch dapet akurasi >90%. Ternyata dataset ini lebih kompleks. Menariknya, dari satu tugas sederhana ini, Pak Dosen mengenalkan para mahasiswa tentang beragam strategi di deep learning.</p>



<p class="wp-block-paragraph">Di tutorial ini kita akan coba membuat model machine learning untuk dataset CIFAR10. Kita akan buat modelnya dari <em>scratch </em>menggunakan PyTorch dan tidak menggunakan pre-trained model agar kita bisa lebih dalam memahami apa yang terjadi. Kita juga akan menarget (sebagai tantangan) untuk mendapatkan akurasi >85% dalam 40 epoch.</p>



<p class="wp-block-paragraph"><strong>Source code tutorial ini tersedia</strong> dalam <a href="https://colab.research.google.com/drive/1zTeZMv5760tZPAthpXGjsha72g_fzUTx?usp=sharing">bentuk Google Colab di sini</a> (akan terus dilengkapi komentar dan catatan pada notebook tersebut)</p>



<p class="wp-block-paragraph"><strong>Catatan</strong>: Artikel ini <strong>tidak </strong>membahas dasar-dasar deep learning menggunakan PyTorch. Bagi yang ingin tahu dasar deep learning atau dasar PyTorch bisa mengunjungi artikel terkait di blog ini:</p>



<ul class="wp-block-list">
<li><a href="https://structilmy.com/blog/2019/09/02/sekilas-tentang-jaringan-saraf-tiruan-dan-deep-learning/" target="_blank" rel="noreferrer noopener">Jaringan Saraf Tiruan dan Deep Learning</a></li>



<li><a href="https://structilmy.com/blog/2019/07/11/tutorial-dasar-pytorch-tensor-dan-autograd/">Tutorial dasar Pytorch</a></li>



<li><a href="https://structilmy.com/blog/2020/02/04/implementasi-jaringan-saraf-tiruan-menggunakan-pytorch/" target="_blank" rel="noreferrer noopener">Jaringan Saraf Tiruan menggunakan Pytorch</a></li>



<li><a href="https://structilmy.com/blog/2019/07/17/convolutional-neural-network-cnn-menggunakan-pytorch/">CNN menggunakan Pytorch</a></li>
</ul>



<h2 class="wp-block-heading">CIFAR10 Dataset</h2>



<p class="wp-block-paragraph"><a href="https://www.cs.toronto.edu/~kriz/cifar.html" rel="nofollow">Dataset CIFAR10</a> adalah dataset citra berukuran 32&#215;32 pixel berwarna. Sesuai namanya, CIFAR10 terdiri dari 10 kelas (kucing, burung, &#8230;, kapal). Jelas dataset ini berbeda dari MNIST yang hanya hitam putih. Selain itu jika dilihat di paper-paper, rata-rata akurasi yang diperoleh untuk CIFAR10 adalah sekitar 92% (dibanding MNIST yang bisa sampai &gt;98%). Meskipun begitu, dataset ini masih tergolong mudah dan cocok untuk buat latihan klasifikasi citra. Dataset CIFAR10 bisa didownload langsung menggunakan perintah dari PyTorch.</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">The &quot;Hello World&quot;s of machine learning:<br><br>2015: RandomForestClassifier on Iris<br>2017: MLP on MNIST<br>2019: AlexNet on Cifar-10<br>2022: DistilBERT on IMDb movie reviews</p>&mdash; Sebastian Raschka (@rasbt) <a href="https://twitter.com/rasbt/status/1607465797240201223?ref_src=twsrc%5Etfw">December 26, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div><figcaption class="wp-element-caption">Sebastian Raschka, machine learning researcher yang bukunya cukup populer, juga berpendapat CIFAR10 termasuk salah satu dataset yang cocok untuk latihan.</figcaption></figure>



<span id="more-3944"></span>



<h2 class="wp-block-heading">1. Arsitektur Dasar</h2>



<p class="wp-block-paragraph">Untuk arsitektur dasar, kita akan membuat CNN sederhana yang terdiri dari 3 layer konvolusi dan 2 fully connected layer. Tapi sebelumnya, langkah pertama kita adalah download dan normalisasi dataset terlebih dahulu.</p>



<h3 class="wp-block-heading">Data Preparation</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># dataset transform functions
train_transform = transforms.Compose(
    [transforms.ToTensor(), # convert image to tensor
     transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))]) # normalization
    
test_transform = transforms.Compose(
    [transforms.ToTensor(), # convert image to tensor
     transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))]) # normalization

# download dataset
train_set = datasets.CIFAR10("cifar10", train=True, download=True, transform=train_transform)
test_set = datasets.CIFAR10("cifar10", train=False, download=True, transform=test_transform)

# create pytorch data loader
# we set 256 images for a single batch
train_loader = torch.utils.data.DataLoader(train_set, batch_size=256, shuffle=True) 
test_loader = torch.utils.data.DataLoader(test_set, batch_size=256, shuffle=True)  </pre>



<p class="wp-block-paragraph">Karena dataset ini berukuran tidak terlalu besar, kita akan menggunakan batch size yang cukup besar, yakni 256 gambar, dalam sekali training, harapannya model bisa lebih cepet optimal. Kita juga normalisasi data CIFAR10 menggunakan <a href="https://github.com/kuangliu/pytorch-cifar/issues/19" target="_blank" rel="noreferrer noopener nofollow">rekomendasi yang ada di sini.</a></p>



<h3 class="wp-block-heading">Arsitektur</h3>



<p class="wp-block-paragraph">Arsitektur dasar yang kita buat kira-kira seperti ini jika dituliskan dalam kode Pytorch:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1) 
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) 
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.do = nn.Dropout() # dropout layer
        self.fc1 = nn.Linear(4096, 1024) 
        self.fco = nn.Linear(1024, 10)  
    
    def forward(self, x): # forward propagation
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = self.pool(torch.relu(self.conv3(x)))
        x = x.reshape(batch_size, -1)       
        x = self.do(torch.relu(self.fc1(x))) # dropout layer
        x = self.fco(x) 
        return x</pre>



<p class="wp-block-paragraph">Atau seperti ini jika <a href="http://alexlenail.me/NN-SVG/AlexNet.html">divisualisasikan</a>:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=552%2C173&#038;ssl=1" alt="" class="wp-image-3972" width="552" height="173" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=1024%2C323&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=300%2C95&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?resize=768%2C242&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-3.png?w=1182&amp;ssl=1 1182w" sizes="(max-width: 552px) 100vw, 552px" /></figure>
</div>


<p class="wp-block-paragraph">Jika diperhatikan, ada beberapa catatan pada arsitektur tersebut:</p>



<ol class="wp-block-list">
<li><strong>Jumlah feature map yang kita gunakan cukup besar</strong>, yakni 128 pada konvolusi pertama dan 256 pada konvolusi kedua dan ketiga. Hal ini mengingat CIFAR10 dataset yang lebih kompleks dibanding MNIST dan kita menarget untuk mendapat akurasi &gt;85% dalam waktu singkat, karenanya walau arsitektur dasar, tapi akan kita buat cukup besar.</li>



<li><strong>Terdapat layer dropout</strong> pada salah satu fully-connected layer, hal ini bertujuan untuk mengurangi overfitting model deep learning.</li>
</ol>



<h3 class="wp-block-heading">Optimizer</h3>



<p class="wp-block-paragraph">Selanjutnya kita train model tersebut selama 40 epoch menggunakan Stochastic Gradient Descent (SGD) dengan learning rate 0.01, lalu kita tambahkan momentum 0.9, weight decay 0.0005 dan juga menggunakan learning rate scheduler, Cosine Annealing. Apa maksud setiap pengaturan itu? kita bahas satu-satu</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">epoch = 40 
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=0.0005) 
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epoch)</pre>



<h5 class="wp-block-heading">Momentum</h5>



<p class="wp-block-paragraph">Penggunaan momentum pada SGD seperti memberi &#8220;dorongan&#8221; agar model optimal lebih cepat. <a href="https://pytorch.org/docs/stable/generated/torch.optim.SGD.html" target="_blank" rel="noreferrer noopener nofollow">Pada Pytorch</a>, rumus SGD akan berubah menjadi seperti ini jika menggunakan momentum:</p>



<p class="wp-block-paragraph">$$ \theta_t = \theta_{t-1} &#8211; \alpha (\mu g_{t-1} + g_t) $$</p>



<p class="wp-block-paragraph">$\theta$ adalah parameter (bobot / bias model), $\alpha$ adalah learning rate, $g_t$ adalah nilai turunan eror terhadap parameter, dan $\mu$ adalah nilai momentum. Bayangkan kita sedang menuruni gunung, ketika kemiringan tanahnya curam, maka kita akan turun lebih cepat dibanding di tanah landai, kan? Dengan memperhatikan nilai turunan eror pada iterasi sebelumnya ($g_{t-1}$), optimizer akan memperhatikan kecuraman eror yang bisa mengantarkan kita ke titik optimal lebih cepat.</p>



<h5 class="wp-block-heading">Weight decay</h5>



<p class="wp-block-paragraph">Weight decay bermanfaat sebagai pencegah overfitting. Weight decay menambahkan syarat, selain meminimalkan eror, optimizer juga harus meminimalkan nilai parameter modelnya (nilai bobot/biasnya, $\theta$). Rumus SGD akan menjadi seperti ini, dengan $\lambda$ adalah nilai parameter weight decay:</p>



<p class="wp-block-paragraph">$$ \theta_t = \theta_{t-1} &#8211; \alpha (\mu g_{t-1} + g_t + \lambda \theta_{t-1}) $$</p>



<p class="wp-block-paragraph">Dengan memiliki nilai bobot yang kecil, harapannya model akan menjadi tidak terlalu kompleks.</p>



<h5 class="wp-block-heading">Learning rate scheduler</h5>



<p class="wp-block-paragraph">LR scheduler berfungsi untuk mengubah-ubah nilai learning rate pada saat proses training. Pada tutorial ini kita menggunakan metode Cosine Annealing yang membuat proses pengubahan learning rate layaknya fungsi cosine (bisa naik-turun). Pada kode di atas, untuk menginisiasi scheduler kita perlu menambahkan dua parameter, yakni optimizer mana yang akan diupdate learning ratenya, dan juga T_max, yakni seberapa lama learning rate akan naik/turun sebelum dia akhirnya berubah arahnya (Dari turun jadi naik, dan sebaliknya). Tutorial ini menggunakan T_max=epoch, yakni 40, sehingga learning rate akan terus turun hingga akhir pelatihan. <a href="https://www.kaggle.com/code/isbhargav/guide-to-pytorch-learning-rate-scheduling#6.-CosineAnnealingLR" target="_blank" rel="noreferrer noopener nofollow">Kalian bisa cek bacaan menarik tentang LR Scheduler di sini</a>. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image.png?resize=326%2C238&#038;ssl=1" alt="" class="wp-image-3960" width="326" height="238" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image.png?w=565&amp;ssl=1 565w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image.png?resize=300%2C219&amp;ssl=1 300w" sizes="(max-width: 326px) 100vw, 326px" /><figcaption class="wp-element-caption">Perubahan learning rate dari epoch ke 0 hingga 40. Dari nilai awal 0.01 menjadi 0.</figcaption></figure>
</div>


<h3 class="wp-block-heading">Hasil = 80.89%</h3>



<p class="wp-block-paragraph">Setelah kita train selama 40 epoch (source code training standard bisa cek di colab), akurasi 80.89% saya peroleh untuk model basic ini untuk data test. Not bad!</p>



<h2 class="wp-block-heading">2. Batch Normalization</h2>



<p class="wp-block-paragraph">Optimasi yang pertama akan kita lakukan adalah kita akan menambahkan batch normalization pada model. Apa itu batch normalization?</p>



<p class="wp-block-paragraph">Kita mungkin tahu normalization (normalisasi) adalah teknik untuk mengubah nilai atau skala pada data tanpa menghilangkan informasi antardatanya. Normalisasi biasanya kita lakukan di awal, sebelum data masuk ke model machine learning dengan tujuan memudahkan model untuk menemukan pola pada data. Nah, Batch normalization itu konsepnya sama seperti normalisasi biasanya hanya saja kita lakukan pada tengah-tengah layer. Detail penjelasannya bisa agak panjang, <a href="https://towardsdatascience.com/batch-norm-explained-visually-how-it-works-and-why-neural-networks-need-it-b18919692739" target="_blank" rel="noreferrer noopener nofollow">blog menarik untuk dibaca tentang batch norm ada di sini</a>.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">Penambahan terdapat pada arsitektur model sehingga tertulis seperti di bawah ini. Karena kita menggunakan CNN, kita gunakan BatchNorm2D yang akan menormalisasi pada setiap channel/feature map. Karenanya, untuk setiap inisiasi kita tambahkan parameter jumlah feature map yang diterima batch norm.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1) 
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) 
        self.do = nn.Dropout() 

        self.conv1_bn = nn.BatchNorm2d(128) # initiating batch norm
        self.conv2_bn = nn.BatchNorm2d(256) # initiating batch norm
        self.conv3_bn = nn.BatchNorm2d(256) # initiating batch norm
        
        self.fc1 = nn.Linear(4096, 1024) 
        self.fco = nn.Linear(1024, 10) 
    
    def forward(self, x): 
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1_bn(self.conv1(x)))) # batch norm
        x = self.pool(torch.relu(self.conv2_bn(self.conv2(x)))) # batch norm
        x = self.pool(torch.relu(self.conv3_bn(self.conv3(x)))) # batch norm
        x = x.reshape(batch_size, -1)        
        x = self.do(torch.relu(self.fc1(x))) 
        x = self.fco(x) 
        return x</pre>



<p class="wp-block-paragraph">Sama seperti normalisasi yang dilakukan di awal, biasanya kita mengubah rentang nilai data sehingga memiliki rata-rata 0 dan standar deviasi 1. Pada batch norm, setial layer batch norm akan menormalisasi sehingga memiliki rata-rata dan standar deviasi tertentu. Nilai ini ditentukan selama proses training. Karenanya perlu diingat:</p>



<ol class="wp-block-list">
<li>Batch norm tiap layer harus diinisasi sendiri-sendiri</li>



<li>Pastikan gunakan mode <code data-enlighter-language="generic" class="EnlighterJSRAW">.train()</code> dan <code data-enlighter-language="generic" class="EnlighterJSRAW">.eval()</code> agar batch norm tahu kita sedang training atau testing. (cek kode)</li>
</ol>



<h3 class="wp-block-heading">Hasil = 83.63%</h3>



<p class="wp-block-paragraph">Naik 3%! yey!</p>



<h2 class="wp-block-heading">3. Residual Connection</h2>



<p class="wp-block-paragraph">Salah satu pengubahan arsitektur yang cukup sederhana adalah dengan menambahkan residual connection. Residual connection ini diusulkan dan menjadi dasar dari model yang cukup populer yakni ResNet. Idenya dengan &#8220;menghubungkan&#8221; output suatu layer dengan output dari beberapa layer sebelumnya. Proses &#8220;menghubungkan&#8221; ini biasanya dilakukan hanya dengan menggunakan penjumlahan kedua tensor. </p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://paperswithcode.com/method/residual-connection" target="_blank" rel="noreferrer noopener"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?resize=354%2C195&#038;ssl=1" alt="" class="wp-image-3969" width="354" height="195" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?resize=1024%2C568&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?resize=768%2C426&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/image-1.png?zoom=2&amp;resize=354%2C195&amp;ssl=1 708w" sizes="(max-width: 354px) 100vw, 354px" /></a><figcaption class="wp-element-caption">Ilustrasi residual connection (credits to <a href="https://paperswithcode.com/method/residual-connection" target="_blank" rel="noreferrer noopener nofollow">pwc</a>)</figcaption></figure>
</div>


<p class="wp-block-paragraph">Tujuan dari residual connection adalah untuk memudahkan ketika proses update model / backpropagatoin. Gradient yang dihitung saat backpropagation akan bisa melewati atau menskip beberapa layer. Sehingga bisa terhindar dari vanishing atau exploding gradient.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">penambahan terdapat pada arsitektur model sehingga tertulis seperti ini:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) 
        self.do = nn.Dropout() 

        self.conv1_bn = nn.BatchNorm2d(128) 
        self.conv2_bn = nn.BatchNorm2d(256) 
        self.conv3_bn = nn.BatchNorm2d(256) 
        
        self.fc1 = nn.Linear(4096, 1024) 
        self.fco = nn.Linear(1024, 10)  
    
    def forward(self, x):
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1_bn(self.conv1(x)))) 
        x = self.pool(torch.relu(self.conv2_bn(self.conv2(x))))
        x = self.pool(x + torch.relu(self.conv3_bn(self.conv3(x)))) # residual connection
        x = x.reshape(batch_size, -1)        
        x = self.do(torch.relu(self.fc1(x)))
        x = self.fco(x)
        return x</pre>



<p class="wp-block-paragraph">residual connection hanya bisa dilakukan (setidaknya dengan mudah) pada layer yang memiliki output ukluran yang sama. Sehingga kita hanya gunakan pada satu layer, yakni pada proses konvolusi pada layer <code data-enlighter-language="generic" class="EnlighterJSRAW">conv3</code> dengan menambahkan input sebelum proses konvolusi sebagai residual.</p>



<h3 class="wp-block-heading">Hasil = 83.38%</h3>



<p class="wp-block-paragraph">Hmm, kok turun sedikit? bisa jadi memang tidak ngefek? tapi kalau kita cek akurasi pada data train, akurasi data train menurut agak banyak jadi sekitar 97% (sebelumnya 99%), kalau ini berarti model kita jadi &#8220;sedikit&#8221; tidak overfitting sepertinya ini pertanda bagus, kita lanjutkan dulu.</p>



<h2 class="wp-block-heading">4. Data Augmentation</h2>



<p class="wp-block-paragraph">Data augmentation adalah trik yang digunakan dengan cara membuat data latih yang lebih variatif. Kita akan memodifikasi data latih CIFAR10 dan harapannya bisa membuat model lebih memahami pola pada gambar. Metode ini sering digunakan khususnya ketika dataset yang kita miliki jumlahnya sedikit atau kurang variatif.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">penambahan terdapat pada proses transormasi data sehingga tertulis seperti ini:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">train_transform = transforms.Compose(
    [transforms.RandomCrop(32, padding=4), # data augmentation
     transforms.RandomHorizontalFlip(),    # data augmentation
     transforms.ToTensor(),
     transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))]) # normalization</pre>



<p class="wp-block-paragraph">Kita hanya menambahkan augmentasi pada saat train, jadi yang kita ubah hanya <code data-enlighter-language="generic" class="EnlighterJSRAW">train_transform</code>. Pada kode di atas kita menambahkan dua metode augmentasi. Yang pertama, adalah random crop dengan padding, ini seperti kita tambahkan bingkai 4 pixel mengelilingi gambar lalu secara acak kita akan buat kotak berukuran 32&#215;32 untuk dicrop. Hasilnya nanti gambar akan seakan tergeser (cek ilustrasi di bawah). Metode augmentasi yang kedua adalah secara acak beberapa gambar akan di flip horizontal.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/g426-3.png?resize=310%2C76&#038;ssl=1" alt="CIFAR10 random crop" class="wp-image-3965" width="310" height="76" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/g426-3.png?w=513&amp;ssl=1 513w, https://i0.wp.com/structilmy.com/wp-content/uploads/2023/01/g426-3.png?resize=300%2C74&amp;ssl=1 300w" sizes="auto, (max-width: 310px) 100vw, 310px" /><figcaption class="wp-element-caption">di-<em>padding </em>(biru) lalu di random crop</figcaption></figure>
</div>


<h3 class="wp-block-heading">Hasil = 83.8%</h3>



<p class="wp-block-paragraph">Akurasinya sudah agak naik sedikit, dan akurasi data train turun banyak jadi sekitar 82% ini berarti model kita jadi &#8220;lebih&#8221; tidak overfitting lagi. Ini pertanda bagus <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">5. Tambah Layer</h2>



<p class="wp-block-paragraph">Terakhir, kita akan coba menambah kedalaman model kita dengan menambah satu layer konvolusi. FYI, model-model besar seperti ResNet, AlexNet, dkk yang paling sederhana biasanya terdiri dari &gt;10 layer (bahkan hingga ratusan layer). Sejauh ini, model kita cuma terdiri dari 5 layer (atau 8 jika menghitung layer pooling), jadi tidak ada salahnya kita coba.</p>



<h3 class="wp-block-heading">Penambahan</h3>



<p class="wp-block-paragraph">Penambahan terdapat pada arsitektur model, sehingga berakhir tertulis seperti di bawah ini. Karena penambahan layer tersebut, kita bisa menambah proses residual connection juga.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 128, kernel_size=3, stride=1, padding=1) 
        self.conv2 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1) 
        self.conv3 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)
        self.conv4 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) # added layer
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) 
        self.do = nn.Dropout() 

        self.conv1_bn = nn.BatchNorm2d(128) 
        self.conv2_bn = nn.BatchNorm2d(256) 
        self.conv3_bn = nn.BatchNorm2d(256) 
        self.conv4_bn = nn.BatchNorm2d(256) 
        
        self.fc1 = nn.Linear(1024, 1024)
        self.fco = nn.Linear(1024, 10) 
    
    def forward(self, x): 
        batch_size = x.shape[0]
        x = self.pool(torch.relu(self.conv1_bn(self.conv1(x)))) 
        x = self.pool(torch.relu(self.conv2_bn(self.conv2(x))))
        x = self.pool(x + torch.relu(self.conv3_bn(self.conv3(x)))) 
        x = self.pool(x + torch.relu(self.conv4_bn(self.conv4(x)))) # new residual connection
        x = x.reshape(batch_size, -1)        
        x = self.do(torch.relu(self.fc1(x))) 
        x = self.fco(x)
        return x</pre>



<h3 class="wp-block-heading">Hasil = 86.48%</h3>



<p class="wp-block-paragraph"><strong>Yeah, mission complete!</strong></p>



<h2 class="wp-block-heading">Rangkuman Hasil Akhir</h2>



<p class="wp-block-paragraph">Dari menggabungkan percobaan-percobaan di atas, kita berhasil memperoleh akurasi &gt;85% dengan kurang dari 40 epoch di CIFAR10. Ini hasil yang cukup bagus dan kita jadi bisa belajar banyak beragam strategi dalam meningkatkan akurasi deep learning pada dataset CIFAR10.</p>



<p class="wp-block-paragraph">By the way, menggunakan bentuk terakhir, jika kita tambahkan waktu train hingga 200 epoch, kita bisa mencapai akurasi pada CIFAR10 hingga &gt;90% loh! Tantangan lain yang kita juga bisa coba adalah menggunakan dataset yang mirip tapi agak lebih besar, yakni CIFAR100. Selamat mencoba!</p>



<p class="wp-block-paragraph"><strong>Source code tutorial ini tersedia</strong> dalam <a href="https://colab.research.google.com/drive/1zTeZMv5760tZPAthpXGjsha72g_fzUTx?usp=sharing">bentuk Google Colab di sini</a> (akan terus dilengkapi komentar dan catatan pada notebook tersebut)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2023/01/19/belajar-ragam-strategi-deep-learning-dengan-cifar10-dataset/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3944</post-id>	</item>
		<item>
		<title>HuggingFace: Ekosistem Open Source untuk Machine Learning</title>
		<link>https://structilmy.com/blog/2022/06/29/huggingface-ekosistem-open-source-untuk-machine-learning/</link>
					<comments>https://structilmy.com/blog/2022/06/29/huggingface-ekosistem-open-source-untuk-machine-learning/#respond</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 29 Jun 2022 09:32:00 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[natural-language-processing]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=3868</guid>

					<description><![CDATA[Apa itu HuggingFace &#x1f917; Bagi teman-teman yang aktif ngikutin perkembangan Machine Learning, khususnya Natural Language Processing, pasti pernah dengar HuggingFace. HuggingFace (HF) ini adalah perusahaan yang awalnya berfokus pada pengembangan aplikasi-aplikasi NLP, tapi sekarang sudah menjelma menjadi suatu &#8220;Ekosistem&#8221; machine learning yang sangat besar. Saya sebut ekosistem karena HF bukan seperti perusahaan yang hanya menyediakan [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Apa itu HuggingFace <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f917.png" alt="🤗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2>



<p class="wp-block-paragraph">Bagi teman-teman yang aktif ngikutin perkembangan Machine Learning, khususnya Natural Language Processing, pasti pernah dengar <a href="https://huggingface.co/"><strong>HuggingFace</strong></a>. HuggingFace (HF) ini adalah perusahaan yang awalnya berfokus pada pengembangan aplikasi-aplikasi NLP, tapi sekarang sudah menjelma menjadi suatu &#8220;Ekosistem&#8221; machine learning yang sangat besar. Saya sebut ekosistem karena HF bukan seperti perusahaan yang hanya menyediakan jasa, atau produk komersil, tapi lebih dari itu!</p>



<p class="wp-block-paragraph">HF telah berkontribusi banyak dalam perkembangan Machine Learning saat ini, tidak hanya NLP tapi Machine Learning secara umum. Dengan menyediakan <a href="https://huggingface.co/course"><strong>Course</strong></a>; <strong>platform </strong>untuk saling berbagi <a href="https://huggingface.co/models">model</a>, <a href="https://huggingface.co/datasets">dataset</a>, atau <a href="https://huggingface.co/spaces">demo</a>; menyediakan <a href="https://huggingface.co/docs/transformers"><strong>library</strong> untuk NLP</a>; membangun <a href="https://t.co/1n75wi976V?amp=1"><strong>komunitas </strong>yang aktif</a>; yang semua itu <strong>gratis</strong>!! (HF juga menulis buku tentang NLP <a href="https://www.amazon.com/_/dp/1098103246">di sini</a>, tapi kalau ini berbayar <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f601.png" alt="😁" class="wp-smiley" style="height: 1em; max-height: 1em;" />)</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/Untitled.png?resize=675%2C323&#038;ssl=1" alt="" class="wp-image-3872" width="675" height="323" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/Untitled.png?resize=1024%2C491&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/Untitled.png?resize=300%2C144&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/Untitled.png?resize=768%2C368&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/Untitled.png?resize=1536%2C736&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/Untitled.png?w=1863&amp;ssl=1 1863w" sizes="auto, (max-width: 675px) 100vw, 675px" /><figcaption class="wp-element-caption"><sup>Beberapa waktu lalu ikut kegiatan HF yang mau buat platform untuk edukasi di kelas-kelas</sup></figcaption></figure>
</div>


<p class="wp-block-paragraph">Di artikel ini saya akan coba cerita sedikit gambaran umum tentang layanan-layanan HF yang teman-teman bisa gunakan. </p>



<h2 class="wp-block-heading"><a href="https://huggingface.co/models">HuggingFace Model Hub</a></h2>



<p class="wp-block-paragraph">Saya ingat beberapa tahun lalu pernah ada yang tanya, baik langsung ke saya atau <a href="https://ai.stackexchange.com/q/22574/16565">via online</a>, apakah ada layanan di mana orang-orang bisa upload model machine learning untuk digunakan orang lain, jadi orang lain tidak perlu melakukan train, test, dan sebagainya. HuggingFace Model menjawab itu! Di sini orang-orang bisa mengupload model hasil pelatihan mereka, lalu orang lain bisa tinggal download dan pakai model tersebut.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-2.png?resize=422%2C226&#038;ssl=1" alt="" class="wp-image-3881" width="422" height="226" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-2.png?resize=1024%2C551&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-2.png?resize=300%2C161&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-2.png?resize=768%2C413&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-2.png?w=1475&amp;ssl=1 1475w" sizes="auto, (max-width: 422px) 100vw, 422px" /></figure>
</div>


<p class="wp-block-paragraph">HuggingFace Model sangat terorganisir, kalian bisa sort berdasarkan task kebutuhan kalian, library yang digunakan, pembuatnya, atau bahasa (untuk NLP). Model-model tersebut nantinya bisa digunakan sebagai pre-trained model yang lalu ditrain ulang (finetuning) atau digunakan apa adanya. Beberapa waktu lalu istri saya pernah menulis <a href="https://structilmy.com/blog/2021/11/02/question-answer-qa-chatbot-dengan-distillbert-transformer/">tutorial membuat chatbot menggunakan salah satu model yang ada di HF ini</a>.</p>



<p class="wp-block-paragraph">Menggunakan model-model tersebut kerasa lebih mudah ketimbang harus cari-cari model di internet, karena sudah terintegrasi dengan library HF. Selain itu penjelasan pemakaian juga biasanya didokumentasikan dengan baik pada Model Card (&#8220;Readme&#8221; nya model di HF).</p>



<p class="wp-block-paragraph">Oh ya, Jika tidak mau bersentuhan dengan modelnya sama sekali, kita juga bisa menggunakan <a href="https://huggingface.co/inference-api">HF inference API</a> (berbayar) yang memungkinkan kita untuk memanfaatkan model-model secara langsung melalui API. Jadi kita bahkan bisa memanfaatkan model-model machine learning tanpa perlu paham Python!</p>



<span id="more-3868"></span>



<h2 class="wp-block-heading"><a href="https://huggingface.co/datasets">HuggingFace Dataset</a></h2>



<p class="wp-block-paragraph">HF juga menyediakan repository dataset di mana semua orang bisa berkontribusi dengan mengupload dataset yang dimiliki ke sana sehingga bisa dipakai oleh orang lain. Sudah ada banyak repository dataset di luar sana, tapi HF punya beberapa keunggulan khususnya pada &#8220;terorganisirnya&#8221; dataset. Di HF, pengunggah atau pemilik dataset bisa melampirkan loader script di HF yang bisa bikin dataset jadi lebih rapi ketika akan digunakan, memiliki informasi yang lengkap, dan bisa diulik dengan mudah di web HF.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-3.png?resize=431%2C391&#038;ssl=1" alt="" class="wp-image-3885" width="431" height="391" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-3.png?w=777&amp;ssl=1 777w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-3.png?resize=300%2C272&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-3.png?resize=768%2C697&amp;ssl=1 768w" sizes="auto, (max-width: 431px) 100vw, 431px" /></figure>
</div>


<p class="wp-block-paragraph">Sebagai contoh dataset <a href="https://huggingface.co/datasets/indonlu">IndoNLU</a>. Di sana kita bisa lihat ada beberapa subdataset yang berbeda, kita bisa download tiap split yang berbeda dan itu semua bisa dilakukan hanya dengan script. </p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from datasets import load_dataset

# download IndoNLU dataset, subset emotion classification, split data train
data_train = load_dataset("indonlu", "emot", split="train")

# menampilkan data pertama pada data_train
# output berupa dictionary:
#     {'tweet': 'Ini adalah hal yang paling membahagiakan ...', 'label': 4}
print(data_train[0])</pre>



<p class="wp-block-paragraph">HF Dataset hub ini, akan sangat bermanfaat untuk kebutuhan <strong>benchmarking</strong>. Dengan split yang sama dan penyimpanan dataset yang rapi, kita bisa meminimalisir pembandingan model machine learning yang tidak apple-to-apple. Misalnya, membandingkan dua model yang menggunakan dataset yang sama tapi berbeda pemilihan data train dan testnya.</p>



<h2 class="wp-block-heading"><a href="https://huggingface.co/spaces">HuggingFace Space</a></h2>



<p class="wp-block-paragraph">Kita bisa memanfaatkan HuggingFace Space untuk &#8220;memamerkan&#8221; model machine learning yang sudah kita buat. Sesuai namanya, kita seakan diberi ruang / halaman untuk menampilkan hasil model machine learning kita. Kita bisa memanfaatkan package seperti <a href="https://streamlit.io/">Streamlit</a> atau <a href="https://gradio.app/">Gradio</a> untuk pengaturan antarmuka dan controlnya, lalu menggunakan HF Space untuk wadah deployment. HF Space biasa digunakan untuk kebutuhan demo, visualisasi, portofolio, atau beberapa orang juga menggunakan HF space untuk membuat leaderboard/benchmark suatu dataset.</p>



<p class="wp-block-paragraph">Kita bisa lihat-lihat Space yang orang lain bikin, salah satu space yang cukup populer akhir-akhir ini adalah <a href="https://huggingface.co/spaces/dalle-mini/dalle-mini">Dall-E Mini</a>. Di sana kita bisa menggenerate gambar suka-suka kita dari kalimat yang diberikan.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/dallemini_2022-6-28_12-15-24.jpg?resize=393%2C472&#038;ssl=1" alt="" class="wp-image-3888" width="393" height="472" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/dallemini_2022-6-28_12-15-24.jpg?resize=852%2C1024&amp;ssl=1 852w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/dallemini_2022-6-28_12-15-24.jpg?resize=250%2C300&amp;ssl=1 250w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/dallemini_2022-6-28_12-15-24.jpg?resize=768%2C923&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/dallemini_2022-6-28_12-15-24.jpg?w=1001&amp;ssl=1 1001w" sizes="auto, (max-width: 393px) 100vw, 393px" /></figure>
</div>


<p class="wp-block-paragraph">Masih banyak sebenarnya yang bisa dilakukan dengan HuggingFace, teman-teman bisa lanjut eksplorasi untuk mengulik lebih dalam. Bisa coba mulai dengan belajar menggunakan HF Model, lalu mencoba menggunakan public dataset dengan HF Dataset, lalu lanjut buat aplikasi sederhana dan upload di HF Space.</p>



<p class="wp-block-paragraph">Semoga bermanfaat, selamat bereksplorasi menggunakan HuggingFace!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2022/06/29/huggingface-ekosistem-open-source-untuk-machine-learning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3868</post-id>	</item>
		<item>
		<title>Reinforcement Learning, Belajar dari Interaksi</title>
		<link>https://structilmy.com/blog/2022/06/05/reinforcement-learning-belajar-dari-interaksi/</link>
					<comments>https://structilmy.com/blog/2022/06/05/reinforcement-learning-belajar-dari-interaksi/#respond</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Sun, 05 Jun 2022 04:54:12 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=3830</guid>

					<description><![CDATA[Beberapa minggu ke depan saya lagi coba memperdalam lagi topik Reinforcement Learning (RL) melalui course yang sedang diadakan Hugging Face. Materi minggu pertamanya sudah rilis, dan pembawaannya sangat menarik, mudah dipahami, dan mencakup dengan baik sisi teori sampai teknis implementasi menggunakan package-package terkini. Sangat recommended untuk temen-temen yang mau belajar RL, silakan saja daftar coursenya [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Beberapa minggu ke depan saya lagi coba memperdalam lagi topik Reinforcement Learning (RL) melalui course yang sedang diadakan <a href="https://github.com/huggingface/deep-rl-class" target="_blank" rel="noreferrer noopener">Hugging Face</a>. <a href="https://huggingface.co/blog/deep-rl-intro" target="_blank" rel="noreferrer noopener">Materi minggu pertamanya sudah rilis</a>, dan pembawaannya sangat menarik, mudah dipahami, dan mencakup dengan baik sisi teori sampai teknis implementasi menggunakan package-package terkini. Sangat recommended untuk temen-temen yang mau belajar RL, silakan saja daftar coursenya di <a href="http://eepurl.com/h1pElX">http://eepurl.com/h1pElX</a>.</p>



<p class="wp-block-paragraph">Artikel ini akan jadi pengantar, kombinasi rangkuman course pertama Hugging Face dan materi-materi RL yang selama ini saya pahami sebelum ikut course ini.  </p>



<h2 class="wp-block-heading">Apa itu Reinforcement Learning?</h2>



<p class="wp-block-paragraph">Kita mulai dari  <strong>Machine Learning</strong>:<em> Area ilmu yang mempelajari bagaimana mesin (komputer) bisa belajar dan melakukan aksi seperti manusia menggunakan sekumpulan data (learning)</em>. Area ilmu ini cukup luas, ada banyak sub-area di dalamnya dan itupun masih ada ratusan algoritma untuk tiap sub-area itu.</p>



<p class="wp-block-paragraph">Sub-area yang cukup populer adalah <strong>Supervised Learning</strong>: komputer belajar dari <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-green-cyan-color"><strong>sekumpulan data yang sudah benar</strong></mark> (<em>ground truth</em>), lalu komputer akan menebak <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color"><strong>output dari data sejenis</strong> </mark>yang belum pernah dilihat. <strong>Misalnya</strong>, diberikan<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-green-cyan-color"> <strong>sekumpulan contoh foto apel dan nanas</strong></mark>, setelah belajar, harapannya di masa depan <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color"><strong>jika dia melihat foto suatu buah</strong></mark>, komputer bisa tahu mana yang apel dan mana yang nanas. <strong>Algoritma </strong>yang bisa digunakan di sub-area ini: KNN, SVM, Neural Network, dll. (<a href="https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/">Tutorial klasifikasi citra</a>)</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-1.png?resize=497%2C241&#038;ssl=1" alt="" class="wp-image-3838" width="497" height="241" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-1.png?resize=1024%2C498&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-1.png?resize=300%2C146&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-1.png?resize=768%2C374&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-1.png?w=1054&amp;ssl=1 1054w" sizes="auto, (max-width: 497px) 100vw, 497px" /><figcaption><sup>Supervised Learning Illustration</sup></figcaption></figure>
</div>


<p class="wp-block-paragraph"><strong>Reinforcement Learning</strong> (RL) juga sub-area di machine learning. Pada Reinforcement Learning, komputer belajar untuk <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color"><strong>mencapai tujuan tertentu</strong></mark> dengan cara <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color"><strong>berinteraksi dengan lingkungannya</strong></mark>. <strong>Contohnya</strong>, kita ingin membuat komputer yang mampu <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color"><strong>memenangkan game catur</strong></mark>, maka kita akan latih komputer dengan cara membuat <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color"><strong>dia bermain (berinteraksi) dengan game catur berkali-kali</strong></mark> hingga dia tahu cara untuk memenangkan suatu permainan. <strong>Algoritma </strong>yang bisa digunakan di sub-area ini: DQN, PPO, A2C, dll.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-2.png?resize=392%2C205&#038;ssl=1" alt="" class="wp-image-3839" width="392" height="205" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-2.png?w=600&amp;ssl=1 600w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/05/image-2.png?resize=300%2C158&amp;ssl=1 300w" sizes="auto, (max-width: 392px) 100vw, 392px" /><figcaption><sup>RL belajar dari interaksi / percobaan di lingkungannya</sup></figcaption></figure>
</div>


<p class="wp-block-paragraph">Kata kunci yang membedakan RL dengan area machine learning lain adalah: <strong>Interaksi dan Tujuan</strong>. Dalam permainan catur, tidak bisa kita tentukan satu contoh langkah yang benar (Ground truth) pada suatu kondisi seperti pada Supervised Learning. Semua kembali ke tujuan akhir, apapun caranya yang penting kita bisa menang.</p>



<p class="wp-block-paragraph">Contoh lain RL adalah self-driving car atau mobil yang bisa mengantar kita sampai ke lokasi secara otomatis. Tujuan dari RL di sini adalah <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">untuk menggerakkan mobil mencapai lokasi tertentu.</mark></strong> Ketika dilatih, model RL akan mencoba <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color"><strong>berinteraksi (mencoba-coba gas, rem, setir) di simulator</strong></mark> (bukan pakai mobil beneran karena bisa bahaya). Dan sama seperti contoh catur, <strong>tidak ada solusi &#8220;benar&#8221;</strong> dalam berkendara, apapun caranya yang penting <strong>bisa sampai di tujuan </strong>(tentunya dengan beberapa batasan seperti waktu, bahan bakar, keselamatan penumpang, dll)</p>



<p class="is-style-default has-cyan-bluish-gray-background-color has-background wp-block-paragraph" style="font-size:14px"><em>Saya lupa dari mana sumbernya, definisi lain yang menarik tentang RL: Reinforcement Learning adalah <strong>&#8220;delayed&#8221; Supervised laerning</strong>. Kalau di Supervised learning, ketika model dikasih data, maka jawaban model bisa dinilai benar salah secara langsung. Tapi di mayoritas kasus RL, ketika model dikasih data maka jawaban (aksi yang diberikan) model tidak bisa langsung dinilai benar salah. Penilaian benar atau salah serangkaian aksinya baru bisa dilakukan di akhir interaksi (misal dalam catur berakhir menang atau kalah)</em></p>



<span id="more-3830"></span>



<h2 class="wp-block-heading">Elemen dalam Reinforcement Learning</h2>



<p class="wp-block-paragraph">Ada beberapa kata kunci ketika mempelajari RL, dua kata kunci pertama yang perlu kita tahu adalah <strong>Agent</strong> dan <strong>Environment</strong>. Agent adalah Subjek AI yang kita latih untuk bisa berinteraksi pada environment dan mencapai suatu goal/tujuan. Sedangkan environment adalah &#8220;dunia&#8221; di mana agen bisa &#8220;melihat&#8221; dan berinteraksi. Agen akan menggunakan environemtn untuk belajar dengan cara melihat apa yang terjadi ketika dia berinteraksi.</p>



<p class="wp-block-paragraph"><strong>Contoh:</strong></p>



<ul class="wp-block-list"><li>RL untuk catur -&gt; environmentnya adalah game catur</li><li>RL untuk self driving car -&gt; environmentnya adalah simulasi kondisi jalanan dan mobil</li></ul>



<p class="wp-block-paragraph">Dalam implementasinya, ketika kita membuat proyek RL <strong>seringnya </strong>kita juga harus membuat environmentnya. Untuk kasus umum seperti untuk game, sudah ada banyak environment yang tersedia secara umum, seperti <a href="https://gym.openai.com/">OpenAI Gym</a> dan <a href="https://www.pettingzoo.ml/">PettingZoo</a>. Dulu saya dan tim di UII pernah buat <a href="http://api.gapoera.com">Gapoera API </a>untuk board game Indonesia.  Tapi untuk kasus yang spesifik, kita harus buat dulu environmentnya, ini yang kadang bikin kesan RL lebih rumit.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image.png?resize=338%2C262&#038;ssl=1" alt="" class="wp-image-3858" width="338" height="262" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image.png?w=647&amp;ssl=1 647w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image.png?resize=300%2C232&amp;ssl=1 300w" sizes="auto, (max-width: 338px) 100vw, 338px" /></figure>
</div>


<h2 class="wp-block-heading">S A R S</h2>



<p class="wp-block-paragraph">Semua kasus pada RL bisa dimodelkan sebagai <strong>(S,A,R,S&#8217;)</strong> singkatan dari <strong>(State, Action, Reward, State&#8217;)</strong>. Istilah-istilah ini bisa kita perhatikan muncul pada ilustrasi di atas. Penting untuk kita mengurai suatu kasus yang akan dikerjakan dalam bentuk <strong>(S,A,R,S&#8217;)</strong>:</p>



<ul class="wp-block-list"><li><strong>State</strong>: Informasi-informasi yang tersedia di environment pada suatu waktu. <strong>Contoh</strong>: posisi bidak catur, posisi orang di jalan, kecepatan mobil saat ini, dll. Beberapa orang juga pakai istilah <strong>Observation </strong>untuk state yang <strong>dapat dilihat agent</strong>. <strong>Contoh</strong>: dalam permainan kartu, agent tidak bisa lihat kartu yang dimiliki lawan. State pada permainan kartu adalah sebaran kartu di tangan kita dan lawan, sedangkan obersvation adalah apa yang bisa dilihat agent, yakni hanya kartu di tangannya. </li><li><strong>Action</strong>: Apa yang bisa dilakukan agent terhadap environment. <strong>Contoh</strong>: menggerakkan pion, menginjak rem sedalam sekian, dll. Suatu Aksi bisa berupa pilihan (diskrit, misal gerakkan suatu pion) bisa juga suatu nilai (kontinyu, misal belokkan mobil 23.5<sup>o</sup> ke kanan)</li><li><strong>Reward</strong>: Apa yang diperoleh agent dari environment untuk mengukur baik buruknya tindakan. Kadang setiap aksi langsung memberikan efek baik buruknya tapi bisa jadi reward hanya diperoleh di akhir. <strong>Contoh</strong>: Pada game, reward hanya diperoleh di akhir, menang atau kalah. Sedangkan pada self-driving car, reward bisa diperoleh di tengah proses, misalnya ketika agent terlalu banyak menginjak rem maka waktu perjalanan akan hilang sekian detik yang berarti agent mendapat reward yang buruk.</li><li><strong>State&#8217;</strong>: Informasi-informasi yang tersedia di environment setelah suatu aksi dilakukan (disebut juga next state). Ketika agent melakukan suatu aksi, agent akan mengubah beberapa informasi pada environment. Posisi bidak catur akan berubah setiap agent melakukan aksi.</li><li><strong>Policy</strong>: Algoritma yang menentukan aksi apa yang seharusnya dipilih dengan diketahui state saat ini. Ini yang akan menjadi fokus utama yang akan kita pelajari.</li></ul>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-1.png?resize=579%2C319&#038;ssl=1" alt="" class="wp-image-3859" width="579" height="319" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-1.png?w=976&amp;ssl=1 976w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-1.png?resize=300%2C165&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/06/image-1.png?resize=768%2C423&amp;ssl=1 768w" sizes="auto, (max-width: 579px) 100vw, 579px" /></figure>
</div>


<p class="wp-block-paragraph">Elemen-elemen tadi tidak langsung muncul ketika kita mengurai masalah. Kadang kita perlu mendefinisikan dengan baik dan hati-hati. Sebagai contoh, dalam menentukan reward, kita harus menentukan secara hati-hati. Apakah berjalan lambat pada self-driving car itu buruk? apakah memakan pion lawan dalam catur itu baik?</p>



<p class="wp-block-paragraph">Dengan mengetahui elemen-elemen tadi, maka bisa kita rumuskan:</p>



<p class="has-cyan-bluish-gray-background-color has-background wp-block-paragraph" style="font-size:14px"><em>Pada Reinforcement Learning kita diminta untuk membuat suatu <strong>Policy</strong> agar ketika agent diberikan suatu <strong>State</strong>, agent dapat mengambil <strong>Action</strong> yang mengantarkan untuk mendapat kumulatif <strong>Reward* </strong>sebesar-besarnya</em></p>



<p class="wp-block-paragraph">*Kumulatif reward = total reward yang diperoleh dari awal hingga akhir.</p>



<h2 class="wp-block-heading">Algoritma-algoritma Reinforcement Learning</h2>



<p class="wp-block-paragraph">Ada banyak sekali pilihan algoritma pada RL, dan karena keterbatasan panjang artikel, saya belum bisa bahas di sini. Tapi jika teman-teman mau memulai, dua algoritma yang saya sarankan untuk pelajari adalah:</p>



<ul class="wp-block-list"><li><strong>Q-Learning / Deep Q-Learning</strong>: Pada Q-Learning nanti teman-teman akan belajar bahwa pada kasus RL yang sederhana kita bisa membuat agent cerdas hanya dengan bermodal sebuah tabel. Badanya Q-Learning dengan Deep Q-Learning adalah pada Deep Q-Learning, kita akan menggunakan <a href="https://structilmy.com/blog/2019/09/02/sekilas-tentang-jaringan-saraf-tiruan-dan-deep-learning/">Neural Network</a> untuk menggantikan tabel yang akan sangat besar.</li><li><strong>REINFORCE</strong>: kalau teman-teman sudah paham Q-Learning dan Deep Q-Learning, saya sarankan untuk menengok algoritma ini. Ini akan sedikit membuka pandangan ada pendekatan yang berbeda untuk membuat agent (dua pandangan ini dikenal <em>policy based </em>vs <em>value based</em>)</li></ul>



<h2 class="wp-block-heading">Bagaimana Codingnya?</h2>



<p class="wp-block-paragraph">Untuk memahami langkah perlangkah dengan baik, kita bisa menulis kodenya dari awal. Bagi pengguna PyTorch, pytorch punya <a href="https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html">tutorial resmi yang cukup bagus di sini</a>. Kalau mau menggunakan library bisa coba <a href="https://stable-baselines3.readthedocs.io/">Stable Baseline 3</a>, walaupun ini library tapi jangan kira cuma klik-klik sedikit, karena library ini nggak se-straight forward itu (mungkin karena RL agak kompleks). InsyaAllah saya akan coba buatkan tutorial untuk menggunakan Stable Baseline ini.</p>



<p class="wp-block-paragraph">Sekian dulu untuk pengantarnya reinforcement learningnya, semoga bermanfaat!. Niatnya nulis ini selesai di minggu pertama Huggingface Course, ternyata sekarang udah jalan 3 minggu tulisannya baru bisa rilis <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" />  bagi yang mau belajar RL dari course Hugging Face, masih jalan di <a href="https://github.com/huggingface/deep-rl-class" target="_blank" rel="noreferrer noopener">https://github.com/huggingface/deep-rl-class</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2022/06/05/reinforcement-learning-belajar-dari-interaksi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3830</post-id>	</item>
		<item>
		<title>Catat Eksperimen Machine Learning dengan Weights and Biases</title>
		<link>https://structilmy.com/blog/2022/01/05/catat-eksperimen-machine-learning-dengan-weights-and-biases/</link>
					<comments>https://structilmy.com/blog/2022/01/05/catat-eksperimen-machine-learning-dengan-weights-and-biases/#respond</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 05 Jan 2022 01:05:00 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[pytorch]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=2794</guid>

					<description><![CDATA[Setelah banyak eksperimen di bidang machine learning, saya masih merasa mencatat keluaran eksperimen itu bagian yang tidak mudah. Rasanya hampir semua eksperimen machine learning yang saya lakukan, saya catat dengan cara dan gaya yang berubah-ubah. Ada yang saya input manual ke excel, atau log ke csv, atau sekadar di notepad. Belum lagi ketika prosesnya, eksperimen [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Setelah banyak eksperimen di bidang machine learning, saya masih merasa mencatat keluaran eksperimen itu bagian yang tidak mudah. Rasanya hampir semua eksperimen machine learning yang saya lakukan, saya catat dengan cara dan gaya yang berubah-ubah. Ada yang saya input manual ke excel, atau log ke csv, atau sekadar di notepad. Belum lagi ketika prosesnya, eksperimen kadang harus berubah, gagal, tidak sesuai harpaan&#8230; (&gt;,&lt;) dan akhirnya bikin mood mencatat rapi itu makin hilang di tengah-tengah.</p>



<p class="wp-block-paragraph">Alhamdulillah akhir 2021 lalu nemu tools menarik untuk mencatat hasil eksperimen dengan rapi dan lengkap dan mudah, yakni dengan <a href="https://wandb.ai/" target="_blank" rel="noreferrer noopener">Weights and Biases</a>. </p>



<figure class="wp-block-image size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/raw.githubusercontent.com/wandb/client/master/.github/wb-logo-lightbg.png?resize=306%2C45&#038;ssl=1" alt="Weights and Biases logo" width="306" height="45"/></figure>



<p class="wp-block-paragraph"><strong>Weights and Biases</strong> (atau kadang ditulis <strong>W&amp;B</strong> atau kadang juga <strong>wandb</strong>) adalah suatu tools yang memudahkan pencatatan eksperimen machine learning. Yang menarik dari weights and biases, sesuai dengan taglinenya &#8220;Log (Almost) Anything&#8221;, dia mampu mencatat hampir semua hal yang terjadi pada saat eksperimen dengan mudah. Beberapa data yang saya ingat bisa dicatat saat setiap run adalah:</p>



<ul class="wp-block-list"><li>Nilai loss atau akurasi atau nilai-nilai lain yang berubah-ubah saat training</li><li>Pemakaian CPU/GPU </li><li>Media-media yang dihasilkan selama eksperimen (audio/citra/video)</li><li>Perubahan bobot dan bias pada model</li><li>Spesifikasi hardware, software, serta versi package python yang terinstall</li><li>Parameter-parameter model, seperti learning rate, batch size, dsb.</li></ul>



<p class="wp-block-paragraph">Semua data itu dicatat secara rapi di server saat setiap kali melakukan &#8220;run&#8221; eksperimen. Jadi ketika kita melakukan beberapa run kita juga bisa membandingkan grafik-grafik data-data tersebut, dan hal ini akan sangat bermanfaat untuk mengukur performa model atau debugging seiring berjalannya waktu.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?resize=505%2C265&#038;ssl=1" alt="" class="wp-image-2808" width="505" height="265" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?resize=1024%2C538&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?resize=300%2C158&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?resize=768%2C403&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?resize=1536%2C807&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?resize=2048%2C1076&amp;ssl=1 2048w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?w=2180&amp;ssl=1 2180w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/WB-Chart-1_2_2022-7-50-03-AM.png?w=3270&amp;ssl=1 3270w" sizes="auto, (max-width: 505px) 100vw, 505px" /></figure></div>



<h2 class="wp-block-heading">Weights and Biases Tutorial</h2>



<p class="wp-block-paragraph">Weights and Biases sendiri sebenarnya bisa berjalan hampir di semua framework machine learning seperi Tensorflow, Pytorch, Scikit-learn, dll. Pada tutorial ini kita akan menggunakan kode yang kita gunakan untuk <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">klasifikasi citra menggunakan CNN dan Pytorch</a>.</p>



<p class="wp-block-paragraph">Secara umum, ada lima langkah utama untuk melakukan pencatatan menggunakan weights and biases:</p>



<ol class="wp-block-list"><li><code><code data-enlighter-language="r" class="EnlighterJSRAW">wandb.login()</code></code>: Untuk menghubungkan projek kita dengan akun W&amp;B yang kita miliki. <a href="https://docs.wandb.ai/guides/technical-faq#can-i-run-wandb-offline" target="_blank" rel="noreferrer noopener nofollow">Secara <em>default </em>W&amp;B membutuhkan koneksi internet untuk menyimpan hasil eksperimen ke server</a>.</li><li><code><code data-enlighter-language="python" class="EnlighterJSRAW">wandb.init()</code></code>: Digunakan untuk mendefinisikan projek apa yang sedang kita jalankan. Pada bagian ini kita juga mendefinisikan parameter apa yang akan dicatat dalam sebuah config.</li><li><code><code data-enlighter-language="python" class="EnlighterJSRAW">wandb.watch()</code></code>: Digunakan untuk memperhatikan (mencatat) kondisi model dari waktu ke waktu</li><li><code data-enlighter-language="python" class="EnlighterJSRAW">wandb.log()</code>: Digunakan untuk mencatat variabel-variabel lain yang dibutuhkan untuk di catat.</li><li><code><code data-enlighter-language="python" class="EnlighterJSRAW">wandb.finish()</code></code>: Menandai akhir proses pencatatan, jika kita ingin memulai proses pencatatan yang lain.</li></ol>



<p class="wp-block-paragraph">Kode lengkap berupa Notebook disertai penjelasan (Bahasa Inggris) bisa diakses di sini: <strong><a href="https://www.kaggle.com/rianadam/pytorch-image-classification-weights-and-biases">Pytorch Image Classification + Weights and Biases</a></strong>.</p>



<p class="wp-block-paragraph">Pada kode tersebut tampak lima poin di atas bisa dilakukan hanya dalam 5 baris saja (masing-masing perintah satu baris). Menggunakan notebook di atas, saya coba bereksperimen dengan mengubah-ubah nilai learning rate dan banyaknya batch saat training. Hasilnya, tampilan ringkasan pencatatan di dashboard Weights and Biases untuk tutorial di atas seperti berikut:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="318" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image.png?resize=1024%2C318&#038;ssl=1" alt="" class="wp-image-2813" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image.png?resize=1024%2C318&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image.png?resize=300%2C93&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image.png?resize=768%2C238&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image.png?resize=1536%2C477&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image.png?w=1884&amp;ssl=1 1884w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption><sub>Saya melakukan empat kali run. dengan mengubah-ubah parameter learning rate dan batch size</sub></figcaption></figure></div>



<p class="wp-block-paragraph">Nama-nama seperti &#8220;autumn-cloud-5&#8221; dan sebagainya, adalah nama yang secara otomatis diberikan W&amp;B untuk membedakan setiap run eksperimen yang kita lakukan. Kita bisa mengubah-ubahnya semau kita jika itu dirasa memudahkan. Untuk detail setiap run bisa dilihat dengan klik setiap namanya, atau mengubah tampilan dalam bentuk tabel seperti di bawah ini:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="252" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-1.png?resize=1024%2C252&#038;ssl=1" alt="" class="wp-image-2814" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-1.png?resize=1024%2C252&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-1.png?resize=300%2C74&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-1.png?resize=768%2C189&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-1.png?resize=1536%2C378&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-1.png?w=1826&amp;ssl=1 1826w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption><sub>Tersedia juga catatan dalam bentuk tabel untuk membandingkan pengaturan parameternya</sub></figcaption></figure></div>



<h2 class="wp-block-heading">W&amp;B Sweeps</h2>



<p class="wp-block-paragraph">W&amp;B juga menyediakan fitur untuk melakukan hyperparameter optimization. Dengan fitur ini, secara otomatis weights and biases akan mencari nilai-nilai untuk setiap parameter yang memberikan hasil terbaik untuk kasus kita. Hasil akhirnya, kita bisa melihat hubungan nilai parameter dengan loss yang diperoleh.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="402" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435-1024x402.png?resize=1024%2C402&#038;ssl=1" alt="" class="wp-image-2815" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?resize=1024%2C402&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?resize=300%2C118&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?resize=768%2C301&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?resize=1536%2C603&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?resize=2048%2C804&amp;ssl=1 2048w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?w=2180&amp;ssl=1 2180w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/s_5D8914551A6C0AABCD5718091305DD3B64FFBA192205DD7B3C90EC93F4002090_1579066494222_image-e1641312647435.png?w=3270&amp;ssl=1 3270w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption><sub>Saya ambil dari dokumentasi W&amp;B, tutorial menyusul insyaAllah</sub></figcaption></figure></div>



<h2 class="wp-block-heading">Komunitas Weights and Biases</h2>



<p class="wp-block-paragraph">Yang menarik lagi tentang W&amp;B ini bukan hanya tools yang disediakan namun juga <a href="https://community.wandb.ai/c/community-events/5" target="_blank" rel="noreferrer noopener">komunitasnya</a>. Saya bahkan lebih dulu mengikuti kegiatan-kegiatan di komunitas W&amp;B sebelum saya mencoba toolsnya. W&amp;B secara aktif mengadakan mini workshop, paper dan book reading group, seminar, Q&amp;A session, dan masih banyak lagi, di mana kita bisa belajar banyak hal seputar machine learning secara umum tidak hanya seputar W&amp;B. </p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="507" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-3.png?resize=1024%2C507&#038;ssl=1" alt="" class="wp-image-2817" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-3.png?resize=1024%2C507&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-3.png?resize=300%2C148&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-3.png?resize=768%2C380&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2022/01/image-3.png?w=1495&amp;ssl=1 1495w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Kalian bisa cek <a href="https://www.youtube.com/c/WeightsBiases">youtube channelnya</a> untuk melihat beberapa rekaman yang tersedia, atau follow <a href="https://twitter.com/weights_biases">akun twitternya</a> untuk bisa update kegiatan-kegiatan terbarunya.</p>



<p class="wp-block-paragraph"><em>Sekian, Semoga bermanfaat!</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2022/01/05/catat-eksperimen-machine-learning-dengan-weights-and-biases/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2794</post-id>	</item>
		<item>
		<title>Membuat Model Tensorflow Object Detection untuk Android</title>
		<link>https://structilmy.com/blog/2021/08/05/membuat-model-tensorflow-object-detection-untuk-android/</link>
					<comments>https://structilmy.com/blog/2021/08/05/membuat-model-tensorflow-object-detection-untuk-android/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Thu, 05 Aug 2021 01:35:00 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Object Detection]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=2457</guid>

					<description><![CDATA[Artikel ini adalah kelanjutan dari artikel setahun yang lalu sebelumnya tentang Tensorflow Object Detection. Di artikel sebelumnya kita fokus pada penyiapan data, kali ini kita akan membahas cara melatih dan membuat model deep learning Tensorflow Object Detection menggunakan Google Colab, hingga akhirnya siap digunakan di Android. Pada tutorial ini kita menggunakan Tensorflow versi 2, yang [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Artikel ini adalah kelanjutan dari artikel <s>setahun yang lalu</s> <em>sebelumnya </em>tentang <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">Tensorflow Object Detection</a>. Di artikel sebelumnya kita fokus pada penyiapan data, kali ini kita akan membahas cara melatih dan membuat model deep learning Tensorflow Object Detection menggunakan Google Colab, hingga akhirnya siap digunakan di Android.</p>



<p class="wp-block-paragraph">Pada tutorial ini kita menggunakan Tensorflow versi 2, yang sedikit berbeda dengan Tensorflow versi 1. Ini salah satu alasan artikel ini tertunda cukup lama, tahun lalu ketika artikel pertama ditulis, Tensorflow versi 2 masih belum cukup stabil untuk object detection maupun untuk diconvert ke TFLite.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?resize=429%2C281&#038;ssl=1" alt="" class="wp-image-2465" width="429" height="281" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?w=995&amp;ssl=1 995w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image.png?resize=768%2C503&amp;ssl=1 768w" sizes="auto, (max-width: 429px) 100vw, 429px" /></figure></div>



<h2 class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">Secara umum ada 3 tahapan untuk membuat model tensorflow untuk mendeteksi objek dan menjadikan model tersebut siap digunakan di Android:</p>



<ol class="wp-block-list"><li><strong>Menyiapkan dataset</strong>. Jika objek yang ingin kita bukan <a href="https://cocodataset.org" target="_blank" rel="noreferrer noopener">objek yang umum dideteksi</a>, maka kita perlu menyiapkan dataset terlebih dahulu. <strong>Tahap ini sudah dibahas <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">di artikel sebelumnya</a></strong><a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">.</a></li><li><strong>Melatih pre-trained model</strong>. Kita akan menggunakan <a href="https://structilmy.com/2021/01/transfer-learning-solusi-deep-learning-dengan-data-sedikit/">pre-trained model</a>, karena untuk merangkai dan melatih model dari awal akan memakan waktu dan membutuhkan resource yang besar. Kita cukup melakukan fine-tuning model agar model memiliki performa yang baik, untuk dataset baru, dengan waktu pelatihan yang lebih singkat.</li><li><strong>Mengconvert model menjadi TFLite.</strong> Proses mengubah model yang sudah dilatih ke format yang dapat dipahami oleh mobile Android.</li></ol>



<h2 class="wp-block-heading">Source Code</h2>



<p class="wp-block-paragraph">Tutorial Tensorflow Object Detection ini tersedia di Google Colab berikut: <a href="https://colab.research.google.com/drive/1dNIIcDBMaKieGzSl1BVE5H6wu17n6cO7?usp=sharing" target="_blank" rel="noreferrer noopener">https://colab.research.google.com/drive/1dNIIcDBMaKieGzSl1BVE5H6wu17n6cO7?usp=sharing</a>. Untuk dataset dan script-script lain yang akan digunakan dapat diakses di repository github berikut: <a href="https://github.com/rianrajagede/object-detection.git" target="_blank" rel="noreferrer noopener">https://github.com/rianrajagede/object-detection.git</a>. <strong>Tutorial ini merujuk pada link Google Colab dan repo github di atas</strong>.</p>



<h2 class="wp-block-heading">1. Instalasi Tensorflow Object Detection</h2>



<p class="wp-block-paragraph">Ketika kita menginstall Tensorflow, kita belum menginstall Tensorflow Object Detection API. Hal ini juga berlaku di Google Colab, kita tetap perlu menginstall Tensorflow Object Detection API terlebih dahulu. Langkah instalasi resminya bisa <a href="https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2.md#installation" target="_blank" rel="noreferrer noopener">diakses di sini</a>. Saat artikel ini ditulis instalasi bisa dilakukan dengan:</p>



<p class="wp-block-paragraph"><strong>1.</strong> <strong>Clone github Tensorflow Object Detection API</strong> di Google Colab. Penanda tanda seru (<code>!</code>) di awal baris menunjukkan baris tersebut sedang menjalankan perintah Command Prompt, bukan Python. Perintah ini akan membuat folder <code>models</code> yang berisi file-file dari repository tensorflow object detection.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!git clone https://github.com/tensorflow/models.git</pre>



<p class="wp-block-paragraph"><strong>2. Lalu install API</strong> menggunakan perintah di bawah. Penanda <code>%%bash</code> fungsinya mirip dengan tanda <code>!</code>, jika perintah <code>%%bash</code> ditulis di awal baris menunjukkan cell Google Colab tersebut sedang menjalankan perintah Command Prompt, bukan Python.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%%bash
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
cp object_detection/packages/tf2/setup.py .
python -m pip install .</pre>



<p class="wp-block-paragraph">3. <strong>Jalankan test</strong> untuk memastikan instalasi berhasil dengan menjalankan perintah berikut. Jika semua tertulis &#8220;OK&#8221; berarti instalasi berhasil.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python models/research/object_detection/builders/model_builder_tf2_test.py</pre>



<span id="more-2457"></span>



<h2 class="wp-block-heading">2. Download Dataset</h2>



<p class="wp-block-paragraph">Dataset yang akan kita gunakan ada di repository github yang saya share di bagian Source Code tadi, gunakan perintah di bawah untuk mengkloning repositori ke google colab. <strong>Setelah data didownload, lakukan pemrosesan data seperti yang telah dijelaskan <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">di artikel sebelumnya</a></strong> (atau cek link Google Colab di atas di bagian &#8220;Menyiapkan TFrecord file&#8221;.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!git clone https://github.com/rianrajagede/object-detection.git</pre>



<p class="wp-block-paragraph">Dataset ini berisikan gabungan dari dua public dataset yang terdiri dari objek Rakun dan Kanguru. Setiap citra memiliki file anotasi bertipe XML dengan nama yang sama. Berikut ini contoh citra yang ada di file.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/TestImage.png?resize=276%2C209&#038;ssl=1" alt="" class="wp-image-2471" width="276" height="209" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/TestImage.png?w=432&amp;ssl=1 432w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/TestImage.png?resize=300%2C227&amp;ssl=1 300w" sizes="auto, (max-width: 276px) 100vw, 276px" /></figure></div>



<h2 class="wp-block-heading">3. Training Pre-trained Model</h2>



<p class="wp-block-paragraph">Pre-trained model adalah model yang siap pakai dan sudah dilatih dengan dataset yang besar. Penjelasan lebih detail tentang pre-trained model dan penggunananya ada di artikel <a href="https://structilmy.com/2021/01/transfer-learning-solusi-deep-learning-dengan-data-sedikit/">sebelumnya tentang transfer learning.</a></p>



<p class="wp-block-paragraph">1. <strong>Download Pre-trained model</strong> yang akan digunakan. Pre-trained model yang tersedia untuk object detection dapat dilihat daftarnya <a href="https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md" target="_blank" rel="noreferrer noopener nofollow">di halaman ini</a>. Sebagai contoh, kita akan menggunakan salah satu jenis pre-trained model SSD MobileNetv2 (<code>ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz</code>).</p>



<p class="wp-block-paragraph">Berikut perintah yang digunakan untuk mendownload dan mengekstrak pre-trained model:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!wget http://download.tensorflow.org/models/object_detection/tf2/20200710/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz
!tar -zxvf ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz</pre>



<p class="wp-block-paragraph">Hasil dari proses ini adalah sebuah directory dengan nama yang sesuai dan berisikan pre-trained model.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-2.png?resize=276%2C157&#038;ssl=1" alt="" class="wp-image-2469" width="276" height="157" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-2.png?w=515&amp;ssl=1 515w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-2.png?resize=300%2C171&amp;ssl=1 300w" sizes="auto, (max-width: 276px) 100vw, 276px" /></figure></div>



<p class="wp-block-paragraph"><strong>2. Atur Pipeline.config</strong>. Sebelum proses training, kita perlu mengatur beberapa hal di file pipeline.config yang tersedia di folder pre-trained model. File ini bertanggung jawab mengatur parameter-parameter pelatihan ataupun evaliasi seperti lama pelatihan, arsitektur, dsb.</p>



<p class="wp-block-paragraph">File Pipeline.config bisa dibuka dengan text editor biasa, atau jika menggunakan Google Colab bisa dengan cara <strong>double klik</strong>, nanti akan muncul jendela editor kecil.</p>



<p class="wp-block-paragraph">Apa saja yang perlu diatur dari file tersebut? Sebenarnya banyak yang bisa diatur, tapi pada tutorial ini kita atur beberapa hal saja.</p>



<ul class="wp-block-list"><li>Nilai pada <code>num_class</code> disesuaikan dengan jumlah class yang akan digunakan. Pada tutorial ini <code>num_class: 2</code></li><li>Temukan bagian <code>fine_tune_checkpoint_type</code> lalu ubah dari <code>classification</code> menjadi <code>detection</code></li><li>Nilai <code>batch_size</code> menentukan <a href="https://structilmy.com/2021/07/batch-epoch-step-istilah-istilah-pada-gradient-descent/">ukuran batch</a>. Kita gunakan batch kecil saja ubah <code>batch_size: 32</code></li><li>Untuk dataset yang sederhana ini, kita bisa gunakan jumlah iterasi yang kecil. Atur <code>num_steps: 1000</code></li><li>MobilenetV2 ini secara default dilatih menggunakan learning rate yang dinamis berdasar banyak iterasi (nilai learning rate bisa berubah-ubah). Ini tampak dari bagian di bawah. Karena kita mengubah <code>num_steps</code> lebih kecil, maka kita sesuaikan juga <code>total_steps: 1000</code> dan <code>warmup_steps: 100</code>. </li></ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">learning_rate {
        cosine_decay_learning_rate {
          learning_rate_base: 0.07999999821186066
          total_steps: 50000
          warmup_learning_rate: 0.026666000485420227
          warmup_steps: 1000
        }
      }</pre>



<ul class="wp-block-list"><li>Cari pada file pipeline tulisan <code>PATH_TO_BE_CONFIGURED</code>. lalu sesuaikan dengan path yang dituju.<ul><li>Untuk <code>fine_tune_checkpoint</code> arahkan ke checkpoint file dari pretrained model. Berdasarkan tutorial ini, pathnya <code>/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint/ckpt-0</code></li><li>Untuk <code>input_path</code> pada <code>train_input_reader</code> arahkan ke tfrecord data train. Berdasarkan tutorial ini, pathnya <code>/content/object-detection/train.record</code></li><li>Untuk <code>input_path</code> pada <code>eval_input_reader</code> arahkan ke tfrecord data test. Berdasarkan tutorial ini, pathnya <code>/content/object-detection/test.record</code></li><li>Untuk <code>label_map_path</code> arahkan ke file <code>label_map.pbtxt</code>. Di tutorial ini pathnya <code>/content/object-detection/label_map.pbtxt</code></li></ul></li></ul>



<p class="wp-block-paragraph"><strong>3. Jalankan perintah berikut untuk mulai pelatihan</strong>. Pada parameter <code>--model_dir</code> kita beritahu di mana model output proses pelatihan ini akan disimpan. Sedangkan parameter <code>--pipeline_config_path</code> berisi path menuju file pipeline.config yang tadi sudah kita edit.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python /content/models/research/object_detection/model_main_tf2.py \
                --alsologtostderr \
                --model_dir="/content/output/" \
                --pipeline_config_path="/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config"</pre>



<p class="wp-block-paragraph">Proses training akan berlangsung cukup lama meskipun telah dijalankan di Google Colab dan dengan data yang tidak terlalu banyak. Untuk 1000 steps, kira-kira proses pelatihan akan memakan waktu 10-15 menit. Setelah proses pelatihan di atas selesai, model akan tersimpan di folder <code>/output</code> dalam format <code>SavedModel</code>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-4.png?resize=224%2C137&#038;ssl=1" alt="" class="wp-image-2486" width="224" height="137" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-4.png?w=411&amp;ssl=1 411w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-4.png?resize=300%2C183&amp;ssl=1 300w" sizes="auto, (max-width: 224px) 100vw, 224px" /></figure></div>



<h2 class="wp-block-heading">4. Convert ke TFLite</h2>



<p class="wp-block-paragraph">Model yang dihasilkan sudah bisa digunakan, namun untuk bisa menggunakannya di mobile android, kita perlu mengubah formatnya menjadi bentuk TFLite. Proses pengubahan dari <code>SavedModel</code> ke TFLite dilakukan dalam dua langkah:</p>



<p class="wp-block-paragraph"><strong>1. Buat SavedModel yang &#8220;ramah&#8221; untuk TFLite</strong>. Perintah berikut ini jika dijalankan akan menghasilkan sebuah folder <code>/tflite</code> yang berisi <code>SavedModel</code> juga namun lebih siap untuk dijadikan TFLite (model sementara)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python models/research/object_detection/export_tflite_graph_tf2.py \
    --trained_checkpoint_dir {'/content/output'} \
    --output_directory {'/content/tflite'} \
    --pipeline_config_path {'/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config'}</pre>



<p class="wp-block-paragraph"><strong>2. Convert SavedModel tersebut menjadi TFLite.</strong> Jalan perintah berikut untuk menghasilkan <code>model.tflite </code>di folder <code>/tflite</code>. Jika diperhatikan, kode di bawah ini merupakan perintah python, untuk menjalankan tentu perlu ada package yang diimport. Cek kode di Colab untuk lebih lengkapnya.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">_TFLITE_MODEL_PATH = "/content/tflite/model.tflite"

converter = tf.lite.TFLiteConverter.from_saved_model('/content/tflite/saved_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()

with open(_TFLITE_MODEL_PATH, 'wb') as f:
  f.write(tflite_model)</pre>



<p class="wp-block-paragraph">Dan selesai! kalian bisa cek <code>model.tflite</code> di folder tersebut, lalu menggunakannya di android.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-3.png?resize=255%2C64&#038;ssl=1" alt="" class="wp-image-2485" width="255" height="64" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-3.png?w=454&amp;ssl=1 454w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/image-3.png?resize=300%2C75&amp;ssl=1 300w" sizes="auto, (max-width: 255px) 100vw, 255px" /></figure></div>



<h2 class="wp-block-heading">5. Inference Model TFLite</h2>



<p class="wp-block-paragraph">Pada bagian ini kita akan melihat aksi model tflite yang sudah kita buat. Untuk melihat performa model TFLite yang dihasilkan, kita bisa cek menggunakan script yang ada di github repo di atas, yakni <code>TFLite_detection_image.py</code>.</p>



<p class="wp-block-paragraph">Sebelum menjalankan upgrade terlebih dahulu Open CV di Google Colab ke versi terbaru. Saat artikel ini dibuat OpenCV di Google Colab masih versi lama sehingga bisa menyebabkan error ketika inference</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!pip install -U opencv-python</pre>



<p class="wp-block-paragraph">Lalu jalankan script tersebut dengan format sebagai berikut. Script ini akan menguji model untuk mendeteksi objek Rakun dan Kanguru dari folder <code>/object-detection/test_img_only</code>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">!python /content/object-detection/scripts/TFLite_detection_image.py --imagedir "/content/object-detection/test_img_only" \
    --modeldir "/content/tflite" \
    --graph "/content/tflite/model.tflite" \
    --labels "/content/object-detection/labelmap.txt" </pre>



<p class="wp-block-paragraph">Pada bagian <code>labels</code> path kita diarahkan ke <code>labelmap.txt</code> bukan <code>label_map.pbtxt</code>. File <code>labelmap.txt</code> sedikit berbeda dengan <code>label_map.pbtxt</code> dan digunakan untuk inference di android. </p>



<p class="wp-block-paragraph">Jika dijalankan, maka script akan menghasilkan gambar yang yang telah dianotasi di home folder.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/index.jpg?resize=373%2C239&#038;ssl=1" alt="" class="wp-image-2484" width="373" height="239" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/index.jpg?w=650&amp;ssl=1 650w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/08/index.jpg?resize=300%2C192&amp;ssl=1 300w" sizes="auto, (max-width: 373px) 100vw, 373px" /></figure></div>



<p class="wp-block-paragraph">Sekian, Selamat mencoba semoga bermanfaat, jika ada yang kurang jelas bisa ditanyakan di kolom komentar <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><sup>Photo by <a href="https://unsplash.com/@lkverwoerd?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Lisette Verwoerd</a> on <a href="https://unsplash.com/s/photos/bird?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></sup></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/08/05/membuat-model-tensorflow-object-detection-untuk-android/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2457</post-id>	</item>
		<item>
		<title>Batch, Epoch, Step. Istilah-istilah pada Gradient Descent</title>
		<link>https://structilmy.com/blog/2021/07/11/batch-epoch-step-istilah-istilah-pada-gradient-descent/</link>
					<comments>https://structilmy.com/blog/2021/07/11/batch-epoch-step-istilah-istilah-pada-gradient-descent/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Sun, 11 Jul 2021 01:57:10 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[neural network]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=2404</guid>

					<description><![CDATA[Ketiga istilah di atas sering muncul ketika kita sedang belajar atau implementasi model neural network, khususnya ketika membahas Gradient Descent. Batch, epoch, dan step, adalah sebagian istilah yang digunakan menjelaskan proses iterasi di Gradient Descent. Istilah-istilah itu tidak hanya ditemukan di buku teori, tetapi juga di dokumentasi-dokumentasi framework yang akan kita gunakan. Karenanya, sangat penting [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ketiga istilah di atas sering muncul ketika kita sedang belajar atau implementasi model neural network, khususnya ketika membahas <a href="https://structilmy.com/2020/08/step-by-step-backpropagation-menggunakan-python/">Gradient Descent</a>. Batch, epoch, dan step, adalah sebagian istilah yang digunakan menjelaskan proses iterasi di Gradient Descent. Istilah-istilah itu tidak hanya ditemukan di buku teori, tetapi juga di dokumentasi-dokumentasi framework yang akan kita gunakan. Karenanya, sangat penting untuk bisa membedakannya dengan baik.</p>



<h2 class="wp-block-heading">Gradient Descent</h2>



<p class="wp-block-paragraph"><a href="https://structilmy.com/2019/07/contoh-perhitungan-algoritma-backpropagation/">Gradient descent</a> adalah algoritma optimasi yang digunakan untuk <strong>menemukan parameter yang menghasilkan nilai minimum pada suatu fungsi</strong>. Dalam kasus neural network, Gradient Descent digunakan untuk menemukan bobot model terbaik yang menghasilkan error minimum. Detail perhitungan gradient descent contohnya ada pada p<a href="https://structilmy.com/2019/07/contoh-perhitungan-algoritma-backpropagation/">artikel sebelumnya</a>, sedangkan implementasinya dapat di baca di <a href="https://structilmy.com/2020/08/step-by-step-backpropagation-menggunakan-python/">artikel berikut ini</a>.</p>



<p class="wp-block-paragraph">Secara umum, langkah yang dilakukan untuk mencerdaskan model neural network menggunakan gradient descent adalah sebagai berikut:</p>



<ol class="wp-block-list"><li><span class="has-inline-color has-black-color"></span><span class="has-inline-color has-luminous-vivid-orange-color">Sebuah input<em>-x<sub>i</sub> </em>masuk ke model neural network, lalu menghasilkan output / error <em>E</em><sub><em>i</em></sub></span><span class="has-inline-color has-black-color"> (forward propagation)</span></li><li><span class="has-inline-color has-vivid-purple-color">Gradient descent terhadap output / error <em>E</em> untuk mengupdate nilai bobot model <em>W</em></span> (backward propagation)</li><li>Lakukan kedua langkah di atas terhadap semua data berkali-kali hingga diperolah model terbaik.</li></ol>



<p class="wp-block-paragraph"><sup>Untuk kemudahan penjelasan, poin no. 1 di atas akan kami sebut sebagai <strong><span class="has-inline-color has-luminous-vivid-orange-color">Langkah 1</span></strong> (bold dengan warna orange) dan poin no. 2 akan kami sebut sebagai <strong><span class="has-inline-color has-vivid-purple-color">Langkah 2</span></strong> (bold dengan warna ungu)</sup></p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-3.png?resize=514%2C114&#038;ssl=1" alt="" class="wp-image-2422" width="514" height="114" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-3.png?resize=1024%2C229&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-3.png?resize=300%2C67&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-3.png?resize=768%2C172&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-3.png?w=1187&amp;ssl=1 1187w" sizes="auto, (max-width: 514px) 100vw, 514px" /></figure></div>



<p class="wp-block-paragraph">Langkah-langkah di atas masih cukup umum,<strong> <em>Jika ada lebih dari satu data langkahnya seperti apa?</em></strong> Dari sinilah akan muncul istilah-istilah di awal tadi. Misalkan kita memiliki 100 data latih, maka urutan yang dilakukan pada Gradient Descent adalah:</p>



<ol class="wp-block-list"><li>Lakukan <span class="has-inline-color has-luminous-vivid-orange-color"><strong>Langkah 1</strong></span> untuk setiap data (dari data latih ke 1 hingga 100), sehingga diperoleh 100 nilai eror <em>E<sub>i</sub></em></li><li>Dari 100 nilai error itu, kita hitung rata-ratanya untuk memperoleh sebuah nilai error <em>E </em></li><li>Lakukan <span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span> menggunakan <em>E</em> untuk mengupdate <em>W</em> (hanya 1x)</li></ol>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-2.png?resize=634%2C289&#038;ssl=1" alt="" class="wp-image-2421" width="634" height="289" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-2.png?resize=1024%2C467&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-2.png?resize=300%2C137&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-2.png?resize=768%2C351&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-2.png?resize=1536%2C701&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-2.png?w=1619&amp;ssl=1 1619w" sizes="auto, (max-width: 634px) 100vw, 634px" /></figure></div>



<p class="wp-block-paragraph">Langkah diatas terjadi dalam satu epoch. Untuk mendapatkan model yang baik kita perlu mengulangi langkah di atas lebih dari satu kali (beberapa epoch).</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong><span style="text-decoration: underline;">Definisi sebuah Epoch</span></strong>, adalah ketika kita telah menggunakan semua data latih pada proses pelatihan<span class="has-inline-color has-luminous-vivid-orange-color"></span>. Pada contoh di atas, kita sudah melalui sebuah epoch karena kita telah menggunakan 100 data latih yang kita miliki.</p><p>Pada contoh tersebut sebuah epoch terdiri dari 100 kali <span class="has-inline-color has-luminous-vivid-orange-color"><strong>Langkah 1</strong></span> dan 1 kali<span class="has-inline-color has-vivid-purple-color"> <strong>Langkah 2</strong></span>.</p></blockquote>



<span id="more-2404"></span>



<h2 class="wp-block-heading">Stochastic Gradient Descent </h2>



<p class="wp-block-paragraph">Ketika data latih yang kita miliki cukup besar, proses pelatihan menggunakan Gradient Descent bisa memakan waktu yang sangat lama. Jika diperhatikan, pada satu epoch hanya terjadi satu kali proses perbaikan model (<span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span>) dan itu pun menggunakan rata-rata error semua data. Bayangkan jika ada 1,000,000 data, maka rata-rata errornya hanya akan memberi<strong> sedikit informasi </strong>untuk perbaikan model. Sehingga butuh jumlah epoch yang sangat besar untuk bisa melatih modelnya.</p>



<p class="wp-block-paragraph">Pada Stochastic Gradient Descent (SGD), rumus perhitungannya tetap sama dengan Gradient Descent, yang membedakan adalah kapan <span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span> atau langkah perbaikan bobot model dilakukan. Pada SGD, <strong><span class="has-inline-color has-vivid-purple-color">Langkah 2</span></strong> tidak dilakukan hanya sekali tiap epoch setelah memproses semua data, melainkan <strong>dilakukan setiap satu atau sejumlah data</strong>.</p>



<p class="wp-block-paragraph">Misalnya kita memiliki 100 data latih, dan <strong>untuk setiap satu data</strong> dilakukan update bobot, maka ilustrasinya seperti di bawah ini. Satu data masuk, dihitung errornya, lalu dengan error tersebut model akan langsung d-update bobotnya.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-5.png?resize=668%2C326&#038;ssl=1" alt="" class="wp-image-2424" width="668" height="326" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-5.png?resize=1024%2C500&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-5.png?resize=300%2C146&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-5.png?resize=768%2C375&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-5.png?resize=1536%2C750&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-5.png?w=1618&amp;ssl=1 1618w" sizes="auto, (max-width: 668px) 100vw, 668px" /></figure></div>



<p class="wp-block-paragraph">Dan berikut ini ilustrasi jika dilakukan <strong>untuk setiap lima data</strong>. Untuk setiap lima data, dihitung rata-rata errornya, lalu menggunakan rata-rata error tersebut diupdate modelnya. Diulangi lagi untuk setiap lima data hingga data terakhir.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-4.png?resize=736%2C376&#038;ssl=1" alt="Mini Batch SGD Illustration" class="wp-image-2423" width="736" height="376" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-4.png?resize=1024%2C524&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-4.png?resize=300%2C153&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-4.png?resize=768%2C393&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-4.png?resize=1536%2C785&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/07/image-4.png?w=1645&amp;ssl=1 1645w" sizes="auto, (max-width: 736px) 100vw, 736px" /></figure></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong><span style="text-decoration: underline;">Definisi Batch</span></strong>, adalah sejumlah data atau subset data yang diproses menggunakan <span class="has-inline-color has-luminous-vivid-orange-color"><strong>Langkah 1</strong></span> sebelum akhirnya model diupdate menggunakan <strong><span class="has-inline-color has-vivid-purple-color">Langkah 2</span></strong>.</p><p><strong><span style="text-decoration: underline;">Batch Size</span></strong> adalah banyaknya data pada sebuah batch. Pada contoh di-atas diilustrasikan SGD dengan <strong>batch size bernilai 1</strong> dan <strong>batch size bernilai 5</strong>.</p></blockquote>



<p class="wp-block-paragraph">Dari ilustrasi di atas tampak jumlah <span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span> yang terjadi pada sebuah epoch menjadi berbeda: Pada ilustrasi SGD dengan batch size 1, <span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span> dilakukan setiap 1 data sehingga untuk satu epoch terjadi 100 kali <span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span>. Sedangkan pada ilustrasi SGD dengan batch size 5, langkah 2 dilakukan setiap 5 data, sehingga untuk 100 data, <span class="has-inline-color has-vivid-purple-color"><strong>Langkah 2</strong></span> dilakukan sebanyak 100/5  = 20 kali.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong><span style="text-decoration: underline;">Mini-Batch Gradient Descent</span></strong> adalah jenis SGD dengan batch size lebih dari 1, tetapi bukan keseluruhan data. Seperti contoh di atas, batch size bernilai 5. </p><p><strong><span style="text-decoration: underline;">Definisi Step</span>s</strong> sebenarnya definisi step ini berasal dari framework atau library yang biasanya kita pakai. Jadi silahkan cek kembali untuk memastikan. Tapi pada umumnya, orang-orang menggunakan istilah step untuk menunjukkan berapa kali <strong><span class="has-inline-color has-vivid-purple-color">Langkah 2</span></strong> dilakukan pada sebuah epoch. Misalnya pada contoh di atas, Mini-batch SGD dengan batch size 5 memiliki 20 steps.</p></blockquote>



<p class="wp-block-paragraph">Sebagai penutup, perbedaan jumlah update bobot / backward propagation / <strong><span class="has-inline-color has-vivid-purple-color">Langkah 2</span></strong> untuk setiap epoch sangat mempengarui proses pelatihan. Analoginya seperti kita sedang tanya alamat rumah di tengah kota, lalu kita menerima jawaban seperti ini:</p>



<ul class="wp-block-list"><li>Gradient Descent = &#8220;Rumahnya di Kota bagian Selatan&#8221; (jawaban terlalu umum)</li><li>Stochastic Gradient Descent = &#8220;Belok kiri di tikungan depan&#8221; (informasi detail tapi bisa jadi terlalu sedikit)</li><li>Mini-batch Gradient Descent = &#8220;Ke arah Timur dulu sampai ketemu masjid&#8221; (informasi pertengahan)</li></ul>



<h2 class="wp-block-heading">Penutup</h2>



<p class="wp-block-paragraph">Sebagai penutup, saya mau kasih pertanyaan untuk menguji pemahaman <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Jika saya memiliki dataset berupa 500 sample citra, lalu saya latih menggunakan batch berukuran 5, selama 100 epoch, berapa banyak step yang terjadi selama pelatihan?</p>



<p class="wp-block-paragraph">Sekian, semoga bermanfaat!</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><sup>Photo by <a href="https://unsplash.com/@andreicastanha?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Andrei Castanha</a> on <a href="https://unsplash.com/s/photos/downhill?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></sup></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/07/11/batch-epoch-step-istilah-istilah-pada-gradient-descent/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2404</post-id>	</item>
		<item>
		<title>Siamese Network: Neural network untuk menguji kemiripan</title>
		<link>https://structilmy.com/blog/2021/06/29/siamese-network-neural-network-untuk-menguji-kemiripan/</link>
					<comments>https://structilmy.com/blog/2021/06/29/siamese-network-neural-network-untuk-menguji-kemiripan/#respond</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Tue, 29 Jun 2021 02:28:45 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[neural network]]></category>
		<category><![CDATA[pytorch]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=2345</guid>

					<description><![CDATA[Bayangkan kita diminta membuat model machine learning yang akan digunakan untuk presensi mahasiswa menggunakan foto wajah. Universitas yang meminta dibuatkan model tersebut memiliki 10,000 mahasiswa. Jika kita mengasumsikan ini adalah permasalahan klasifikasi, apakah itu berarti ini adalah klasifikasi citra dengan jumlah kelas 10,000? Itu jauh lebih banyak daripada data benchmark yang biasa digunakan klasifikasi citra, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bayangkan kita diminta membuat model machine learning yang akan  digunakan untuk presensi mahasiswa menggunakan foto wajah. Universitas yang meminta dibuatkan model tersebut memiliki 10,000 mahasiswa. Jika kita mengasumsikan ini adalah permasalahan klasifikasi, apakah itu berarti ini adalah <strong>klasifikasi citra dengan jumlah kelas 10,000?</strong></p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-3.png?resize=438%2C193&#038;ssl=1" alt="" class="wp-image-2379" width="438" height="193" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-3.png?w=831&amp;ssl=1 831w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-3.png?resize=300%2C132&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-3.png?resize=768%2C338&amp;ssl=1 768w" sizes="auto, (max-width: 438px) 100vw, 438px" /><figcaption><sup>Klasifikasi dengan 10,000 class??</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Itu jauh lebih banyak daripada data benchmark yang biasa digunakan klasifikasi citra, <a href="https://www.image-net.org/" target="_blank" rel="noreferrer noopener nofollow">Imagenet</a>, yang hanya 1000 kelas! Selain itu, tidak mudah juga untuk mendapatkan data per kelasnya. Apakah setiap mahasiswa harus difoto ratusan kali agar dapat data latih yang representatif? lalu bagaimana jika ada mahasiswa baru? nah, di sinilah Siamese Network bisa jadi salah satu solusinya.</p>



<h2 class="wp-block-heading">Siamese Network</h2>



<p class="wp-block-paragraph">Siamese network adalah jenis arsitektur neural network di mana <strong>menerima dua input</strong>, yang masing-masingnya masuk ke subnetwork <strong>yang sama</strong> lalu <strong>digabungkan </strong>untuk dihitung kemiripan antara dua input tersebut.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image.png?resize=463%2C203&#038;ssl=1" alt="Siamese network" class="wp-image-2351" width="463" height="203" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image.png?resize=1024%2C451&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image.png?resize=300%2C132&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image.png?resize=768%2C338&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image.png?w=1094&amp;ssl=1 1094w" sizes="auto, (max-width: 463px) 100vw, 463px" /><figcaption><sup>Siamese Network untuk identifikasi wajah</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Siamese network digunakan untuk menghitung kemiripan dua data. Kemiripan antara dua data di sini tergantung pada kasusnya, misal kemiripan wajah dari orang yang sama namun memiliki dua foto yang berbeda, atau kemiripan gaya berpakaian dari dua orang yang berbeda, dll. Model dilatih dengan menerima input pasangan data, dengan output yang dihasilkan bisa berupa biner (sama atau tidak) atau sebuah real value yang merepresentasikan tingkat tingkat kemiripan.</p>



<p class="wp-block-paragraph">Siamese network <strong>tidak menspesifikkan</strong> arsitektur pada bagian subnetwork, asalkan dua arsitektur yang digunakan adalah sama (bentuk dan bobotnya).  Kita bisa memakai konsep ini untuk beragam jenis data. Misalnya kita ingin mengecek kemiripan pertanyaan maka kita bisa menggunakan subnetwork berupa LSTM network, jika ingin mengecek kemiripan foto kita bisa gunakan CNN sebagai subnetworknya. Output dari subnetwork ini adalah vektor, dengan ukuran bebas (sebagai hyperparameter yang kita tentukan sendiri)</p>



<p class="wp-block-paragraph">Ada banyak metode yang bisa dilakukan di bagian penggabungan (Merge) hasil dari dua subnetwork. Beberapa yang pernah saya tahu:</p>



<ul class="wp-block-list"><li>Hitung selisih absolut antar vektor output subnetwork lalu masukkan vektor selisihnya ke sebuah neural net, </li><li>Concat atau gabungkan kedua output lalu masukkan vektor gabungannya ke sebuah neural net, </li></ul>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-4.png?resize=738%2C188&#038;ssl=1" alt="" class="wp-image-2391" width="738" height="188" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-4.png?resize=1024%2C261&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-4.png?resize=300%2C76&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-4.png?resize=768%2C195&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-4.png?resize=1536%2C391&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-4.png?w=1863&amp;ssl=1 1863w" sizes="auto, (max-width: 738px) 100vw, 738px" /></figure></div>



<span id="more-2345"></span>



<h2 class="wp-block-heading">Contoh Kasus </h2>



<p class="wp-block-paragraph">Siamese network cocok digunakan jika dataset memiliki banyak sekali class, tapi sampel tiap class sangat sedikit. Misalnya jika kita akan membuat sistem verifikasi wajah untuk presensi.</p>



<p class="wp-block-paragraph">Langkah pertama yang perlu kita lakukan adalah dengan membuat pasangan-pasangan dari data yang kita miliki. Sebagai ilustrasi anggap kita memiliki foto wajah 5 orang {A, B, C, D, E} dan masing-masing orang memiliki 3 foto {A1, A2, A3, B1, B2, &#8230;, E3} maka kita bisa buat pasangan seperti di bawah, dan memberi label &#8220;1&#8221; untuk yang artinya kedua foto menunjukkan orang yang sama, dan &#8220;0&#8221; untuk sebaliknya.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-7.png?resize=549%2C206&#038;ssl=1" alt="" class="wp-image-2394" width="549" height="206" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-7.png?resize=1024%2C386&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-7.png?resize=300%2C113&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-7.png?resize=768%2C289&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-7.png?w=1197&amp;ssl=1 1197w" sizes="auto, (max-width: 549px) 100vw, 549px" /><figcaption><sup>Setiap sample di dataset terdiri dari dua citra wajah, lalu label bernilai 1 jika itu foto orang yang sama, dan 0 jika sebaliknya</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Setelah itu model dilatih dengan data tersebut. Inputnya adalah sepasang foto dan outputnya akan diukur menggunakan label yang ada. </p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-8.png?resize=614%2C250&#038;ssl=1" alt="" class="wp-image-2395" width="614" height="250" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-8.png?resize=1024%2C417&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-8.png?resize=300%2C122&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-8.png?resize=768%2C313&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-8.png?resize=1536%2C626&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/06/image-8.png?w=1650&amp;ssl=1 1650w" sizes="auto, (max-width: 614px) 100vw, 614px" /></figure></div>



<p class="wp-block-paragraph">Setelah model terlatih, proses verifikasi foto ketika presensi bisa dilakukan dengan mencocokkan sampel yang baru ke foto yang ada di database kita. Jika model memberi output True, maka orang tersebut berhasil teridentifikasi.</p>



<h2 class="wp-block-heading">Implementasi di PyTorch</h2>



<p class="wp-block-paragraph">Implementasi arsitektur Siamese Network di <a href="https://structilmy.com/2020/02/implementasi-jaringan-saraf-tiruan-menggunakan-pytorch/">PyTorch </a>tidak terlalu sulit, tergantung seperti apa subnetwork yang digunakan dan cara penggabungan yang dipilih. </p>



<p class="wp-block-paragraph">Di bawah ini adalah contoh implementasi Class SiameseNetwork di PyTorch yang sederhana dengan linear layer biasa. Proses merge dilakukan dengan menghitung selisih absolut, lalu memasukkan ke neural net sederhana yang memberi output biner (True / False).</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class SiameseNetwork(nn.Module):
    def __init__(self, h, input_size):
        super(SiameseNetwork, self).__init__()
        self.subnet = nn.Linear(input_size, h)
        self.mergenet = nn.Linear(h, 2)
    
    def forward(self, x1, x2):
        output1 = F.relu(self.subnet(x1))
        output2 = F.relu(self.subnet(x2))
        diff = torch.abs(output1 - output2)
        output = self.mergnet(diff)
        return output</pre>



<h2 class="wp-block-heading">Penutup</h2>



<p class="wp-block-paragraph">Sederhananya konsep siamese network di atas bukan berarti model ini adalah model yang &#8220;selalu sederhana&#8221;. Dalam implementasi ada beberapa hal yang kadang perlu ditambahkan untuk memperbaiki hasil Siamese Network. Salah satunya adalah pemakaian <a href="https://stats.stackexchange.com/questions/485124/why-contrastive-loss-for-siamese-network" target="_blank" rel="noreferrer noopener nofollow">Contrastive Loss</a>. Selain itu, di luar sana juga banyak cara berbeda implementasi proses Merge yang bisa dicoba. Artikel ini hanyalah pengantar Siamese Network.</p>



<p class="wp-block-paragraph">Selamat bereksplorasi, semoga bermanfaat!</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><sup>Photo by <a href="https://unsplash.com/@skyler_tv?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Skyler Smith</a> on <a href="https://unsplash.com/s/photos/symmetric?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></sup></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/06/29/siamese-network-neural-network-untuk-menguji-kemiripan/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2345</post-id>	</item>
		<item>
		<title>Deep Learning dalam 6 Baris dengan Fastai dan Pytorch</title>
		<link>https://structilmy.com/blog/2021/02/17/deep-learning-dalam-6-baris-dengan-fastai-dan-pytorch/</link>
					<comments>https://structilmy.com/blog/2021/02/17/deep-learning-dalam-6-baris-dengan-fastai-dan-pytorch/#respond</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Wed, 17 Feb 2021 12:09:43 +0000</pubDate>
				<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[convolutional-neural-network]]></category>
		<category><![CDATA[pytorch]]></category>
		<guid isPermaLink="false">https://structilmy.com/?p=2254</guid>

					<description><![CDATA[Sebelumnya maaf semisal judulnya agak &#8220;heboh&#8221; dan terkesan click-bait 😀 tapi di artikel ini beneran saya ingin menunjukkan bahwa deep learning, khususnya image classification dengan CNN sebenarnya dapat dengan mudah dilakukan hanya dengan 6 baris kode berikut menggunakan library Fastai dan Pytorch: Artikel ini berfokus pada pengenalan singkat tentang fastai dan juga penjelasan tentang kode [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Sebelumnya maaf semisal judulnya agak &#8220;heboh&#8221; dan terkesan click-bait <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> tapi di artikel ini beneran saya ingin menunjukkan bahwa deep learning, khususnya image classification dengan CNN sebenarnya dapat dengan mudah dilakukan hanya dengan 6 baris kode berikut menggunakan library Fastai dan Pytorch:</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="295" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/carbon-2.png?resize=1024%2C295&#038;ssl=1" alt="" class="wp-image-2276" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/carbon-2.png?resize=1024%2C295&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/carbon-2.png?resize=300%2C86&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/carbon-2.png?resize=768%2C221&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/carbon-2.png?resize=1536%2C443&amp;ssl=1 1536w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/carbon-2.png?w=1658&amp;ssl=1 1658w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption><sub>dibuat menggunakan <a href="https://carbon.now.sh" target="_blank" rel="noreferrer noopener">https://carbon.now.sh</a>, versi raw ada di bawah</sub></figcaption></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Artikel ini berfokus pada pengenalan singkat tentang fastai dan juga penjelasan tentang kode di atas. Tutorial lebih detail dan mendalam tentang fastai insyaAllah akan kami coba buat di artikel lain.</p></blockquote>



<h2 class="wp-block-heading">Berawal dari Pytorch vs Tensorflow</h2>



<p class="wp-block-paragraph">Sebelum kita masuk lebih dalam tentang Fastai, kita akan me-<em>refresh</em> singkat tentang library atau framework di deep learning. Bagi yang belum tahu, ada dua library besar yang saat ini cukup sering digunakan, yakni <a href="http://pytorch.org" target="_blank" rel="noreferrer noopener nofollow">Pytorch </a>dan <a href="http://tensorflow.org" target="_blank" rel="noreferrer noopener">Tensorflow</a>. Pytorch dibuat oleh Facebook sedangkan Tensorflow oleh Google. Keduanya memiliki beragam fitur yang mendukung deep learning, salah satunya<a href="https://structilmy.com/2019/07/tutorial-dasar-pytorch-tensor-dan-autograd/"> Autograd yang pernah saya bahas di artikel ini</a>. Nah, sering kali bagi yang baru belajar deep learning akan bertanya:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>P<strong>ilih pakai Pytorch atau Tensorflow?</strong></p></blockquote>



<h5 class="wp-block-heading"><strong>Jawaban salah</strong></h5>



<p class="wp-block-paragraph"><em>Tensorflow itu lebih mudah dipelajari dan digunakan daripada Pytorch</em>. Itu jawaban yang sering saya dengar. Kenapa salah? karena saya yakin kebanyakan orang yang jawab itu dia <strong>bukan sedang membandingkan Tensorflow yang murni</strong>, melainkan library tambahan yang berada di atas Tensorflow, yakni <a href="http://keras.io" target="_blank" rel="noreferrer noopener nofollow">Keras</a>. Tensorflow yang murni bisa dibilang lumayan ribet juga loh untuk dipelajari dan digunakan (apalagi pas masih versi 1.x di tahun 2019)</p>



<p class="wp-block-paragraph">Jadi sekilas sejarah, dulu library deep learning itu memang susah-susah pemakaiannya (<em>low-level</em>). Library generasi awal, Theano, bahkan ngodingnya harus &#8220;jungkir balik&#8221; alur mikirnya. Karenanya, dibutuhkan library lagi di atasnya yang <em>high-level</em> (mudah dipahami dan digunakan) namun tetap terintegrasi dengan library yang <em>low-level</em>, lahirlah salah satunya Keras. Sekarang Keras sudah sangat terintegerasi dengan Tensorflow bahkan tidak perlu di-install terpisah. Tutorial <a href="https://structilmy.com/2021/01/image-classification-dengan-cnn-dan-tensorflow/" target="_blank" rel="noreferrer noopener">Tensorflow-Keras pernah saya tuliskan di sini</a>.</p>



<h5 class="wp-block-heading"><strong>Jawaban benar</strong></h5>



<figure class="wp-block-image size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/image-1.png?resize=525%2C326&#038;ssl=1" alt="" class="wp-image-2266" width="525" height="326" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/image-1.png?w=907&amp;ssl=1 907w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/image-1.png?resize=300%2C186&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/image-1.png?resize=768%2C477&amp;ssl=1 768w" sizes="auto, (max-width: 525px) 100vw, 525px" /><figcaption><sub>dari salah satu developer utama Pytorch</sub></figcaption></figure>



<p class="wp-block-paragraph">Saat ini bisa dibilang Pytorch dan Tensorflow (khususnya versi 2) sangat mirip. Keduanya sama-sama <em>smoothly</em> bisa digunakan untuk hampir kebanyakan kebutuhan riset dan sehari-hari. Jadi apapun librarynya silakan pilih saja, dan yang terpenting, <strong>kuasai dulu sebelum coba library lain</strong>.</p>



<p class="wp-block-paragraph">Kembali ke Jawaban yang salah di atas, ketika kita membandingkan Keras dengan Pytorch maka bisa dibilang kurang <em>apple-to-apple</em>. Karena Keras pada dasarnya adalah <em>high-level</em> library sedangkan Pytorch adalah <em>low-level</em> library, jadi jelas Keras terlihat lebih mudah pemakaiannya. Nah, di artikel ini saya akan jelaskan salah satu <em>high-level </em>library paling populer untuk Pytorch, yakni <a href="http://docs.fast.ai" target="_blank" rel="noreferrer noopener nofollow">Fastai</a>.</p>



<span id="more-2254"></span>



<h2 class="wp-block-heading">Apa itu Fastai</h2>



<p class="wp-block-paragraph"><a href="http://fast.ai" target="_blank" rel="noreferrer noopener">Fast.ai</a> sebenarnya lebih cocok jika dibilang sebagai nama organisasi riset deep learning. Saya pertama kali dengar nama Fast.ai dari course yang mereka <a href="http://course.fast.ai" target="_blank" rel="noreferrer noopener nofollow">sediakan di sini</a> dengan motto khasnya &#8220;<em>Making neural nets uncool again</em>&#8220;. Btw, course deep learning yang mereka sediakan sangat bagus, detail, mendalam, namun tetap mudah diikuti jadi wajib dicoba baik untuk pemula ataupun yang sudah berpengalaman.</p>



<p class="wp-block-paragraph">Nah, selain course, fast.ai juga membuat sebuah <a href="http://docs.fast.ai" target="_blank" rel="noreferrer noopener nofollow">library <code>fastai</code></a> yang dibangun di atas Pytorch. Secara ringkas, library fastai memiliki tujuan yang mirip dengan Keras, yakni menyediakan high-level API untuk pembuatan deep learning di atas library / framework yang telah ada (Pytorch dan Tensorflow). Library ini yang saya gunakan di artikel ini. Seperti yang telah saya tunjukkan di atas, dengan fastai kita bisa mengimplementasikan CNN untuk klasifikasi citra hanya dalam 6 baris kode.</p>



<h2 class="wp-block-heading">Penjelasan Kode</h2>



<p class="wp-block-paragraph">Oke, kita masuk ke kodenya:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from fastai.vision.all import *
trainloader = ImageDataLoaders.from_folder("train/", valid_pct=0.2, item_tfms=Resize(224))
testloader = trainloader.test_dl(get_image_files("test/"), with_labels=True)
learn = cnn_learner(trainloader, resnet18, metrics=error_rate) 
learn.fine_tune(3) 
print(accuracy(*learn.get_preds(dl=testloader)))</pre>



<p class="wp-block-paragraph">Kode di atas adalah kode yang memang minimalis, menggunakan banyak parameter defaultnya, karena saya hanya menunjukkan betapa simpelnya fastai. Tetapi dengan 6 baris kode tersebut akurasi model yang dihasilkan sangatlah baik.  Bisa jadi ada beberapa pengaturan atau sintaks yang mungkin perlu ditambahkan nantinya. </p>



<p class="wp-block-paragraph">Oke pertama-tama kita akan import library-nya:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from fastai.vision.all import *</pre>



<p class="wp-block-paragraph">Di fastai, fungsi-fungsi dikelompokkan tergantung domain apa yang akan dikerjakan. Ada 4 domain utama yang disediakan fastai saat ini, yakni vision, text, tabular, dan colaborative filtering (untuk sistem rekomendasi). Karena kita ingin membuat proyek deep learning untuk citra, kita cukup import semua yang ada di <code>vision.all</code>. Walaupun dikelompokkan untuk pada 4 kasus di atas, fastai juga tetap punya fungsi-fungsi umum yang bisa digunakan di beragam kasus.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">trainloader = ImageDataLoaders.from_folder("train/", valid_pct=0.2, item_tfms=Resize(224))
testloader = trainloader.test_dl(get_image_files("test/"), with_labels=True)</pre>



<p class="wp-block-paragraph">Langkah selanjutnya adalah membuat objek DataLoader. Konsep data loader adalah konsep yang umum digunakan di Pytorch. Intinya sebuah objek yang menghandle hampir semua keperluan data, seperti splitting train-validasi, preprocess, pembagian mana fitur mana label, dsb. </p>



<p class="wp-block-paragraph">Jika format dataset citra kita sudah &#8220;standar&#8221; dalam folder dengan struktur seperti ini:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">train/
  kelas_1/
     citra_103.png
     citra_22.png
     ...
  kelas_2/
     citra_123.png
     citra_324.png
     ...
  ...</pre>



<p class="wp-block-paragraph">Maka kita bisa menggunakan fungsi `ImageDataLoaders.from_folder` untuk secara otomatis me-load data. Perlu dicatat, fastai bisa dibilang hampir mewajibkan untuk penggunaan data validasi, ketika tidak kita sediakan maka fastai yang akan otomatis melakukan split dataset. Pada contoh di atas ada parameter <code>valid_pct=0.2</code> yang artinya 20% data akan dipilih secara random untuk validation. Sedangkan parameter <code>item_tfms</code> digunakan untuk proses transformasi data. Pada kode diatas, kita beri nilai <code>Resize(224)</code> yang artinya setiap citra akan di-resize ukurannya menjadi 224&#215;224. </p>



<p class="wp-block-paragraph">Pada baris kedua kita membuat data loader lagi kali ini untuk data test atau data pengujian. Di sini saya meng-&#8220;copy&#8221; proses yang terjadi pada trainloader tapi untuk kebutuhan test menggunakan fungsi <code>trainloader.test_dl()</code>dan menginfokan untuk menggunakan <code>get_image_files()</code> untuk me-load data citra. Kita juga menggunakan parameter <code>with_labels=True</code> untuk memberi tahu agar testloader menyimpan info label dari data test untuk menghitung akurasi.</p>



<p class="wp-block-paragraph"><strong>Khusus untuk pengguna windows</strong>! sampai tulisan ini dibuat, <a href="https://github.com/fastai/fastai/projects/1#card-53140160" target="_blank" rel="noreferrer noopener nofollow">ada bug</a> yang membuat kita perlu menambahkan parameter <code>num_workers=0</code> di kedua fungsi loader di atas, sehingga akan tampak seperti berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">trainloader = ImageDataLoaders.from_folder("train/", valid_pct=0.2, item_tfms=Resize(224), num_workers=0)
testloader = trainloader.test_dl(get_image_files("test/"), with_labels=True, num_workers=0)</pre>



<p class="wp-block-paragraph">Langkah selanjutnya kita akan membuat model  CNN kita. Mungkin tepatnya bukan membuat, melainkan kita akan menggunakan <a href="https://structilmy.com/2021/01/transfer-learning-solusi-deep-learning-dengan-data-sedikit/">pretrained model CNN yang sudah tersedia alias kita akan melakukan transfer learning</a>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">learn = cnn_learner(trainloader, resnet18, metrics=error_rate) </pre>



<p class="wp-block-paragraph">Pada kode di atas kita membuat objek <code>learner</code> yang menggunakan pretrained model ResNet18 dengan data train dari <code>trainloader</code>. Kita juga menginfokan pada learner untuk menampilkan <code>error_rate</code> di log nantinya.</p>



<p class="wp-block-paragraph">Setelah itu kita cukup jalankan perintah berikut untuk memulai proses pelatihan dengan fine tuning sebanyak 3 epoch (dalam pengaturan <em>default</em>, tepatnya 1 epoch dalam keadaan freeze, dan 3 epoch dalam keadaan semua layer unfreeze):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">learn.fine_tune(3) </pre>



<p class="wp-block-paragraph">Salah satu yang saya suka dari fastai juga adalah ketika proses training berjalan, progress barnya menarik (baca: info yang ditampilkan lengkap dan cukup untuk jadi log)</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="784" height="181" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/Screenshot-2021-02-17-181844.png?resize=784%2C181&#038;ssl=1" alt="" class="wp-image-2278" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/Screenshot-2021-02-17-181844.png?w=784&amp;ssl=1 784w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/Screenshot-2021-02-17-181844.png?resize=300%2C69&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/02/Screenshot-2021-02-17-181844.png?resize=768%2C177&amp;ssl=1 768w" sizes="auto, (max-width: 784px) 100vw, 784px" /><figcaption><sub>Kalau pakai jupyter lebih bagus lagi</sub></figcaption></figure>



<p class="wp-block-paragraph">Dan dilanjut dengan menampilkan akurasi ke data test menggunakan fungsi <code>get_preds()</code>. Fungsi tersebut akan mengoutputkan dua nilai dalam bentuk <em>tuple</em>, yakni prediksi dan target/label seharusnya. Sedangkan fungsi <code>accuracy</code> juga bawaan dari fastai untuk menampilkan akurasi diketahui nilai prediksi dan target.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">print(accuracy(*model.get_preds(dl=testloader)))</pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Tanda * digunakan untuk &#8220;memecah&#8221; elemen-elemen tuple untuk <a href="https://note.nkmk.me/en/python-argument-expand/" target="_blank" rel="noreferrer noopener nofollow">menjadi parameter di sebuah fungsi</a>.</p></blockquote>



<h2 class="wp-block-heading">Hasilnya?</h2>



<p class="wp-block-paragraph">Saya menggunakan data yang sama pada <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">tutorial CNN menggunakan Pytorch</a>. Hanya dengan 3 epoch dan 6 baris kode akurasi model dari datatest mencapai 89.17%! Padahal di artikel sebelumnya kita hanya dapat di sekitar 70% <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">Tutorial Lebih Lanjut</h2>



<p class="wp-block-paragraph">Bagi teman-teman yang tertarik dengan fastai, bisa banget untuk langsung lanjut memperdalam library ini. InsyaAllah kami berencana untuk membuat artikel lain yang membahas fastai lebih lanjut, tapi tidak tahu juga kapan akan publish <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> jadi bisa mulai belajar mandiri dari sumber belajar berikut:</p>



<ul class="wp-block-list"><li><a href="http://course.fast.ai" target="_blank" rel="noreferrer noopener nofollow">Course fastai</a> : saya rekomendasikan tonton 2-3 video dulu agar terbayang gambaran umumnya. Sebagai catatan, course ini tidak hanya membahas teknis tetapi juga banyak sisi teorinya, menarik!</li><li><a href="https://docs.fast.ai/tutorial.html" target="_blank" rel="noreferrer noopener">Offi</a><a href="https://docs.fast.ai/tutorial.html" target="_blank" rel="noreferrer noopener nofollow">c</a><a href="https://docs.fast.ai/tutorial.html" target="_blank" rel="noreferrer noopener">ial Tutorial fastai</a>: tapi sejujurnya saya kurang merekomendasikan, dulu belajar dari sini ngerasa agak kesulitan memahami &#8220;kenapa-kenapa&#8221; nya <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li><li><a href="https://walkwithfastai.com/" target="_blank" rel="noreferrer noopener nofollow">Walk With Fastai</a>: dibuat oleh Zach Mueller (bukan official fastai), berisi course-course yang cocok untuk temen-temen yang ingin fokus ke sisi praktiknya. Saya sangat terbantu dengan walk with fastai, sangat melengkapi course dan tutorial resmi dari fastai <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li></ul>



<p class="wp-block-paragraph">Sekian, semoga bermanfaat! jadi mau pakai library apa untuk proyek deep learning selanjutnya?</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><sub>Cover Photo by <a href="https://unsplash.com/@condorito1953?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Arie Wubben</a> on <a href="https://unsplash.com/s/photos/airplane?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></sub></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/02/17/deep-learning-dalam-6-baris-dengan-fastai-dan-pytorch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2254</post-id>	</item>
		<item>
		<title>Transfer Learning: Solusi Deep Learning dengan Data Sedikit</title>
		<link>https://structilmy.com/blog/2021/01/31/transfer-learning-solusi-deep-learning-dengan-data-sedikit/</link>
					<comments>https://structilmy.com/blog/2021/01/31/transfer-learning-solusi-deep-learning-dengan-data-sedikit/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Sun, 31 Jan 2021 15:49:57 +0000</pubDate>
				<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[convolutional-neural-network]]></category>
		<guid isPermaLink="false">http://structilmy.com/?p=1498</guid>

					<description><![CDATA[Salah satu permasalahan yang sering dialami ketika menggunakan deep learning adalah jumlah data yang sedikit. Di luar sana, sebenernya ada banyak solusi yang ditawarkan untuk mengatasi masalah ini. Nah, di sini kita akan bahas salah satunya, yakni Transfer Learning. Artikel ini akan berfokus pada teori di baliknya, sedangkan untuk implementasi akan ada di artikel selanjutnya. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Salah satu permasalahan yang sering dialami ketika menggunakan deep learning adalah jumlah data yang sedikit. Di luar sana, sebenernya ada banyak solusi yang ditawarkan untuk mengatasi masalah ini. Nah, di sini kita akan bahas salah satunya, yakni Transfer Learning. Artikel ini akan berfokus pada teori di baliknya, sedangkan untuk implementasi akan ada di artikel selanjutnya.</p>



<h2 class="wp-block-heading">Model Deep Learning</h2>



<p class="wp-block-paragraph">Sebelum masuk lebih dalam ke transfer learning, saya ingin mengingatkan sedikit tentang bagaimana konsep deep learning (secara umum machine learning) bekerja.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-3.png?resize=404%2C157&#038;ssl=1" alt="" class="wp-image-2209" width="404" height="157" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-3.png?w=775&amp;ssl=1 775w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-3.png?resize=300%2C117&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-3.png?resize=768%2C300&amp;ssl=1 768w" sizes="auto, (max-width: 404px) 100vw, 404px" /></figure></div>



<p class="wp-block-paragraph">Suatu agen cerdas yang menggunakan deep learning bekerja menggunakan data. Kita berikan data yang banyak untuk dipelajari, kita lakukan proses training/belajar, lalu kita akan mendapat model/agen yang cerdas.</p>



<p class="wp-block-paragraph"><em>Lalu muncul pertanyaan..</em></p>



<p class="wp-block-paragraph">Proses pencarian data itu rumit, proses training itu makan waktu, kenapa kita tidak download saja model cerdas yang ada di internet lalu kita gunakan untuk masalah kita? tidak perlu train, dan tidak perlu ada data, beres kan?</p>



<h2 class="wp-block-heading">Transfer Learning</h2>



<p class="wp-block-paragraph">Ide utama dari transfer learning ini kira-kira seperti ini, </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Kita <strong>gunakan</strong> model yang sudah <strong>dicerdaskan </strong>orang lain untuk permasalahan kita, yang bahkan bisa jadi <strong>berbeda</strong></p></blockquote>



<p class="wp-block-paragraph">Sebagai contoh, kita mau membuat sistem untuk menghitung kendaraan beserta jenisnya menggunakan kamera CCTV. Jika jenis kendaraannya yang ingin dideteksi cukup umum, semisal &#8220;mobil&#8221; atau &#8220;truk&#8221;, kita bisa jadi cukup browsing-browsing, dan kita akan menemukan orang yang sudah membuat model deep learningnya. Kita tinggal download, pakai, dan selesai! Kita telah memiliki model cerdas deep learning yang mampu mendeteksi mobil atau truk. Tanpa perlu mencari data, tanpa perlu melatih model.</p>



<p class="wp-block-paragraph">Tapi seringnya permasalahan yang kita miliki sedikit berbeda. Sedikit saja perbedaan, maka kita sudah tidak bisa lagi pakai model orang lain ini. Contohnya, kita tidak hanya ingin mendeteksi &#8220;mobil&#8221; dan &#8220;truk&#8221; tapi juga &#8220;becak&#8221;. Permasalahannya, &#8220;becak&#8221; itu bukan kendaraan yang di mana-mana ada. Sangat mungkin model yang kita download tadi belum bisa mendeteksi becak.</p>



<p class="wp-block-paragraph">Di sinilah, kita butuh transfer learning. Kembali ke ide utama di atas, dengan transfer learning, kita bisa <strong>memanfaatkan </strong>model orang lain yang <strong>sudah dilatih</strong>, untuk permasalahan kita yang <strong>berbeda</strong>.</p>



<p class="wp-block-paragraph">Jadi ada 3 poin yang kita bahas di sini:</p>



<ul class="wp-block-list"><li>Model yang sudah dicerdaskan</li><li>Cara menggunakan model tersebut</li><li>Permasalahan yang (bisa jadi) berbeda</li></ul>



<p class="wp-block-paragraph">Oh ya, sebelum masuk lebih dalam, konsep Transfer Learning ini berlaku tidak hanya <a href="https://structilmy.com/2021/01/image-classification-dengan-cnn-dan-tensorflow/">untuk arsitektur CNN saja</a>. Tapi pada tutorial ini saya akan banyak mencontohkan menggunakan CNN karena lebih mudah dibayangkan.</p>



<span id="more-1498"></span>



<h2 class="wp-block-heading">1. Model yang sudah cerdas</h2>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-4.png?resize=444%2C176&#038;ssl=1" alt="" class="wp-image-2210" width="444" height="176" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-4.png?w=834&amp;ssl=1 834w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-4.png?resize=300%2C119&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-4.png?resize=768%2C306&amp;ssl=1 768w" sizes="auto, (max-width: 444px) 100vw, 444px" /><figcaption><sup>User (warna merah) mendownload model dari internet buatan orang lain</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Pada transfer learning, kita membutuhkan model yang sudah terlatih, entah itu dilatih oleh orang lain, atau kita melatihnya terlebih dahulu. Model yang sudah terlatih ini disebut dengan <strong>Pre-Trained Model</strong>. Pre-trained model biasanya sudah dilatih pada dataset yang besar dan merupakan dataset benchmark, sehingga kualitas pre-trained model harusnya sudah sangat baik. </p>



<p class="wp-block-paragraph">Saat ini sudah banyak pre-trained model yang disediakan untuk beragam kebutuhan. Misalnya pada <a href="https://pytorch.org/docs/stable/torchvision/models.html" rel="nofollow">halaman ini</a> PyTorch menunjukkan pre-trained model yang tersedia secara resmi untuk image classification yang telah dilatih menggunakan dataset <a href="http://www.image-net.org/" rel="nofollow">ImageNet</a>. Pada <a href="https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md" rel="nofollow">halaman ini</a> Tensorflow juga menunjukkan model-model yang tersedia untuk object detection. Kumpulan pre-trained model ini juga biasa disebut dengan <strong>Model Zoo</strong>. </p>



<p class="wp-block-paragraph">Alternatif lain selain menggunakan model resmi dari framework, kita juga bisa browsing-browsing dan pakai pre-trained model yang disediakan peneliti-peneliti lain, misalnya model <a href="https://github.com/rafellerc/Pytorch-SiamFC" rel="nofollow">SiameseFC ini</a>. Atau kita juga bisa saja membuat pre-trained model sendiri.</p>



<h2 class="wp-block-heading">2. Cara menggunakan</h2>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image.png?resize=473%2C383&#038;ssl=1" alt="" class="wp-image-2189" width="473" height="383" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image.png?w=983&amp;ssl=1 983w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image.png?resize=300%2C244&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image.png?resize=768%2C623&amp;ssl=1 768w" sizes="auto, (max-width: 473px) 100vw, 473px" /><figcaption><sup>Diambil dari paper <strong>How transferable are features in deep neural networks? </strong>di baris keempat tampak model yang sudah dilatih sebagian dengan data A  (Hijau) digunakan untuk menyelesaikan permasalahan pada data B (Ungu)</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Secara umum ada dua cara menggunakan model pre-trained untuk transfer learning. Kedua cara ini pada ilustrasi diatas ditunjukkan dengan simbol gembok terbuka atau tertutup:</p>



<h4 class="wp-block-heading">2.1. Fixed Feature Extractor</h4>



<p class="wp-block-paragraph">Pada metode ini kita menggunakan pre-trained model yang telah dilatih <strong>tanpa melatih ulang model tersebut</strong>, atau istilahnya kita membekukan (<em>freeze</em>) bobot pre-trained model ini. Cara pemakaian yang umum untuk freezed model adalah sebagai <strong>feature extractor</strong>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="378" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-5.png?resize=1024%2C378&#038;ssl=1" alt="" class="wp-image-2211" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-5.png?resize=1024%2C378&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-5.png?resize=300%2C111&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-5.png?resize=768%2C283&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-5.png?w=1269&amp;ssl=1 1269w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption><sup>Ilustrasi Fixed Feature Extractor. Gambar sebelah kiri adalah ilustrasi pembuatan pre-trained model. Model deep learning CNN biasanya terdiri dari layer konvolusi (hijau) dan fully connected layer (merah) di akhir. Pada gambar sebelah kanan, kita hanya menggunakan layer konvolusinya saja yang kita bekukan, sehingga outputnya masih berupa vektor</sup></figcaption></figure></div>



<p class="wp-block-paragraph">Sebagai contoh, kita download pre-trained model resnet18 yang sudah dilatih ke data ImageNet. Arsitektur Resnet18 sama seperti arsitektur CNN pada umumnya memiliki bagian &#8220;konvolusi&#8221; dan memiliki bagian &#8220;klasifikasi&#8221;. Karena arsitektur Resnet ini sudah dilatih maka semua bobot-bobotnya sudah memiliki nilai yang bagus untuk klasifikasi citra di dataset ImageNet. Data imagenet terdiri dari sekitar 1000 kelas.</p>



<p class="wp-block-paragraph">Jika kita buang layer klasifikasi terakhirnya (diilustrasikan warnah merah di gambar di atas), ketika kita inputkan citra, model akan mengoutputkan suatu vektor nilai dari proses konvolusi. Vektor ini bisa kita anggap sebagai fitur citra yang diekstrak menggunakan pre-trained model.  Fitur vektor yang dihasilkan ini nantinya bisa dimanfaatkan untuk beragam kebutuhan. Misal karena vektor itu dianggap fitur, jadinya bisa masuk ke classifier lain (misalnya SVM), lalu classifier tersebut di train (tanpa melatih pre-trained modelnya ya, kan sedang di freeze) untuk klasifikasi. </p>



<p class="wp-block-paragraph">Dengan mengganti layer terakhir pre-trained model, jumlah class pada classifier ini tidak harus sama dengan pre-trained model, misalnya di pre-trained model ada 1000 kelas dan kita hanya ingin membuat model yang mampu mengklasifikasi 2 kelas (mobil atau truk) ya cukup kita ataur di classifier ini hanya 2 kelas.</p>



<h4 class="wp-block-heading">2.2. Fine Tuning</h4>



<p class="wp-block-paragraph">Pada metode ini kita menggunakan pre-trained model yang telah dilatih namun <strong>tidak kita freeze</strong>. Jadi meskipun model sudah dilatih, nantinya pre-trained model ini akan dilatih lagi untuk kebutuhan yang baru.</p>



<p class="wp-block-paragraph">Sebagai contoh, kita ingin melatih model untuk mendeteksi jenis-jenis kendaraan di Indonesia, &#8220;motor&#8221;, &#8220;andong&#8221;, dan &#8220;becak&#8221;. Anggap kita memiliki pre-trained model yang sudah bisa membedakan &#8220;truk&#8221; dan &#8220;mobil&#8221;. Kita bisa melatih ulang model ini menggunakan data citra &#8220;motor&#8221;, &#8220;andong&#8221;, dan &#8220;becak&#8221; <strong>dengan bobot pre-trained model tadi sebagai bobot awal</strong> pelatihan. Proses melatih model dengan nilai awal bobot adalah berasal dari pre-trained model disebut dengan <strong>Fine Tuning</strong>.</p>



<p class="wp-block-paragraph">Loh kok bisa model yang awalnya digunakan untuk mendeteksi &#8220;mobil&#8221; dan &#8220;truk&#8221; digunakan untuk mendeteksi &#8220;motor&#8221;, &#8220;andong&#8221;, dan &#8220;becak&#8221;? Bisa loh :D, karena pre-trained model yang mampu mendeteksi &#8220;mobil&#8221; dan &#8220;truk&#8221;, setidaknya memiliki &#8220;pengetahuan&#8221; yang bisa dimanfaatkan untuk mendeteksi objek lain. Misalnya, model tersebut sudah paham mana yang objek mana yang latar belakang; mana yang pohon mana yang bukan; dsb. Kita melakukan <strong>transfer pengetahuan</strong> tersebut untuk kebutuhan baru. Karenanya kita masih perlu melatih lagi (walau kebanyakan proses pelatihan jauh lebih cepat karena model sudah sedikit cerdas).</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="350" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-7.png?resize=1024%2C350&#038;ssl=1" alt="" class="wp-image-2213" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-7.png?resize=1024%2C350&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-7.png?resize=300%2C103&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-7.png?resize=768%2C263&amp;ssl=1 768w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/image-7.png?w=1322&amp;ssl=1 1322w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption><sup>Ilustrasi metode pertengahan. Ada layer yang di freeze (diarsir) ada yang tidak.</sup></figcaption></figure>



<h4 class="wp-block-heading">2.3. Metode Pertengahan</h4>



<p class="wp-block-paragraph">Selain dua metode di atas, ada juga yang pertengahan yang seakan mengkombinasikan keduanya. Alias, sebagian layer di-freeze, sebagian layer tidak di-freeze. Biasanya layer yang di-freeze adalah beberapa layer yang di depan (yang dekat dengan input layer dan menyimpan informasi yang low-level) sedangkan layer yang di belakang, yang menyimpan informasi yang lebih high-level, tidak di-freeze untuk di-fine tune. Ini biasanya digunakan ketika data yang digunakan untuk melatih pre-trained model dirasa sedikit berbeda dengan data yang baru. Selain itu ini juga kadang dilakukan untuk menghindari fine tuning semua layer. Karena melakukan fine tuning <strong>secara tidak hati-hati </strong>di semua layer dapat &#8220;membodohkan&#8221; model yang sudah cerdas.</p>



<h2 class="wp-block-heading">Permasalahan seperti apa</h2>



<p class="wp-block-paragraph">Berdasarkan kondisi dataset yang akan digunakan dan pre-trained model yang kita miliki, ada sedikit &#8220;aturan&#8221; yang bisa kita ikuti, kapan dan teknik seperti apa yang bisa digunakan untuk transfer learning. Saya tidak akan menjelaskan detailnya, bisa dibaca di bagian &#8220;<strong>When and how to fine-tune?</strong>&#8221; dari <a href="https://cs231n.github.io/" rel="nofollow">https://cs231n.github.io/</a>. </p>



<p class="wp-block-paragraph">Sekian untuk artikel ini, semoga bermanfaat! InsyaAllah implementasinya menyusul <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/01/31/transfer-learning-solusi-deep-learning-dengan-data-sedikit/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1498</post-id>	</item>
		<item>
		<title>Image Classification dengan CNN dan Tensorflow</title>
		<link>https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/</link>
					<comments>https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/#comments</comments>
		
		<dc:creator><![CDATA[Rian Adam]]></dc:creator>
		<pubDate>Mon, 18 Jan 2021 14:53:02 +0000</pubDate>
				<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deep Learning]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<guid isPermaLink="false">http://structilmy.com/?p=2168</guid>

					<description><![CDATA[Pada artikel ini saya akan menjelaskan secara ringkas langkah-langkah penggunaan Tensorflow untuk Image Classification / Klasifikasi Citra. Perlu dicatat, saya menggunakan Tensorflow versi 2 yang mungkin berbeda dengan Tensorflow versi 1. Selain itu, saya garis bawahi lagi artikel ini membahas image classification (menentukan ini gambar apa), bukan detection (menentukan objek apa dan di mana pada [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pada artikel ini saya akan menjelaskan secara ringkas langkah-langkah penggunaan Tensorflow untuk Image Classification / Klasifikasi Citra. Perlu dicatat, saya menggunakan Tensorflow versi 2 yang mungkin berbeda dengan Tensorflow versi 1. Selain itu, saya garis bawahi lagi artikel ini membahas image classification (menentukan ini gambar apa), bukan <a href="https://structilmy.com/2020/06/object-detection-dengan-tensorflow-dan-google-colab-1/">detection</a> (menentukan objek apa dan di mana pada gambar). Secara alur, pada artikel ini saya mengembangkan dari artikel sebelumnya tentang <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">implementasi CNN menggunakan PyTorch</a></p>



<h2 class="wp-block-heading">Dataset</h2>



<p class="wp-block-paragraph">Dataset yang akan kita gunakan adalah citra barang-barang yang ada di sebuah toko (dimodifikasi dari Freiburg Groceries Dataset) yang terdiri dari 5 kelas, yakni citra produk Susu (MILK), Air mineral (WATER), soda (SODA), jus (JUICE), dan cuka (VINEGAR). Total terdapat sekitar 900-an gambar untuk pelatihan dan 120 gambar untuk pengujian. Semua citra berukuran sama, yakni 256&#215;256 pixel. <strong>Dataset dan code bisa di-download di <a rel="noreferrer noopener" href="https://github.com/rianrajagede/groceries_classification" target="_blank">repository berikut</a></strong>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="256" height="256" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/JUICE0178.png?resize=256%2C256&#038;ssl=1" alt="" class="wp-image-2169" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/JUICE0178.png?w=256&amp;ssl=1 256w, https://i0.wp.com/structilmy.com/wp-content/uploads/2021/01/JUICE0178.png?resize=150%2C150&amp;ssl=1 150w" sizes="auto, (max-width: 256px) 100vw, 256px" /><figcaption>salah satu citra dengan kelas &#8220;Juice&#8221;</figcaption></figure></div>



<p class="wp-block-paragraph">Kita akan menggunakan dataset yang ada pada folder &#8220;train&#8221; untuk pelatihan dan yang ada pada folder &#8220;test&#8221; untuk pengujian. Pada tutorial ini kita masih belum menggunakan teknik validasi seperti menggunakan data validasi atau cross-validation.</p>



<h2 class="wp-block-heading">Pre-Processing</h2>



<p class="wp-block-paragraph">Jika diperhatikan, format folder dataset yang telah di-download adalah seperti berikut.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">dataset/
   train/
      kelas_1/
         citra_103.png
         citra_22.png
         ...
      kelas_2/
         citra_123.png
         citra_324.png
         ...
      ...
   test/
      ...</pre>



<p class="wp-block-paragraph">Format tersebut adalah format standar untuk image classification. Ketika format foldernya sudah seperti itu, beberapa framework seperti Tenorsflow atau PyTorch sudah menyediakan cara mudah untuk meload data. Pada Tensorflow kita bisa menggunakan perintah berikut untuk meload dataset.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(rescale=1/255.) # pre-processor
datatrain = DirectoryIterator('train', datagen) # load trainset dari folder train/
datatest = DirectoryIterator('test', datagen) # load testset dari folder test/</pre>



<span id="more-2168"></span>



<p class="wp-block-paragraph">Objek <code>datagen</code> adalah objek <code>ImageDataGenerator()</code> yang berfungsi untuk memproses data sebelum di load. Ada <a href="https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator#flow_from_directory" target="_blank" rel="noreferrer noopener nofollow">banyak fungsi di dalamnya</a>. Pada artikel ini kita hanya menggunakan fungsi rescale. Fungsi rescale digunakan untuk mengubah skala nilai citra. Jadi ketika citra itu di load, citra direpresentasikan sebagai array 3D (atau kadang disebut Tensor) dengan nilai rentangan antara 0..255. Pada parameter rescale saya beri nilai &#8220;1/255&#8221; yang artinya nanti setiap nilai akan dikali 1/255 sehingga rentangan nilainya akan berubah diantara 0..1. Kenapa perlu diubah rentangan nilai ini? agak panjang detailnya tapi intinya untuk memudahkan neural network belajar.</p>



<p class="wp-block-paragraph">Hasil dari perintah diatas akan menghasilkan object Tensorflow Dataset, sebuah object yang memudahkan proses pengolahan dataset. Sebagai contohnya kita bisa coba jalankan perintah di bawah, maka akan dihasilkan informasi-informasi dari dataset yang kita miliki.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">print(datatrain.class_indices) # menampilkan kelas-kelas pada dataset
print("banyak batch:", len(datatrain)) # menampilkan banyak batch

for imgs, labels in datatrain: # datatrain bukan array, hanya bisa diakses melalui perulangan
    print("apa itu imgs", type(imgs)) # numpy array 4D
    print("dimensi imgs dengan batch:", imgs.shape)  # (n-batch, panjang, lebar, channel)
    print("dimensi gambar:", imgs[0].shape) # ukuran tiap gambar
    print("contoh gambar (hanya channel Red)") # nilai ada antara 0 sampai 1
    print(imgs[0,:,:,0])
    print("contoh label") 
    print(labels[0]) # sudah "one-hot". Bukan tertulis kelas "3" tapi [0, 0, 0, 1, 0]

    print("contoh gambar visualnya")
    plt.imshow( imgs[0] )
    break</pre>



<h2 class="wp-block-heading">Implementasi</h2>



<h4 class="wp-block-heading">Arsitektur CNN</h4>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://i2.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?fit=1024%2C328&amp;ssl=1" alt="" class="wp-image-1526" width="582" height="185" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?w=1103&amp;ssl=1 1103w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=300%2C96&amp;ssl=1 300w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=1024%2C328&amp;ssl=1 1024w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/03/cnn1.png?resize=768%2C246&amp;ssl=1 768w" sizes="auto, (max-width: 582px) 100vw, 582px" /><figcaption>Ilustrasi CNN untuk klasifikasi citra ke 3 kelas (hanya contoh, berbeda dengan arsitektur yang akan digunakan pada artikel ini)</figcaption></figure></div>



<p class="wp-block-paragraph">Pada tutorial ini, kita akan menggunakan model CNN sama seperti yang kita gunakan <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/">pada artikel sebelumnya</a> (<strong>silakan baca pada artikel tersebut untuk detail penjelasan arsitektur yang digunakan</strong>). Model dengan dua convolutional layer dan sebuah fully connected layer. Dengan detail parameter setiap layer sebagai berikut:</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="677" height="550" src="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?resize=677%2C550&#038;ssl=1" alt="" class="wp-image-1670" srcset="https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?w=677&amp;ssl=1 677w, https://i0.wp.com/structilmy.com/wp-content/uploads/2020/06/convdiagram-2.png?resize=300%2C244&amp;ssl=1 300w" sizes="auto, (max-width: 677px) 100vw, 677px" /><figcaption><em>W = window size, S = stride, P = padding, FM = feature map, N = jumlah neuron</em></figcaption></figure>



<p class="wp-block-paragraph">Pembuatan model di Tensorflow ada banyak cara, yang paling mudah adalah menggunakan Keras Sequential. Sebelum mendefinsikan model beberapa library perlu yang diimport untuk pembentukan model, yakni:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import tensorflow as tf
from tensorflow.keras import Sequential, layers</pre>



<p class="wp-block-paragraph">Lalu untuk membuat modelnya kita definsikan menggunakan Keras Sequential. Dengan menggunakan Keras Sequential, layer-layer arsitektur jaringan saraf tiruan didefinisikan secara urut dari depan (input layer) sampai belakang (output layer). Untuk model dengan ilustrasi di atas, kita definisikan sebagai berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model = Sequential([
  layers.Conv2D(16, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 16, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(512, activation='relu'),
  layers.Dense(5, activation='softmax')
])</pre>



<h4 class="wp-block-heading">Alur Pelatihan</h4>



<p class="wp-block-paragraph">Setelah model jadi dibuat, kita bisa compile model kita dengan algoritma optimasi apa yang akan kita gunakan untuk pelatihan model kita:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model.compile(loss='categorical_crossentropy',
     optimizer=tf.keras.optimizers.Adadelta(learning_rate=0.001),
     metrics=['accuracy'])</pre>



<p class="wp-block-paragraph">Lalu jalankan pelatihan dengan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">model.fit(datatrain, batch_size=16, epochs=20, verbose=1)</pre>



<h4 class="wp-block-heading">Alur Pengujian</h4>



<p class="wp-block-paragraph">Setelah model selesai dilatih, maka kita akan uji dengan data test. Data test yang belum kita gunakan ini saya pilih secara acak dari masing-masing kelas dan tidak ada di data train. Proses pengujian cukup dilakukan dengan perintah berikut:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">test_loss, test_acc = model.evaluate(datatest, verbose=1)</pre>



<p class="wp-block-paragraph">Variabel <code>test_loss</code> akan menyimpan nilai error hasil data test sedangkan <code>test_acc</code> akan menympan nilai akurasi hasil data test.</p>



<h2 class="wp-block-heading">Selesai!</h2>



<p class="wp-block-paragraph">Jika dibandingkan dengan <a href="https://structilmy.com/2019/07/convolutional-neural-network-cnn-menggunakan-pytorch/" target="_blank" rel="noreferrer noopener">proses klasifikasi citra menggunakan PyTorch</a>, dapat dilihat kode Tensorflow seakan lebih ringkas. Fungsi <code>.fit()</code> dari Keras sangat meringkas proses iterasi pelatihan pada PyTorch. </p>



<p class="wp-block-paragraph">Tapi kalau saya pribadi hal tersebut malah menjadi kekurangan dari Tensorflow. Menyembunyikan &#8220;bagian utama&#8221; dari proses pelatihan neural network malah membuat saya tidak nyaman untuk mengajari alur pelatihan yang terjadi, atau berekpserimen lebih dalam. Tapi ya setiap orang punya pendapat masing-masing <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> yang penting &#8220;dicoba dulu saja..&#8221;. Semoga bermanfaat!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://structilmy.com/blog/2021/01/18/image-classification-dengan-cnn-dan-tensorflow/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2168</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 0/268 objects using Memcache
Page Caching using Disk: Enhanced 
Database Caching using Redis

Served from: structilmy.com @ 2026-10-07 05:47:32 by W3 Total Cache
-->