Anda di halaman 1dari 18

13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya

13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin

Pengantar

Berikut adalah laporan singkat perancangan sistem neural network pada tahap simulasi
MATLAB dengan aplikasi yang spesifik. Kelompok tim penulis merupakan kelompok
gabungan yang memutuskan untuk menerapkan sistem klasifikasi uang kertas. Dataset
sistem diperoleh dengan memotret empat jenis nominasi mata uang kertas Rupiah di
sepuluh arah pencahayaan yang berbeda. Foto-foto uang kertas Rupiah kemudian
dipotong (di-crop) dan diekstrak fitur warna RGB-nya dengan Feature Extractor:
Histrogram RGB sehingga masing-masing foto diperoleh representasi Histogram RGB-
nya berupa delapan buah bilangan double. Dataset ini kemudian digunakan untuk
mentraining neural network. Sistem neural network ini termasuk sistem jenis fungsi
klasifikasi. Dataset histogram RGB uang kertas diklasifikasikan sesuai nominal uangnya.

1. Metodologi dan Hasil Simulasi

Pertama dilakukan simulasi menggunakan kode MATLAB secara default pada tipe data
double untuk mengetahui apakah dataset mungkin untuk konvergen. Skema training yang
digunakan adalah Mini Batch SGD.

Pada skema training Mini Batch SGD dataset dibagi menjadi dataset training dan dataset
test. Dataset training dibagi lagi menjadi mini batch yang mana masing-masing mini
batch tersusun atas sejumlah data (batch) yang ditrain secara bersamaan. Penulis
berusaha menggunakan algoritma backpropagation yang memanfaatkan operasi matriks
atau vektor secara langsung daripada operasi per elemen dengan for loop. Operasi
matriks langsung lebih cepat daripada operasi manual dengan for loop namun lebih
banyak memakan memori.

Page 1 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin

Gambar 1.2.1 Visualisasi Training Data dari Mini Batch SGD


Untuk mempercepat training, weight dan bias diinisialisasi dengan nilai random Gaussian
pada rentang -0.5 hingga 0.5.

Selanjutnya dicoba dilakukan simulasi pada tipe data fixed point. Simulasi dengan tipe
data fixed point dilakukan untuk melihat apakah konvergensinya masih terjaga di sistem
dengan tipe data fixed point. Penulis menggunakan skema fixed point dengan 1 bit
signed, 32 bit word, dan 23 bit fraction.

Operasi fixed point di MATLAB dapat dilakukan dengan membuat objek fixed point fi.
Penulis menggunakan syntaks berikut untuk menkonversi tipe data default, yaitu double,
ke fixed point: y = fi(x, 1, word, frac, F). ’x’ adalah objek bertipe data
double yang ingin dikonversi, ’1’ artinya dipilih mode signed fixed point, ’word’
menyimpan nilai lebar word, ’frac’ menyimpan nilai lebar fraction, dan F menyimpan
objek fimath. Object fimath berguna untuk mendefinisikan property-property aritmatika
fixed point yang dijalankan seperti menentukan metode rounding, apa yang dilakukan
ketika overflow, menentukan mode perkalian, penjumlahan dan lain-lain. Berikut definisi
objek fimath, word dan frac yang digunakan oleh penulis.

%% Inisialisasi Property Fixed Point


F = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap',...
'ProductMode', 'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...

Page 2 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
word = 32; %Lebar word dengan struktur: |s (word - frac - 1) frac|
frac = 23; %Lebar fraksi

Supaya waktu eksekusi simulasi fixed point berjalan lebih cepat, fungsi sigmoid yang
digunakan dikonversi ke tipe data MEX (MATLAB executable). File MEX memberikan
interface antara fungsi-fungsi MATLAB dengan fungsi-fungsi di C, C++ atau Fortran.
Interfacing ini membuat waktu eksekusi dengan MEX file lebih cepat daripada dengan
fungsi MATLAB biasa.

1.1 Simulasi MATLAB Dataset Histogram RGB Uang Tipe Data Double
Pada bagian ini dijelaskan kode yang digunakan untuk menisumlasikan dataset histogram
RGB uang dengan tipe data simulasi double. Pertama kode melakukan pembersihan
workspace seperti biasa sebagai berikut.
clear;clc;tic;
% Kode utama untuk training tipe data double
% Adaptasi dari:
% http://www2.bcs.rochester.edu/sites/raizada/matlab-neural-nets.html
% kode MATLAB dari LSI Contest, dan
% http://neuralnetworksanddeeplearning.com/chap1.html

Selanjutnya dataset histogram RGB uang diload dengan kode berikut.


%% Inisialisasi Dataset
load dataset_uang_his_warna.dat;
inputs = dataset_uang_his_warna;

labels = zeros(4,size(inputs,2));
for i = 1:18
labels(:,i) = [1; 0; 0; 0];
end
for i = 19:36
labels(:,i) = [0; 1; 0; 0];
end
for i = 37:54
labels(:,i) = [0; 0; 1; 0];
end
for i = 55:72
labels(:,i) = [0; 0; 0; 1];
end

Variabel inputs menyimpan matrix 8×72 yang merepresentasikan 72 buah data.


Masing-masing data, berupa vektor 8×1, menyimpan nilai histogram warna RGB data
tersebut.

Page 3 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Urutan dataset adalah 18 data nominal uang pertama diikuti 18 data nominal uang kedua
lalu 18 data nominal uang ketiga dan 18 data nominal uang keempat. Urutan data ini
dapat digambarkan berupa [111...111 222...222 333...333 444...444], masih belum
berselingan. Untuk membuatnya berselingan menjadi [1 2 3 4 1 2 3 4 ... 1 2 3 4] maka
digunakan kode berikut.

%% Buat Dataset Berselingan %%

for i = 1:18
inputx(:,i,1) = inputs(:,i);
labelx(:,i,1) = labels(:,i);
end
for i = 1:18
inputx(:,i,2) = inputs(:,18+i);
labelx(:,i,2) = labels(:,18+i);
end
for i = 1:18
inputx(:,i,3) = inputs(:,36+i);
labelx(:,i,3) = labels(:,36+i);
end
for i = 1:18
inputx(:,i,4) = inputs(:,54+i);
labelx(:,i,4) = labels(:,54+i);
end

j = 1;
for i = 1:72
input(:,i) = inputx(:,j,mod(i-1,4)+1);
label(:,i) = labelx(:,j,mod(i-1,4)+1);
if rem(i,4)==0
j = j + 1;
end
end

Selanjutnya didefinisikan parameter-parameter utama seperti banyaknya data untuk


training, banyaknya data untuk testing, variabel-variabel untuk menyimpan matriks data
training dan testing. Di sini juga didefinisikan parameter-parameter neural network yaitu
jumlah hidden layer dan nilai learning rate. Jumlah layer input dan layer output diperoleh
dari dataset.

%% Inisialisasi Parameter-Parameter Utama


% Tentukan Banyaknya Data Untuk Training dan Testing
num_tr = 40; % Banyaknya Data Training
num_ts = size(inputs,2) - num_tr; % Banyaknya Data Testing

%Pisahkan Data Untuk Training dan Testing


%Preallocate Variables

Page 4 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
k_tr = zeros(size(inputs,1),num_tr); %input untuk training
t_tr = zeros(size(labels,1),num_tr); %supervisor untuk training
k_ts = zeros(size(inputs,1),num_ts); %input untuk testing
t_ts = zeros(size(labels,1),num_ts); %supervisor untuk testing

% Pecah jadi Dataset Training, Dataset Testing


% Buat Training Data Set
for j = 1:num_tr
k_tr(:,j) = input(:,j);
t_tr(:,j) = label(:,j);
end
% Buat Testing Data Set
for j = 1:num_ts
k_ts(:,j) = input(:,j+num_tr);
t_ts(:,j) = label(:,j+num_tr);
end
% Output Dalam Bentuk Indeks Integer
[jnk, ind_t_ts] = max(t_ts(:,:));

% Untuk menyimpan dataset training yang dirandom


k = zeros(size(k_tr));
t = zeros(size(t_tr));

num_inp = size(inputs,1); % No. of input nodes


num_hid = 20; % No. of hidden layer nodes
num_out = size(labels,1); % No. of output nodes
eta = 0.0001; % Learning rate

sse_rec = []; % Will hold a record of all sum-squared-errors. Nice to


plot
sse = 10; % A dummy initial Sum Squred Error (SSE)
time_rec = []; % Merekam running time epoch-epoch
time = 0; % Running time satu epoch

Berikutnya dilakukan inisialisasi terhadap weight dan bias dengan persebaran Gaussian
pada rentang -0.5 hingga 0.5 melalui kode berikut.

%% Inisialisasi Weight, Bias, dan Epoch


% % Berikan weight nilai random dalam rentang [-0.5,0.5]
w1 = 0.5*(1-2*rand(num_hid,num_inp));
w2 = 0.5*(1-2*rand(num_out,num_hid)); % Hidden-to-output weights

% Inisialisi Bias
b2 = 0.5*(1-2*rand(num_hid,1));
b3 = 0.5*(1-2*rand(num_out,1));

epoch = 0; % Inisialisasi count untuk epoch training


mini_batch_size = 8; % 72 data set, diambil 8 data untuk setiap batch
num_batch = floor(num_tr/mini_batch_size); % menghitung jumlah mini
batch dalam data set training

X = zeros(size(k,1),mini_batch_size,num_batch); % Operator training


data untuk backpropagation

Page 5 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Tx = zeros(size(t,1),mini_batch_size,num_batch); % Operator supervisor
data untuk backpropagation
correct_out = 0; % Inisialisasi jumlah output yang benar

Pada kode di atas juga dilakukan inisialisasi parameter-parameter seperti epoch, ukuran
mini batch, jumlah batch dll.

Selanjutnya adalah algoritma utama training stochastic gradient descent (SGD),


backpropagation dan testing.

%% Loop Utama: Backpropagation


while correct_out < 21 %for j = 1:epoch %for i = 1:iterations % repeat
the whole training set over and over
order = randperm(num_tr); % Randomisasi urutan dataset training
for i = 1:num_tr % create randomized training and supervisor matrix
k(:,i) = k_tr(:,order(i));
t(:,i) = t_tr(:,order(i));
end
for i = 1:num_batch % divide training and supervisor matrix into
mini batches
for m = 1:mini_batch_size
X(:,m,i) = k(:,mini_batch_size*(i-1)+m);
Tx(:,m,i) = t(:,mini_batch_size*(i-1)+m);
end
end
for i = 1:num_batch %Training dan Backpropagation
dw1 = zeros(size(w1)); % Last w1 change, set to a zero matrix
dw2 = zeros(size(w2)); % Last w2 change, set to a zero matrix
db2 = zeros(size(b2)); % Last b2 change, set to a zero matrix
db3 = zeros(size(b3)); % Last b3 change, set to a zero matrix

z2 = w1 * X(:,:,i) + b2;
a2 = 1./(1+exp(-z2)); % Sigmoid
da2 = (1 - a2).*a2;

z3 = w2 * a2 + b3;
a3 = 1./(1+exp(-z3)); % Sigmoid
da3 = (1 - a3).*a3;

%Error Determination
output_error = Tx(:,:,i) - a3; % Error matrix
s3 = - output_error .* da3; % Persamaan untuk s3 menggunakan
'minus dari output error'
s2 = (w2.' * s3) .* da2;

O = (X(:,:,i) * s2.').';
dw1 = dw1 + O;
O = (a2 * (s3).').';
dw2 = dw2 + O;
db2 = db2 + sum(s2,2);
db3 = db3 + sum(s3,2);

Page 6 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin

w1 = w1 - eta * dw1;
w2 = w2 - eta * dw2;
b2 = b2 - eta * db2;
b3 = b3 - eta * db3;
end
%Tahap Testing
z2 = w1 * k_ts + b2;
a2 = 1./(1 + exp(-z2)); % Sigmoid

z3 = w2 * a2 + b3;
a3 = 1./(1 + exp(-z3)); % Sigmoid

[jnk, ind_a3] = max(a3(:,:)); % get indexes of nn output as i of


the row with max valuue
num_err_output = sum((ind_t_ts - ind_a3)~=0,2); % calculate number
of difference between output and test labels

error_ts = t_ts - a3; % Error matrix from the test stage


sse = trace((error_ts'*error_ts)/2); % Sum sqr error, matrix style
sse_rec = [sse_rec sse]; % Record keeping of SSE
correct_out = num_ts - num_err_output;
pct_correct_out = correct_out/num_ts*100;

time = toc; % waktu dalam detik


time_rec = [time_rec time]; % run sum(time_rec) to get approx.
total running time
disp([' Epoch ' num2str(epoch) ' Output ' num2str(correct_out) '/'
num2str(num_ts) '(' num2str(100*correct_out/num_ts) '%)' ' SSE Test '
num2str(sse,10) ' Time ' num2str(time) ' seconds']);
tic;
epoch = epoch + 1;
end

Pada tahap testing, parameter banyaknya data yang teruji benar (correct_out) akan
diupdate dan loop di atas akan terus berlanjut hingga diperoleh banyaknya data yang
teruji benar (correct_out) lebih besar dari pada nilai yang diinginkan di awal loop
pada kode while.

1.2 Hasil Simulasi MATLAB Dataset Uang Tipe Data Double


Untuk memperoleh hasil yang mudah dibandingkan, penulis mengambil konfigurasi
berikut sebagai konfigurasi default:
num_tr (jumlah data training) = 54
num_hid (neuron hidden layer) = 16
eta (learning rate) = 0.1
mini_batch_size (ukuran mini batch) = 8
epoch = 10000

Page 7 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Nilai banyaknya data yang teruji benar (correct_out), Sum Squared Error (SSE), dan
waktu eksekusi pada epoch ke 10000 akan dicuplik untuk setiap variasi. Berikut cuplikan
untuk konfigurasi default.
Epoch 10000 Output 6/18(33.3333%) SSE Test Time 0.0010009 seconds

Variasi dilakukan dengan mengubah nilai-nilai pada parameter konfigurasi kecuali nilai
epoch. Berikut hasil-hasil yang diperoleh.

Variasi terhadap jumlah data training:


num_tr num_hid eta batch size output (%) SSE Time
44 16 0.10 8.00 35.71 16.0642 8.6646
54 16 0.10 8.00 38.89 9.1491 9.9901
64 16 0.10 8.00 25.00 4.6933 10.5207

Variasi terhadap jumlah neuron hidden layer:


num_tr num_hid eta batch size output (%) SSE Time
54 12 0.10 8.00 33.33 9.7667 9.6294
54 16 0.10 8.00 38.89 9.1491 9.9901
54 20 0.10 8.00 33.33 9.5389 10.3159

Variasi terhadap learning rate:


num_tr num_hid eta batch size output (%) SSE Time
54 16 0.03 8.00 38.89 9.5749 9.9610
54 16 0.10 8.00 38.89 9.1491 9.9901
54 16 0.30 8.00 38.89 10.3781 9.9548

Variasi terhadap batch size:


num_tr num_hid eta batch size output (%) SSE Time
54 16 0.10 1.00 44.44 9.7962 25.62
54 16 0.10 8.00 38.89 9.1491 9.9901
54 16 0.10 18.00 33.33 10.1223 9.2511

Dari data-data di atas dapat diamati bahwa jumlah data yang benar saat tahap testing
selalu antara 23% hingga 44% dari jumlah data yang diujikan. Dengan keakuratan paling
tinggi adalah 44%, yaitu dari 18 data uji ada 8 data yang berhasil dijawab dengan benar.
Karena akurasi sistem neural network dengan dataset uang ini rendah (di bawah 90%),
maka diputuskan untuk tidak melanjutkan dataset ini ke tahap simulasi fixed point.

Page 8 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
1.3 Simulasi MATLAB MNIST di Double dan Hasilnya
Meskipun dataset histogram uang memberikan akurasi yang kurang, tahap simulasi fixed
point tetap akan dilakukan dengan dataset MNIST. Seperti biasa pertama dilakukan
simulasi di tipe data double terlebih dahulu untuk menkonfirmasi konvergensi datasetnya.
Kode yang digunakan mirip seperti kode untuk simulasi dataset uang, hanya saja
inisialisasi datasetnya berbeda. Skema training tetap menggunakan Mini Batch SGD.

Berikut konfigurasi yang digunakan:


num_tr (jumlah data training) = 60000
num_ts (jumlah data testing) = 10000
num_hid (neuron hidden layer) = 30
eta (learning rate) = 0.3
mini_batch_size (ukuran mini batch) = 10
epoch = 30

Berikut hasil yang diperoleh


Epoch 1 Output 9429/10000(94.29%) SSE Test 476.1284442 Time 26.6362 seconds
Epoch 2 Output 9451/10000(94.51%) SSE Test 469.7384146 Time 6.0171 seconds
Epoch 3 Output 9527/10000(95.27%) SSE Test 398.2708503 Time 4.1002 seconds
...
Epoch 28 Output 9603/10000(96.03%) SSE Test 354.7656485 Time 4.045 seconds
Epoch 29 Output 9608/10000(96.08%) SSE Test 356.5043867 Time 4.0437 seconds
Epoch 30 Output 9601/10000(96.01%) SSE Test 358.7370565 Time 4.1879 seconds

Eksekusi training MNIST dalam tipe data double cukup singkat, yaitu sekitar 4 detik
untuk setiap epochnya. Pada epoch pertama sistem sudah konvergen dan menghasilkan
akurasi keluaran 94.29%. Epoch-epoch selanjutnya menghasilkan keakuratan yang tidak
terlalu signnifikan, menghaisilkan akurasi sekitar 2% lebih tinggi dari epoch pertama.
Waktu eksekusi 30 epoch ini adalah sekitar 246.7078 detik.

1.4 Simulasi MATLAB MNIST di Fixed Point dan Hasilnya


Selanjutnya dilakukan simulasi dataset MNIST dalam tipe data dan operasi aritmatika
fixed point. Meskipun penulis sudah mengoptimasi simulasi yang dilakukan dengan
membuat file MEX untuk fungsi sigmoid, proses simulasi masih berjalan dengan lambat.
Berikut cuplikan waktu eksekusi lima batch pertama.
Epoch 1 Batch 1 SSE 11.2519 Time 95.3493 seconds
Epoch 1 Batch 2 SSE 4.5491 Time 1.3487 seconds
Epoch 1 Batch 3 SSE 4.6859 Time 1.1784 seconds
Epoch 1 Batch 4 SSE 4.5458 Time 1.0985 seconds

Page 9 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Epoch 1 Batch 5 SSE 4.5149 Time 1.1858 seconds

Eksekusi batch pertama memerlukan waktu sekitar 95 detik karena eksekusi pertama
termasuk menjalankan inisialisasi awal. Selanjutnya setiap batch dieksekusi sekitar
1.1667 detik.

Dengan jumlah data training 50000 dan membuat satu batch berisi 10 data maka terdapat
5000 batch. Setiap epoch, program melakukan loop sebanyak batch yang ada sehingga
diperkirakan epoch pertama akan selesai setelah (5000 - 1)×1.1667 detik = 8333.333
detik atau sekitar 2.3 jam. Untuk menguji konvergensi MNIST di fixed point maka
penulis mencetak nilai sum square error di dalam loop batch. Dapat diamati nilai SSE
semakin kecil seiring dengan diolahnya batch baru.

Penulis mencoba mencuplik hasil pengujian yang dilakukan di dalam loop batch. Hasil
yang diperoleh memang tidak memperlihatkan bertambahnya jumlah nilai yang diperoleh
benar secara uniform. Berikut hasil yang diperoleh untuk 450 batch pertama.

Epoch 1 Batch 50 Output 319/10000(3.19%) SSE 3464.0203 Time 242.4756 seconds


Epoch 1 Batch 100 Output 127/10000(1.27%) SSE 2288.1792 Time 66.0592
seconds
Epoch 1 Batch 150 Output 167/10000(1.67%) SSE 1823.2786 Time 65.6392
seconds
Epoch 1 Batch 200 Output 102/10000(1.02%) SSE 1454.2119 Time 60.1439
seconds
Epoch 1 Batch 250 Output 72/10000(0.72%) SSE 1632.5459 Time 67.4533 seconds
Epoch 1 Batch 300 Output 107/10000(1.07%) SSE 1177.0453 Time 60.4582
seconds
Epoch 1 Batch 350 Output 60/10000(0.6%) SSE 1149.1717 Time 63.6291 seconds
Epoch 1 Batch 400 Output 92/10000(0.92%) SSE 1143.0767 Time 61.687 seconds
Epoch 1 Batch 450 Output 76/10000(0.76%) SSE 954.2043 Time 65.5657 seconds

Persentase output yang benar kadang naik kadang turun, namun jelas bahwa Sum
Squared Error (SSE) turun dengan kenaikan batch.

2. Kesimpulan

Proses training neural network bukanlah suatu hal yang trivial, karena konvergen
tidaknya suatu sistem neural network bergantung pada banyak parameter seperti misalnya
dataset yang digunakan, inisialisasi weight dan bias, jumlah neuron dan layer yang

Page 10 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
terlibat, skema training yang digunakan, dan di mana sistem neural network tersebut
disimulasikan atau diimplementasikan.

Tim penulis memiliki beberapa pilihan langkah yang dalat diambil untuk tahap desain
selanjutnya. Tim penulis dapat meneruskan implementasi sistem klasifikasi uang kertas
dengan mencari terlebih dahulu dataset training yang menghasilkan akurasi yang baik
(>90% success rate). Tim penulis dapat pula mengambil ide implementasi sistem lainnya
dimulai dengan memperoleh terlebih dahulu dataset yang bagus. Tanpa harus mencari
dataset lainnya, tim penulis dapat memilih untuk mengimplementasikan sistem klasifikasi
angka dengan dataset MNIST yang telah teruji konvergensi dan keakuratannya.

Pilihan langkah selanjutnya:


1. Mencari dataset lain yang konvergen dan memiliki akurasi (>90%)
2. Melakukan implementasi dengan dataset MNIST

Page 11 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin

LAMPIRAN
A. Kode MATLAB Simulasi Neural Network MNIST Fixed Point
clear;clc;tic;
% Kode utama untuk training tipe Double
% Adaptasi dari:
% http://www2.bcs.rochester.edu/sites/raizada/matlab-neural-nets.html
% kode MATLAB dari LSI Contest, dan
% http://neuralnetworksanddeeplearning.com/chap1.html
%% Inisialisasi Property Fixed Point
F = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap',...
'ProductMode', 'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
word = 32; %Lebar word dengan struktur: |s (word - frac - 1) frac|
frac = 23; %Lebar fraksi
%% Inisialisasi Variabel-Variabel Awal
images = loadMNISTImages('train-images.idx3-ubyte');
labels = loadMNISTLabels('train-labels.idx1-ubyte');

labelx = zeros(10,60000);
for i = 1:60000
labelx(labels(i)+1,i) = 1 ;
end

%split into training and testing data


num_tr = 50000;
num_ts = size(images,2) - num_tr;
%Preallocate Variables
k_tr = zeros(size(images,1),num_tr);
t_tr = zeros(size(labelx,1),num_tr);
k_ts = zeros(size(images,1),num_ts);
t_ts = zeros(size(labelx,1),num_ts);
ind_t_ts = zeros(1,size(labelx,2) - num_tr);

%create Training Data Set


for j = 1:num_tr
k_tr(:,j) = images(:,j);
t_tr(:,j) = labelx(:,j);
end

%create Testing Data Set


for j = 1:num_ts
k_ts(:,j) = fi(images(:,j+num_tr),1,word,frac,F);
t_ts(:,j) = fi(labelx(:,j+num_tr),1,word,frac,F);
ind_t_ts(j) = labels(j+num_tr)';
end

k = zeros(size(k_tr));
t = zeros(size(t_tr));

Page 12 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin

num_inp = size(k,1); % No. of input nodes


num_hid = 30; % No. of hidden layer nodes
num_out = size(t,1); % No. of output nodes
eta = 0.3; % Learning rate. Note: eta = 1 is very large.

sse_rec = []; % Will hold a record of all sum-squared-errors. Nice to


plot
sse = 10; % A dummy initial sse. Must be large, for the "while"
below
time_rec = [];
time = 0;

%% Inisialisasi Weight, Bias, dan Epoch


% % Berikan weight nilai random dalam rentang [-0.5,0.5]
w1_init = 0.5*(1-2*rand(num_hid,num_inp));
w2_init = 0.5*(1-2*rand(num_out,num_hid)); % Hidden-to-output weights

% Inisiasi Bias
b2_init = 0.5*(1-2*rand(num_hid,1));
b3_init = 0.5*(1-2*rand(num_out,1));

w1 = fi(w1_init,1,word,frac,F); % Weight dalam fixed point


w2 = fi(w2_init,1,word,frac,F);
b2 = fi(b2_init,1,word,frac,F); % Weight dalam fixed point
b3 = fi(b3_init,1,word,frac,F);

epoch = 1; % Inisialisasi count untuk epoch training


mini_batch_size = 10;
num_batch = floor(num_tr/mini_batch_size);

X = zeros(size(k,1),mini_batch_size,num_batch);
Tx = zeros(size(t,1),mini_batch_size,num_batch);
correct_out = 0; % Inisialisasi jumlah output yang benar
%% Loop Utama: Backpropagation
for j = 1:epoch %while sse > 0.01 %for i = 1:iterations % repeat the
whole training set over and over
order = randperm(num_tr); % randomize the presentations
for i = 1:num_tr % create randomized training and supervisor matrix
k(:,i) = k_tr(:,order(i));
t(:,i) = t_tr(:,order(i));
end
for i = 1:num_batch % divide training and supervisor matrix into
mini batches
for m = 1:mini_batch_size
X(:,m,i) = fi(k(:,mini_batch_size*(i-1)+m),1,word,frac,F);
Tx(:,m,i) = fi(t(:,mini_batch_size*(i-1)+m),1,word,frac,F);
end
end
for i = 1:num_batch
dw1 = zeros(size(w1)); % Last w1 change, set to a
zero matrix
dw2 = zeros(size(w2)); % Last w2 change, set to a
zero matrix
db2 = zeros(size(b2)); % Last b2 change, set to a

Page 13 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
zero matrix
db3 = zeros(size(b3)); % Last b3 change, set to a
zero matrix

z2_a = w1 * X(:,:,i);
z2 = fi(z2_a + repmat(b2,1,size(z2_a,2)),1,word,frac,F);
a2 = sigmoid(z2); % Sigmoid
da2 = (fi(1,1,word,frac,F) - a2).*a2;

z3_a = w2 * a2;
z3 = fi(z3_a + repmat(b3,1,size(z3_a,2)),1,word,frac,F);
a3 = sigmoid(z3); % Sigmoid
da3 = (fi(1,1,word,frac,F) - a3).*a3;

%Error Determination
output_error = Tx(:,:,i) - a3; % Error matrix
s3 = - output_error .* da3; % Persamaan untuk s3 menggunakan
'minus dari output error'
s2 = (w2.' * s3) .* da2;

O = (X(:,:,i) * s2.').';
dw1 = dw1 + O;
O = (a2 * (s3).').';
dw2 = dw2 + O;
db2 = db2 + sum(s2,2);
db3 = db3 + sum(s3,2);

w1 = w1 - eta * dw1;
w2 = w2 - eta * dw2;
b2 = b2 - repmat(eta * db2,1,size(b2,2));
b3 = b3 - repmat(eta * db3,1,size(b3,2));

sse = trace(output_error'*output_error)/2; % Sum sqr error,


matrix style, harus dibagi 2 dulu
sse_rec = [sse_rec sse]; % Record keeping
%
% time = toc; % waktu dalam detik
% time_rec = [time_rec time]; % run sum(time_rec) to get
approx. total running time
% disp([' Epoch ' num2str(j) ' Batch ' num2str(i) ' SSE '
num2str(sse) ' Time ' num2str(time) ' seconds']);
% tic;

if rem(i,50)==0 % Every 50 batch, show how training is


doing
%evaluate feedforward
z2 = double(w1) * k_ts + double(b2);
a2 = 1./(1 + exp(-z2)); % Sigmoid

z3 = double(w2) * double(a2) + double(b3);


a3 = 1./(1 + exp(-z3)); % Sigmoid

[jnk, ind_a3] = max(a3(:,:)); % get indexes of nn output as


i of the row with max valuue
num_err_output = sum((ind_t_ts - ind_a3)~=0,2); % calculate

Page 14 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
number of difference between output and test labels

error_ts = t_ts - a3; % Error matrix from the test stage


sse = trace((error_ts'*error_ts)/2); % Sum sqr error,
matrix style
sse_rec = [sse_rec sse]; % Record keeping
of SSE
correct_out = num_ts - num_err_output;
pct_correct_out = correct_out/num_ts*100;

time = toc; % waktu dalam detik


time_rec = [time_rec time]; % run sum(time_rec) to get
approx. total running time
disp([' Epoch ' num2str(j) ' Batch ' num2str(i) ' Output '
num2str(correct_out) '/' num2str(num_ts) '('
num2str(100*correct_out/num_ts) '%)' ' SSE ' num2str(sse) ' Time '
num2str(time) ' seconds']);
tic;
end
end
end
%% Plot Sum Squared Error
% figure(1);
% plot(sse_rec); xlabel('Epochs'); ylabel('Sum squared error (SSE)
Test'); % The end

Sigmoid.m (wrapper fungsi sigmoid)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%
%
%
% Generated by MATLAB 9.2 and Fixed-Point Designer 5.4
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%
function y = sigmoid(x)
fm = get_fimath();
y_out = fi(zeros(size(x)), 1, 32, 23, fm); %inisialisasi hid_act
for i=1:size(x,1)
for j=1:size(x,2)
if ( x > 10 )
y_out(i,j) = fi(1, 1, 32, 23, fm);
elseif ( x < -10 )
y_out(i,j) = fi(0, 1, 32, 23, fm);
else
x.fimath = fm;
y_out(i,j) = sigmoid_core_mex( x(i,j) );
end
end
end
y = y_out;
end

function fm = get_fimath()

Page 15 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
fm = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap', 'ProductMode',
'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
end

Sigmoid_core.m (file *.m yang dikonversi ke MEX)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%
%
%
% Generated by MATLAB 9.2 and Fixed-Point Designer 5.4
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%
%#codegen
function y = sigmoid_core(x)
fm = get_fimath();

y = fi(replacement_sigmoid_core(x), 0, 32, 23, fm);


end

%
% Copyright 2017 The MathWorks, Inc.

% calculate replacement_sigmoid_core via lookup table between extents x


= fi([-10,10]),
% interpolation degree = 1, number of points = 255
function y = replacement_sigmoid_core( x )
persistent LUT
if ( isempty(LUT) )
T = numerictype( false, 32, 32);
LUT = fi([4.53978687024344e-05, 4.91168227056538e-05,
5.31404140029834e-05, ...
5.74935941297645e-05, 6.22033578237689e-05, 6.72989102562808e-05,
...
7.28118479369322e-05, 7.87763544079989e-05, 8.52294119344971e-05,
...
9.22110304943592e-05, 9.97644954787607e-05, 0.000107936635626969,
...
0.000116778112843526, 0.000126343735678887, 0.000136692798398597,
...
0.000147889447721484, 0.000160003079475099, 0.000173108767597656,
...
0.000187287728111076, 0.000202627820900396, 0.000219224092362079,
...
0.000237179362228709, 0.00025660485814162, 0.000277620901827523,
...
0.000300357651041617, 0.000324955901769631, 0.000351567955536324,

Page 16 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
...
0.000380358557049955, 0.000411505907822958, 0.000445202761850394,
...
0.000481657609901766, 0.000521095959490524, 0.000563761718131161,
...
0.00060991868807858, 0.000659852181370384, 0.000713870764662537,
...
0.000772308144064414, 0.000835525200943112, 0.000903912190481124,
...
0.000977891115638176, 0.00105791829008914, 0.00114448710468715, ...
0.00123813101303576, 0.001339426752847, 0.00144899782091428, ...
0.00156751822073934, 0.00169571650312097, 0.00183438012133579, ...
0.00198436012391749, 0.00214657620946235, 0.00232202216935159, ...
0.00251177174577387, 0.00271698493394405, 0.00293891475893011, ...
0.00317891455900252, 0.00343844580888367, 0.0037190865176726, ...
0.00402254023751618, 0.00435064572025131, 0.00470538726020264, ...
0.00508890576202741, 0.00550351057288243, 0.00595169211816411, ...
0.00643613537954287, 0.00695973425286337, 0.00752560682157847, ...
0.00813711157857305, 0.00879786462533554, 0.00951175787224651, ...
0.0102829782570408, 0.0111160279899979, 0.0120157458238281, ...
0.0129873293332075, 0.0140363581731105, 0.0151688182660697, ...
0.0163911268458171, 0.0177101582579334, 0.0191332703866291, ...
0.0206683315400527, 0.0223237475839908, 0.0241084890649186, ...
0.0260321180075047, 0.0281048140083545, 0.0303373991765172, ...
0.0327413613917513, 0.0353288752635453, 0.0381128200774811, ...
0.0411067939110328, 0.0443251229890827, 0.0477828652315156, ...
0.0514958068231101, 0.0554804505121647, 0.0597539942223798, ...
0.0643342984469858, 0.0692398407906541, 0.0744896559403176, ...
0.0801032592890252, 0.0861005524171015, 0.0925017086633065, ...
0.0993270371077195, 0.106596823450966, 0.114331146524894, ...
0.122549669521426, 0.131271405491508, 0.140514457255118, ...
0.150295732582821, 0.160630636360929, 0.17153274243056, ...
0.183013448881866, 0.195081621764222, 0.207743233405497, ...
0.22100100277064, 0.23485404647149, 0.249297550094635, ...
0.264322470362556, 0.279915279200623, 0.2960577609652, ...
0.312726873819967, 0.329894685467503, 0.347528392113271, ...
0.365590427651866, 0.384038667649752, 0.402826729823838, ...
0.421904369490595, 0.441217965032369, 0.460711084971502, ...
0.480325124952091, 0.5, 0.519674875047909, ...
0.539288915028498, 0.558782034967631, 0.578095630509405, ...
0.597173270176162, 0.615961332350248, 0.634409572348134, ...
0.652471607886729, 0.670105314532497, 0.687273126180033, ...
0.7039422390348, 0.720084720799377, 0.735677529637444, ...
0.750702449905365, 0.76514595352851, 0.77899899722936, ...
0.792256766594504, 0.804918378235778, 0.816986551118134, ...
0.82846725756944, 0.839369363639071, 0.849704267417179, ...
0.859485542744882, 0.868728594508492, 0.877450330478574, ...
0.885668853475106, 0.893403176549034, 0.90067296289228, ...
0.907498291336693, 0.913899447582898, 0.919896740710975, ...
0.925510344059682, 0.930760159209346, 0.935665701553014, ...
0.94024600577762, 0.944519549487835, 0.94850419317689, ...
0.952217134768484, 0.955674877010917, 0.958893206088967, ...
0.961887179922519, 0.964671124736455, 0.967258638608249, ...
0.969662600823483, 0.971895185991645, 0.973967881992495, ...
0.975891510935081, 0.977676252416009, 0.979331668459947, ...
0.980866729613371, 0.982289841742067, 0.983608873154183, ...
0.98483118173393, 0.985963641826889, 0.987012670666792, ...

Page 17 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
0.987984254176172, 0.988883972010002, 0.989717021742959, ...
0.990488242127754, 0.991202135374665, 0.991862888421427, ...
0.992474393178421, 0.993040265747137, 0.993563864620457, ...
0.994048307881836, 0.994496489427118, 0.994911094237973, ...
0.995294612739797, 0.995649354279749, 0.995977459762484, ...
0.996280913482328, 0.996561554191116, 0.996821085440997, ...
0.99706108524107, 0.997283015066056, 0.997488228254226, ...
0.997677977830648, 0.997853423790538, 0.998015639876083, ...
0.998165619878664, 0.998304283496879, 0.998432481779261, ...
0.998551002179086, 0.998660573247153, 0.998761868986964, ...
0.998855512895313, 0.998942081709911, 0.999022108884362, ...
0.999096087809519, 0.999164474799057, 0.999227691855936, ...
0.999286129235338, 0.99934014781863, 0.999390081311921, ...
0.999436238281869, 0.99947890404051, 0.999518342390098, ...
0.99955479723815, 0.999588494092177, 0.99961964144295, ...
0.999648432044464, 0.99967504409823, 0.999699642348958, ...
0.999722379098173, 0.999743395141858, 0.999762820637771, ...
0.999780775907638, 0.9997973721791, 0.999812712271889, ...
0.999826891232402, 0.999839996920525, 0.999852110552278, ...
0.999863307201601, 0.999873656264321, 0.999883221887157, ...
0.999892063364373, 0.999900235504521, 0.999907788969506, ...
0.999914770588065, 0.999921223645592, 0.999927188152063, ...
0.999932701089744, 0.999937796642176, 0.99994250640587, ...
0.999946859585997, 0.999950883177294, 0.999954602131298, ],
numerictype(T),fimath(x));
end
x_idx = fi((x - -10)*12.7,1,13,4,fimath(x));
idx_bot = floor(x_idx);
x_idx(:) = x_idx + 1;
if ( idx_bot >= fi(255,numerictype(idx_bot),fimath(x)) )
idx_bot = fi((254),numerictype(idx_bot),fimath(x));
elseif ( idx_bot <= fi(0,numerictype(idx_bot),fimath(x)) )
idx_bot = fi(1,numerictype(idx_bot),fimath(x));
end
idx_top = fi(idx_bot+1,numerictype(idx_bot),fimath(x));
x_bot = idx_bot;
x_top = idx_top;

y_bot = LUT(idx_bot);
y_top = LUT(idx_top);
y = y_top*(x_idx-x_bot) + ...
y_bot*(x_top - x_idx);
end

function fm = get_fimath()
fm = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap', 'ProductMode',
'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
end

Page 18 of 18

Anda mungkin juga menyukai