96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
|  | import os | ||
|  | import numpy as np | ||
|  | from sklearn.linear_model import LogisticRegression | ||
|  | import torch | ||
|  | import torchvision.datasets | ||
|  | import torchvision.models | ||
|  | import torchvision.transforms | ||
|  | 
 | ||
|  | from rbm import RBM | ||
|  | 
 | ||
|  | 
 | ||
|  | ########## CONFIGURATION ########## | ||
|  | BATCH_SIZE = 64 | ||
|  | VISIBLE_UNITS = 784  # 28 x 28 images | ||
|  | HIDDEN_UNITS = 128 | ||
|  | CD_K = 2 | ||
|  | EPOCHS = 100 | ||
|  | 
 | ||
|  | DATA_FOLDER = os.path.split(os.path.realpath(__file__))[0]+'/../Dataset/' | ||
|  | print("Dataset Path :" + DATA_FOLDER) | ||
|  | 
 | ||
|  | CUDA = torch.cuda.is_available() | ||
|  | CUDA_DEVICE = 0 | ||
|  | 
 | ||
|  | if CUDA: | ||
|  |     torch.cuda.set_device(CUDA_DEVICE) | ||
|  | 
 | ||
|  | 
 | ||
|  | ########## LOADING DATASET ########## | ||
|  | print('Loading dataset...') | ||
|  | 
 | ||
|  | train_dataset = torchvision.datasets.MNIST(root=DATA_FOLDER, train=True, transform=torchvision.transforms.ToTensor(), download=True) | ||
|  | train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=BATCH_SIZE) | ||
|  | 
 | ||
|  | test_dataset = torchvision.datasets.MNIST(root=DATA_FOLDER, train=False, transform=torchvision.transforms.ToTensor(), download=True) | ||
|  | test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=BATCH_SIZE) | ||
|  | 
 | ||
|  | 
 | ||
|  | ########## TRAINING RBM ########## | ||
|  | print('Training RBM...') | ||
|  | 
 | ||
|  | rbm = RBM(VISIBLE_UNITS, HIDDEN_UNITS, CD_K, use_cuda=CUDA) | ||
|  | 
 | ||
|  | for epoch in range(EPOCHS): | ||
|  |     epoch_error = 0.0 | ||
|  | 
 | ||
|  |     for batch, _ in train_loader: | ||
|  |         batch = batch.view(len(batch), VISIBLE_UNITS)  # flatten input data | ||
|  | 
 | ||
|  |         if CUDA: | ||
|  |             batch = batch.cuda() | ||
|  | 
 | ||
|  |         batch_error = rbm.contrastive_divergence(batch) | ||
|  | 
 | ||
|  |         epoch_error += batch_error | ||
|  | 
 | ||
|  |     print('Epoch Error (epoch=%d): %.4f' % (epoch, epoch_error)) | ||
|  | 
 | ||
|  | 
 | ||
|  | ########## EXTRACT FEATURES ########## | ||
|  | print('Extracting features...') | ||
|  | 
 | ||
|  | train_features = np.zeros((len(train_dataset), HIDDEN_UNITS)) | ||
|  | train_labels = np.zeros(len(train_dataset)) | ||
|  | test_features = np.zeros((len(test_dataset), HIDDEN_UNITS)) | ||
|  | test_labels = np.zeros(len(test_dataset)) | ||
|  | 
 | ||
|  | for i, (batch, labels) in enumerate(train_loader): | ||
|  |     batch = batch.view(len(batch), VISIBLE_UNITS)  # flatten input data | ||
|  | 
 | ||
|  |     if CUDA: | ||
|  |         batch = batch.cuda() | ||
|  | 
 | ||
|  |     train_features[i*BATCH_SIZE:i*BATCH_SIZE+len(batch)] = rbm.sample_hidden(batch).cpu().numpy() | ||
|  |     train_labels[i*BATCH_SIZE:i*BATCH_SIZE+len(batch)] = labels.numpy() | ||
|  | 
 | ||
|  | for i, (batch, labels) in enumerate(test_loader): | ||
|  |     batch = batch.view(len(batch), VISIBLE_UNITS)  # flatten input data | ||
|  | 
 | ||
|  |     if CUDA: | ||
|  |         batch = batch.cuda() | ||
|  | 
 | ||
|  |     test_features[i*BATCH_SIZE:i*BATCH_SIZE+len(batch)] = rbm.sample_hidden(batch).cpu().numpy() | ||
|  |     test_labels[i*BATCH_SIZE:i*BATCH_SIZE+len(batch)] = labels.numpy() | ||
|  | 
 | ||
|  | 
 | ||
|  | ########## CLASSIFICATION ########## | ||
|  | print('Classifying...') | ||
|  | 
 | ||
|  | clf = LogisticRegression() | ||
|  | clf.fit(train_features, train_labels) | ||
|  | predictions = clf.predict(test_features) | ||
|  | 
 | ||
|  | print('Result: %d/%d' % (sum(predictions == test_labels), test_labels.shape[0])) | ||
|  | 
 |