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 perhatikan perkalian titik antara 2 yang dinormalisasi Dan vektor (yaitu kesamaan kosinus).
Maka fungsi kerugian untuk pasangan positif contoh (i,j) didefinisikan sebagai:
Di mana adalah fungsi indikator yang mengevaluasi ke 1 iff . Untuk info lebih lanjut tentang itu, periksa bagaimana kita akan mengindeks matriks kesamaan untuk mendapatkan sisi positif dan negatifnya.
menunjukkan parameter suhu. Kerugian akhir dihitung dengan menjumlahkan semua pasangan positif dan membaginya
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 . Kemudian, hitung kesamaan/logit semua pasangan. Hal ini dapat dilakukan dengan perkalian matriks sebagai berikut. Bentuk keluarannya sama dengan
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 dengan tepat.
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 pasangan positif. Contoh lain untuk (6,6) matriks (batch_size=3,views=2) adalah memiliki topeng yang terlihat persis seperti ini:
(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:
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 langkah-langkah dan kemudian memperbarui model, alih-alih memperbarui setelah setiap gerakan maju-mundur.
Jadi, sekarang sudah masuk akal bahwa kelompok yang efektif adalah: . Ini sangat mudah dilakukan di PyTorch Lightning menggunakan fungsi panggilan balik.
“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!
* 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