Technology News only at alphatechblocks.com
AI

Tutorial pembelajaran dengan pengawasan mandiri: Menerapkan SimCLR dengan pytorch lightning

Tutorial pembelajaran dengan pengawasan mandiri: Menerapkan SimCLR dengan pytorch lightning

Dalam tutorial praktis ini, kami akan memberi Anda implementasi ulang metode pembelajaran mandiri SimCLR untuk pra-pelatihan ekstraktor fitur yang tangguh. Metode ini cukup umum dan dapat diterapkan pada kumpulan data visi apa pun, serta tugas hilir yang berbeda.

Pada tutorial sebelumnya, saya menulis sedikit latar belakang tentang arena pembelajaran mandiri. Saatnya memulai proyek pertama Anda dengan menjalankan SimCLR pada kumpulan data kecil dengan 100 ribu gambar tak berlabel yang disebut STL10.

Kode tersedia di Github.

Metode SimCLR: pembelajaran kontrastif

Membiarkan SSayaM(kamu,ay)ya (kamu, v) perhatikan perkalian titik antara 2 yang dinormalisasi kamukamu Dan ayay vektor (yaitu kesamaan kosinus).

Maka fungsi kerugian untuk pasangan positif contoh (i,j) didefinisikan sebagai:

Saya,J=mencatatpengalaman(sim(zSaya,zJ)/T)k=12N1(kSaya)pengalaman(sim(zSaya,zk)/T)\ell_Halo=-\log \fracgimana tekniknya

Di mana 1(kSaya)0,1\mathbbmerupakan_slot \dalam selalu

T\ Bisa menunjukkan parameter suhu. Kerugian akhir dihitung dengan menjumlahkan semua pasangan positif dan membaginya 2×N=aySayaewS×BATCH_SSayaze2\kali N = penayangan \kali batch\_size

Ada berbagai cara untuk mengembangkan kerugian kontrastif. Di sini kami memberi Anda beberapa informasi penting.

Normalisasi L2 dan perhitungan matriks cosine kemiripan

Pertama, kita perlu menerapkan normalisasi L2 pada fitur, jika tidak, metode ini tidak akan berfungsi. Normalisasi L2 artinya vektor-vektor dinormalisasi sedemikian rupa sehingga semuanya terletak pada permukaan bola satuan (hiper), dimana norma L2 adalah 1.

z_i = F.normalize(proj_1, p=2, dim=1)

z_j = F.normalize(proj_2, p=2, dim=1)

Gabungkan 2 tampilan keluaran dalam dimensi batch. Bentuknya akan seperti itu (2×BATCH_SSayaze,DSayaM)(2 \kali batch\_size, redup)

def calc_similarity_batch(self, a, b):

representations = torch.cat((a, b), dim=0)

return F.cosine_similarity(representations.unsqueeze(1), representations.unsqueeze(0), dim=2)

Mengindeks matriks kesamaan untuk fungsi kerugian SimCLR

Sekarang kita perlu mengindeks ukuran matriks yang dihasilkan (BATCH_SSayaze×aySayaewS,BATCH_SSayaze×aySayaewS)(batch\_size \kali penayangan, batch\_size \kali penayangan)


simclr-ilustrasi-kerugian


Ilustrasi visual SimCLR. Gambar dari penulis

Oke, bagaimana kita melakukan itu? Saya memiliki pertanyaan yang sama. Di sini ukuran kumpulan adalah 2 gambar tetapi kami ingin menerapkan solusi untuk ukuran kumpulan apa pun. Jika Anda perhatikan lebih dekat, Anda akan melihat bahwa pasangan positif digeser dari diagonal utama sebanyak 2, itulah ukuran batch. Salah satu cara untuk melakukannya adalah torch.diag(). Dibutuhkan diagonal yang dipilih dari sebuah matriks. Parameter pertama adalah matriks dan parameter kedua menentukan diagonal, di mana nol mewakili elemen diagonal utama. Kami mengambil diagonal yang digeser oleh ukuran batch.

sim_ij = torch.diag(similarity_matrix, batch_size)

sim_ji = torch.diag(similarity_matrix, -batch_size)

positives = torch.cat((sim_ij, sim_ji), dim=0)

Ada BATCH_SSayaze×aySayaewSbatch\_size \kali tampilan

(0., 0., 0., 1., 0., 0.),

(0., 0., 0., 0., 1., 0.),

(0., 0., 0., 0., 0., 1.),

(1., 0., 0., 0., 0., 0.),

(0., 1., 0., 0., 0., 0.),

(0., 0., 1., 0., 0., 0.)

Untuk penyebutnya kita membutuhkan pasangan positif dan negatif. Jadi topeng biner akan menjadi elemen kebalikan dari matriks identitas.

self.mask = (~torch.eye(batch_size * 2, batch_size * 2, dtype=bool)).float()

pos_and_negatives = self.mask * similarity_matrix

Sekali lagi, keduanya adalah penyebut positif dan negatif.

Anda dapat melihat sisanya (penskalaan suhu dan menjumlahkan negatif dari penyebutnya, dll.):

Implementasi kerugian SimCLR

import torch

import torch.nn as nn

import torch.nn.functional as F

def device_as(t1, t2):

"""

Moves t1 to the device of t2

"""

return t1.to(t2.device)

class ContrastiveLoss(nn.Module):

"""

Vanilla Contrastive loss, also called InfoNceLoss as in SimCLR paper

"""

def __init__(self, batch_size, temperature=0.5):

super().__init__()

self.batch_size = batch_size

self.temperature = temperature

self.mask = (~torch.eye(batch_size * 2, batch_size * 2, dtype=bool)).float()

def calc_similarity_batch(self, a, b):

representations = torch.cat((a, b), dim=0)

return F.cosine_similarity(representations.unsqueeze(1), representations.unsqueeze(0), dim=2)

def forward(self, proj_1, proj_2):

"""

proj_1 and proj_2 are batched embeddings (batch, embedding_dim)

where corresponding indices are pairs

z_i, z_j in the SimCLR paper

"""

batch_size = proj_1.shape(0)

z_i = F.normalize(proj_1, p=2, dim=1)

z_j = F.normalize(proj_2, p=2, dim=1)

similarity_matrix = self.calc_similarity_batch(z_i, z_j)

sim_ij = torch.diag(similarity_matrix, batch_size)

sim_ji = torch.diag(similarity_matrix, -batch_size)

positives = torch.cat((sim_ij, sim_ji), dim=0)

nominator = torch.exp(positives / self.temperature)

denominator = device_as(self.mask, similarity_matrix) * torch.exp(similarity_matrix / self.temperature)

all_losses = -torch.log(nominator / torch.sum(denominator, dim=1))

loss = torch.sum(all_losses) / (2 * self.batch_size)

return loss

Augmentasi

Kunci pembelajaran representasi yang diawasi sendiri adalah augmentasi data. Alur transformasi yang umum digunakan adalah sebagai berikut:

  • Pangkas pada skala acak dari 7% hingga 100% gambar

  • Ubah ukuran semua gambar menjadi 224 atau dimensi spasial lainnya.

  • Terapkan pembalikan horizontal dengan probabilitas 50%.

  • Terapkan jittering warna tebal dengan probabilitas 80%.

  • Terapkan gaussian blur dengan probabilitas 50%. Ukuran kernel biasanya sekitar 10% dari gambar atau kurang.

  • Ubah gambar RGB menjadi skala abu-abu dengan probabilitas 20%.

  • Normalisasikan berdasarkan sarana dan varians imagenet

Pipeline ini akan diterapkan secara independen ke setiap gambar sebanyak dua kali dan akan menghasilkan dua tampilan berbeda yang akan dimasukkan ke dalam model backbone. Pada notebook ini kita akan menggunakan resnet18 standar.

import torch

import torchvision.transforms as T

class Augment:

"""

A stochastic data augmentation module

Transforms any given data example randomly

resulting in two correlated views of the same example,

denoted x ̃i and x ̃j, which we consider as a positive pair.

"""

def __init__(self, img_size, s=1):

color_jitter = T.ColorJitter(

0.8 * s, 0.8 * s, 0.8 * s, 0.2 * s

)

blur = T.GaussianBlur((3, 3), (0.1, 2.0))

self.train_transform = torch.nn.Sequential(

T.RandomResizedCrop(size=img_size),

T.RandomHorizontalFlip(p=0.5),

T.RandomApply((color_jitter), p=0.8),

T.RandomApply((blur), p=0.5),

T.RandomGrayscale(p=0.2),

T.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))

)

def __call__(self, x):

return self.train_transform(x), self.train_transform(x)

Di bawah ini adalah 4 tampilan berbeda dari gambar yang sama dengan menerapkan pipa stokastik yang sama:


augmentasi-stl10-simclr-pipa


4 augmentasi berbeda yang sama dengan pipa yang sama. Gambar oleh penulis

Untuk memvisualisasikannya, Anda perlu membatalkan normalisasi mean-std dan menempatkan saluran warna di dimensi terakhir:

def imshow(img):

"""

shows an imagenet-normalized image on the screen

"""

mean = torch.tensor((0.485, 0.456, 0.406), dtype=torch.float32)

std = torch.tensor((0.229, 0.224, 0.225), dtype=torch.float32)

unnormalize = T.Normalize((-mean / std).tolist(), (1.0 / std).tolist())

npimg = unnormalize(img).numpy()

plt.imshow(np.transpose(npimg, (1, 2, 0)))

plt.show()

dataset = STL10("./", split='train', transform=Augment(96), download=True)

imshow(dataset(99)(0)(0))

imshow(dataset(99)(0)(0))

imshow(dataset(99)(0)(0))

imshow(dataset(99)(0)(0))

Ubah Resnet18 dan tentukan grup parameter

Salah satu langkah penting untuk menjalankan simclr adalah menghapus lapisan terakhir yang terhubung sepenuhnya. Kami akan menggantinya dengan fungsi identitas. Kemudian, kita perlu menambahkan kepala proyeksi (MLP lain) yang hanya akan digunakan untuk tahap pra-pelatihan dengan pengawasan mandiri. Untuk melakukannya, kita perlu menyadari dimensi fitur model kita. Secara khusus, resnet18 mengeluarkan vektor 512 redup sedangkan resnet50 mengeluarkan vektor 2048 redup. MLP proyeksi akan mengubahnya menjadi ukuran vektor penyematan yaitu 128, berdasarkan makalah resmi.

Untuk mengoptimalkan model SSL kami menggunakan teknik regularisasi berat, seperti penurunan bobot. Untuk menghindari penurunan kinerja, kita perlu mengecualikan penurunan bobot dari lapisan normalisasi batch.

import pytorch_lightning as pl

import torch

import torch.nn.functional as F

from pl_bolts.optimizers.lr_scheduler import LinearWarmupCosineAnnealingLR

from torch.optim import SGD, Adam

class AddProjection(nn.Module):

def __init__(self, config, model=None, mlp_dim=512):

super(AddProjection, self).__init__()

embedding_size = config.embedding_size

self.backbone = default(model, models.resnet18(pretrained=False, num_classes=config.embedding_size))

mlp_dim = default(mlp_dim, self.backbone.fc.in_features)

print('Dim MLP input:',mlp_dim)

self.backbone.fc = nn.Identity()

self.projection = nn.Sequential(

nn.Linear(in_features=mlp_dim, out_features=mlp_dim),

nn.BatchNorm1d(mlp_dim),

nn.ReLU(),

nn.Linear(in_features=mlp_dim, out_features=embedding_size),

nn.BatchNorm1d(embedding_size),

)

def forward(self, x, return_embedding=False):

embedding = self.backbone(x)

if return_embedding:

return embedding

return self.projection(embedding)

Langkah selanjutnya adalah memisahkan parameter model menjadi 2 kelompok.

Tujuan dari kelompok kedua adalah untuk menghilangkan peluruhan berat dari lapisan normalisasi batch. Dalam hal menggunakan pengoptimal LARS, Anda juga perlu menghilangkan penurunan bobot dari bias. Salah satu cara untuk mencapainya adalah fungsi berikut:

def define_param_groups(model, weight_decay, optimizer_name):

def exclude_from_wd_and_adaptation(name):

if 'bn' in name:

return True

if optimizer_name == 'lars' and 'bias' in name:

return True

param_groups = (

kasih,

kemenangan,

)

return param_groups

Saya tidak menggunakan pengoptimal LARS dalam tutorial ini tetapi jika Anda berencana menggunakannya, berikut adalah implementasi yang saya gunakan sebagai referensi.

Logika pelatihan SimCLR

Di sini kita akan mengimplementasikan seluruh logika pelatihan SimCLR. Ambil 2 tampilan, teruskan untuk mendapatkan proyeksi penyematan, dan hitung kerugian SimCLR.

Kita dapat menyelesaikan pelatihan SimCLR dengan satu kelas menggunakan petir Pytorch yang merangkum semua logika pelatihan. Dalam bentuknya yang paling sederhana, kita perlu mengimplementasikan training_step metode yang mendapat masukan batch dari dataloader. Anda dapat menganggapnya sebagai panggilan batch = next(iter(dataloader)) di setiap langkah. Berikutnya adalah configure_optimizers metode yang mengikat model dengan pengoptimal dan penjadwal pelatihan. Saya menggunakan penjadwal yang sudah diimplementasikan dari petir PyTorch (paket kecil lainnya di ekosistem petir). Pada dasarnya, kami secara bertahap meningkatkan kecepatan pemelajaran ke nilai dasarnya dan kemudian kami melakukan anil kosinus.

class SimCLR_pl(pl.LightningModule):

def __init__(self, config, model=None, feat_dim=512):

super().__init__()

self.config = config

self.augment = Augment(config.img_size)

self.model = AddProjection(config, model=model, mlp_dim=feat_dim)

self.loss = ContrastiveLoss(config.batch_size, temperature=self.config.temperature)

def forward(self, X):

return self.model(X)

def training_step(self, batch, batch_idx):

x, labels = batch

x1, x2 = self.augment(x)

z1 = self.model(x1)

z2 = self.model(x2)

loss = self.loss(z1, z2)

self.log('Contrastive loss', loss, on_step=True, on_epoch=True, prog_bar=True, logger=True)

return loss

def configure_optimizers(self):

max_epochs = int(self.config.epochs)

param_groups = define_param_groups(self.model, self.config.weight_decay, 'adam')

lr = self.config.lr

optimizer = Adam(param_groups, lr=lr, weight_decay=self.config.weight_decay)

print(f'Optimizer Adam, '

f'Learning Rate Ya, '

f'Effective batch size slot-slot')

scheduler_warmup = LinearWarmupCosineAnnealingLR(optimizer, warmup_epochs=10, max_epochs=max_epochs,

warmup_start_lr=0.0)

return (optimizer), (scheduler_warmup)

Akumulasi gradien dan ukuran batch efektif

Di sini penting untuk menyoroti pentingnya menggunakan ukuran batch yang besar. Metode ini sangat bergantung pada ukuran kumpulan yang besar untuk menjauhi 2 tampilan gambar yang sama (positif). Untuk melakukan itu dengan anggaran terbatas kita dapat menggunakan akumulasi gradien. Kami menghitung rata-rata gradien NN langkah-langkah dan kemudian memperbarui model, alih-alih memperbarui setelah setiap gerakan maju-mundur.

Jadi, sekarang sudah masuk akal bahwa kelompok yang efektif adalah: BATCH_SSayaze_PeR_GPkamuACCkamuMkamuakuATSayaHaiN_STePSNkamuMBeR_HaiF_GPkamuSbatch\_size\_per\_gpu * akumulasi\_langkah * jumlah\_of\_gpus

“Dalam pemrograman komputer, a panggilan balik adalah referensi ke kode yang dapat dieksekusi atau bagian dari kode yang dapat dieksekusi yang diteruskan sebagai argumen ke kode lain. Hal ini memungkinkan lapisan perangkat lunak tingkat yang lebih rendah untuk memanggil subrutin (atau fungsi) yang ditentukan dalam lapisan tingkat yang lebih tinggi.” ~ StackOverflow

from pytorch_lightning.callbacks import GradientAccumulationScheduler

accumulator = GradientAccumulationScheduler(scheduling=dibilang)

Skrip pra-pelatihan SimCLR utama

Skrip utama hanya mengumpulkan semuanya dan menginisialisasinya Trainer kelas petir PyTorch. Anda kemudian dapat menjalankannya pada satu atau beberapa GPU. Perhatikan bahwa dalam cuplikan di bawah, saya membaca semua GPU yang tersedia di sistem.

import torch

from pytorch_lightning import Trainer

import os

from pytorch_lightning.callbacks import GradientAccumulationScheduler

from pytorch_lightning.callbacks import ModelCheckpoint

from torchvision.models import resnet18

available_gpus = len((torch.cuda.device(i) for i in range(torch.cuda.device_count())))

save_model_path = os.path.join(os.getcwd(), "saved_models/")

print('available_gpus:',available_gpus)

filename='SimCLR_ResNet18_adam_'

resume_from_checkpoint = False

train_config = Hparams()

reproducibility(train_config)

save_name = filename + '.ckpt'

model = SimCLR_pl(train_config, model=resnet18(pretrained=False), feat_dim=512)

data_loader = get_stl_dataloader(train_config.batch_size)

accumulator = GradientAccumulationScheduler(scheduling=adalah)

checkpoint_callback = ModelCheckpoint(filename=filename, dirpath=save_model_path,every_n_val_epochs=2,

save_last=True, save_top_k=2,monitor='Contrastive loss_epoch',mode='min')

if resume_from_checkpoint:

trainer = Trainer(callbacks=(accumulator, checkpoint_callback),

gpus=available_gpus,

max_epochs=train_config.epochs,

resume_from_checkpoint=train_config.checkpoint_path)

else:

trainer = Trainer(callbacks=(accumulator, checkpoint_callback),

gpus=available_gpus,

max_epochs=train_config.epochs)

trainer.fit(model, data_loader)

trainer.save_checkpoint(save_name)

from google.colab import files

files.download(save_name)

Penyempurnaan

Oke, kami melatih seorang model. Sekarang saatnya untuk menyempurnakannya. Kami akan menggunakan kelas modul petir PyTorch untuk merangkum logikanya. Saya menggunakan tulang punggung resnet18 yang telah dilatih sebelumnya, tanpa kepala proyeksi, dan saya hanya menambahkan satu lapisan linier di atasnya. Saya menyempurnakan seluruh jaringan. Tidak ada augmentasi yang diterapkan di sini. Mereka hanya akan menunda pelatihan. Sebagai gantinya, kami ingin mengukur kinerja berdasarkan bobot yang telah dilatih sebelumnya di imagenet dan inisialisasi acak.

import pytorch_lightning as pl

import torch

from torch.optim import SGD

class SimCLR_eval(pl.LightningModule):

def __init__(self, lr, model=None, linear_eval=False):

super().__init__()

self.lr = lr

self.linear_eval = linear_eval

if self.linear_eval:

model.eval()

self.mlp = torch.nn.Sequential(

torch.nn.Linear(512,10),

)

self.model = torch.nn.Sequential(

model, self.mlp

)

self.loss = torch.nn.CrossEntropyLoss()

def forward(self, X):

return self.model(X)

def training_step(self, batch, batch_idx):

x, y = batch

z = self.forward(x)

loss = self.loss(z, y)

self.log('Cross Entropy loss', loss, on_step=True, on_epoch=True, prog_bar=True, logger=True)

predicted = z.argmax(1)

acc = (predicted == y).sum().item() / y.size(0)

self.log('Train Acc', acc, on_step=False, on_epoch=True, prog_bar=True, logger=True)

return loss

def validation_step(self, batch, batch_idx):

x, y = batch

z = self.forward(x)

loss = self.loss(z, y)

self.log('Val CE loss', loss, on_step=True, on_epoch=True, prog_bar=False, logger=True)

predicted = z.argmax(1)

acc = (predicted == y).sum().item() / y.size(0)

self.log('Val Accuracy', acc, on_step=True, on_epoch=True, prog_bar=True, logger=True)

return loss

def configure_optimizers(self):

if self.linear_eval:

print(f"\n\n Attention! Linear evaluation \n")

optimizer = SGD(self.mlp.parameters(), lr=self.lr, momentum=0.9)

else:

optimizer = SGD(self.model.parameters(), lr=self.lr, momentum=0.9)

return (optimizer)

Yang penting, STL10 adalah a bagian dari imagenet sehingga pembelajaran transfer dari imagenet diharapkan dapat bekerja dengan sangat baik.

Metode Menyempurnakan seluruh jaringan, Akurasi Validasi Evaluasi linier. Akurasi Validasi
Pra-pelatihan SimCLR pada split tanpa label STL10 75,1% 73,2%
Pra-pelatihan Imagenet (1M) 87,9% 78,6%
Inisialisasi acak 50,6%

Dalam semua kasus, model akan overfit selama penyempurnaan. Ingat tidak ada augmentasi yang diterapkan.

Kesimpulan

Bahkan dengan evaluasi yang tidak adil dibandingkan dengan bobot yang telah dilatih sebelumnya dari imagenet, pembelajaran mandiri yang kontras menunjukkan beberapa hasil yang sangat menjanjikan. Ada banyak metode pengawasan mandiri lainnya untuk dimainkan, tetapi SimCLR adalah dasarnya.

Sebagai penutup, kami menjelajahi cara membuat fungsi kerugian SimCLR langkah demi langkah dan meluncurkan skrip pelatihan tanpa terlalu banyak kode boilerplate dengan Pytorch-lightning. Meskipun ada kesenjangan antara representasi yang dipelajari SimCLR, metode canggih terbaru mengejar dan bahkan melampaui fitur yang dipelajari imagenet di banyak domain.

Terima kasih atas minat Anda pada AI dan tetaplah bersikap positif!

Pembelajaran Mendalam dalam Buku Produksi 📖

Pelajari cara membangun, melatih, menerapkan, menskalakan, dan memelihara model pembelajaran mendalam. Pahami infrastruktur ML dan MLOps menggunakan contoh langsung.

Pelajari lebih lanjut

* Pengungkapan: Harap dicatat bahwa beberapa tautan di atas mungkin merupakan tautan afiliasi, dan tanpa biaya tambahan kepada Anda, kami akan mendapat komisi jika Anda memutuskan untuk melakukan pembelian setelah mengklik.

ADVERTISEMENT:

jagoannya, buat membawa pulang cuan. tapi cemana
tekniknya? jumpain slot demo, benar jatuh Santuy Bro beri ini. santai aja mesin di sini yang Permainan terpercaya waktu. sekarang, satu-satunya ini bisa di hanya di yang menyediakan imbal hasil terbaik Daftarkanlah hanya, jumpain sih slot gacor tepat Santuy yang Bro and Sis? bahas tenang, kita aja di sini Games terbaik

saat ini satu-satunya di yaitu yang Indonesia memberikan ROI tertinggi Daftarkanlah hanya

Daftarkanlah hanya di :

Informasi mengenai KING SLOT, Segera Daftar Bersama king selot terbaik dan terpercaya no satu di Indonesia. Boleh mendaftar melalui sini king slot serta memberikan hasil kembali yang paling tinggi saat sekarang ini hanyalah KING SLOT atau Raja slot paling gacor, gilak dan gaco saat sekarang di Indonesia melalui program return tinggi di kingselot serta pg king slot

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

situs slot terbaru

situs slot terbaru permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

slot terbaru

slot terbaru permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

lembagatoto88 permainan paling top dan garansi imbal balik hasil besar bersama lembagatoto88.com

lumbung888 permainan paling top dan garansi imbal balik hasil besar bersama lumbung888.biz

anadototo88 permainan paling top dan garansi imbal balik hasil besar bersama anadototo88.org

mataramtoto88 permainan paling top dan garansi imbal balik hasil besar bersama mataramtoto88.com

mawartoto88 permainan paling top dan garansi imbal balik hasil besar bersama mawartoto88.biz

maxim88 permainan paling top dan garansi imbal balik hasil besar bersama maxim88.org

mpovegas88 permainan paling top dan garansi imbal balik hasil besar bersama mpovegas88.com

nagacc88 permainan paling top dan garansi imbal balik hasil besar bersama nagacc88.com

neng88 permainan paling top dan garansi imbal balik hasil besar bersama neng88.biz

nibung888 permainan paling top dan garansi imbal balik hasil besar bersama nibung888.biz

paristogel88 permainan paling top dan garansi imbal balik hasil besar bersama paristogel88.info

ribut88 permainan paling top dan garansi imbal balik hasil besar bersama ribut88.net

sebat777 permainan paling top dan garansi imbal balik hasil besar bersama sebat777.info

sebat88 permainan paling top dan garansi imbal balik hasil besar bersama sebat88.info

singa88 permainan paling top dan garansi imbal balik hasil besar bersama singa88.biz

texas888 permainan paling top dan garansi imbal balik hasil besar bersama texas888.asia

vertu777 permainan paling top dan garansi imbal balik hasil besar bersama vertu777.org

wks88 permainan paling top dan garansi imbal balik hasil besar bersama wks88.org

wortel88 permainan paling top dan garansi imbal balik hasil besar bersama wortel88.net

yabos888 permainan paling top dan garansi imbal balik hasil besar bersama yabos888.net

yoktogel88 permainan paling top dan garansi imbal balik hasil besar bersama yoktogel88.asia

agam88 permainan paling top dan garansi imbal balik hasil besar bersama agam88.asia

bangkittoto permainan paling top dan garansi imbal balik hasil besar bersama bangkittoto.net

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.com

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.info

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.net

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.org

belanjatoto permainan paling top dan garansi imbal balik hasil besar bersama belanjatoto.org

bisnis88 permainan paling top dan garansi imbal balik hasil besar bersama bisnis88.biz

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.com

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.info

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.net

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.org

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.com

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.info

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.net

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.org

cendanatoto88 permainan paling top dan garansi imbal balik hasil besar bersama cendanatoto88.com

cupang88 permainan paling top dan garansi imbal balik hasil besar bersama cupang88.biz

cupangjp88 permainan paling top dan garansi imbal balik hasil besar bersama cupangjp88.com

danatoto88 permainan paling top dan garansi imbal balik hasil besar bersama danatoto88.biz

danatoto88slot permainan paling top dan garansi imbal balik hasil besar bersama danatoto88slot.net

davo888 permainan paling top dan garansi imbal balik hasil besar bersama davo888.biz

dewasurga888 permainan paling top dan garansi imbal balik hasil besar bersama dewasurga888.biz

dhx88 permainan paling top dan garansi imbal balik hasil besar bersama dhx88.biz

dingdongtogel88 permainan paling top dan garansi imbal balik hasil besar bersama dingdongtogel88.biz

egp888 permainan paling top dan garansi imbal balik hasil besar bersama egp888.biz

eropa88 permainan paling top dan garansi imbal balik hasil besar bersama eropa88.biz

forwin777 permainan paling top dan garansi imbal balik hasil besar bersama forwin777.biz

forwin88 permainan paling top dan garansi imbal balik hasil besar bersama forwin88.net

gacor222 permainan paling top dan garansi imbal balik hasil besar bersama gacor222.biz

galaxy777 permainan paling top dan garansi imbal balik hasil besar bersama galaxy777.asia

garuda88 permainan paling top dan garansi imbal balik hasil besar bersama garuda88.biz

gaul88 permainan paling top dan garansi imbal balik hasil besar bersama gaul88.biz

glowin888 permainan paling top dan garansi imbal balik hasil besar bersama glowin888.biz

gopay88 permainan paling top dan garansi imbal balik hasil besar bersama gopay88.biz

harum88 permainan paling top dan garansi imbal balik hasil besar bersama harum88.biz

harumtoto permainan paling top dan garansi imbal balik hasil besar bersama harumtoto.net

hiu88 permainan paling top dan garansi imbal balik hasil besar bersama hiu88.biz

hiutoto permainan paling top dan garansi imbal balik hasil besar bersama hiutoto.biz

hoki117 permainan paling top dan garansi imbal balik hasil besar bersama hoki117.net

ibetslot88 permainan paling top dan garansi imbal balik hasil besar bersama ibetslot88.biz

idhoki888 permainan paling top dan garansi imbal balik hasil besar bersama idhoki888.com

indosport999 permainan paling top dan garansi imbal balik hasil besar bersama indosport999.net

jackpot10 permainan paling top dan garansi imbal balik hasil besar bersama jackpot10.net

jago77 permainan paling top dan garansi imbal balik hasil besar bersama jago77.biz

jet88 permainan paling top dan garansi imbal balik hasil besar bersama jet88.biz

jinbei88 permainan paling top dan garansi imbal balik hasil besar bersama jinbei88.biz

juliet88 permainan paling top dan garansi imbal balik hasil besar bersama juliet88.org

kakekslot88 permainan paling top dan garansi imbal balik hasil besar bersama kakekslot88.asia

kenzo118 permainan paling top dan garansi imbal balik hasil besar bersama kenzo118.biz

kiw88 permainan paling top dan garansi imbal balik hasil besar bersama kiw88.biz

lazada88 permainan paling top dan garansi imbal balik hasil besar bersama lazada88.biz

mangga2bet88 permainan paling top dan garansi imbal balik hasil besar bersama mangga2bet88.com

mental88 permainan paling top dan garansi imbal balik hasil besar bersama mental88.org

nenektogel88 permainan paling top dan garansi imbal balik hasil besar bersama nenektogel88.com

obc88 permainan paling top dan garansi imbal balik hasil besar bersama obc88.net

parsel88 permainan paling top dan garansi imbal balik hasil besar bersama parsel88.com

pasar88 permainan paling top dan garansi imbal balik hasil besar bersama pasar88.biz

pilar100 permainan paling top dan garansi imbal balik hasil besar bersama pilar100.net

power88 permainan paling top dan garansi imbal balik hasil besar bersama power88.biz

pragmatic7777 permainan paling top dan garansi imbal balik hasil besar bersama pragmatic7777.com

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.com

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.info

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.net

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.org

premantoto88 permainan paling top dan garansi imbal balik hasil besar bersama premantoto88.com

pucuk88 permainan paling top dan garansi imbal balik hasil besar bersama pucuk88.biz

pucuktoto permainan paling top dan garansi imbal balik hasil besar bersama pucuktoto.biz

pusat88 permainan paling top dan garansi imbal balik hasil besar bersama pusat88.biz

raja228 permainan paling top dan garansi imbal balik hasil besar bersama raja228.biz

rajabandot88 permainan paling top dan garansi imbal balik hasil besar bersama rajabandot88.biz

rajapanen88 permainan paling top dan garansi imbal balik hasil besar bersama rajapanen88.net

rogtoto88 permainan paling top dan garansi imbal balik hasil besar bersama rogtoto88.net

sdtoto88 permainan paling top dan garansi imbal balik hasil besar bersama sdtoto88.biz

semangat88 permainan paling top dan garansi imbal balik hasil besar bersama semangat88.biz

sensasi555 permainan paling top dan garansi imbal balik hasil besar bersama sensasi555.net

sensasi88 permainan paling top dan garansi imbal balik hasil besar bersama sensasi88.biz

simenang88slot permainan paling top dan garansi imbal balik hasil besar bersama simenang88slot.com

slotter999 permainan paling top dan garansi imbal balik hasil besar bersama slotter999.net

slottoto88 permainan paling top dan garansi imbal balik hasil besar bersama slottoto88.org

Related posts

Peradaban VII VR: Pengubah permainan untuk penggemar strategi?

admin82361IiJkd

Astro Bot Triumphs: A Night to Remember at the Game Awards

admin82361IiJkd

Qualcomm Snapdragon 8 Elite Gen 2: Kemenangan TSMC dan Perjuangan Samsung

admin82361IiJkd

PANEN96 promo