-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathae_me.py
More file actions
100 lines (86 loc) · 3.37 KB
/
Copy pathae_me.py
File metadata and controls
100 lines (86 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.optim as optim
import torch.utils.data
from torch.autograd import Variable
#import datastructre
movies = pd.read_csv('ml-1m/movies.dat', sep='::', header=None,engine='python',encoding='latin-1')
users = pd.read_csv('ml-1m/users.dat', sep='::', header=None,engine='python',encoding='latin-1')
ratings = pd.read_csv('ml-1m/ratings.dat', sep='::', header=None,engine='python',encoding='latin-1')
#preparing data set
training_set = pd.read_csv('ml-100k/u1.base',delimiter = '\t')
training_set = np.array(training_set,dtype='int')
test_set = pd.read_csv('ml-100k/u1.test',delimiter='\t')
test_set = np.array(test_set,dtype='int')
#total number of user and movie
users = int(max(max(training_set[:,0]),max(test_set[:,0])))
nb_movies = int(max(max(training_set[:,1]),max(test_set[:,1])))
#convert the data set to array users as line and movies are columns
def horizontal_list(data):
new_dimension = []
for i in range(1,users+1):
ratings = data[:,2][data[:,0] == i]
movies = data[:,1][data[:,0] == i]
ratings_id = np.zeros(nb_movies)
ratings_id[movies -1] = ratings
new_dimension.append(ratings_id)
return new_dimension
training_set = horizontal_list(training_set)
test_set = horizontal_list(test_set)
#converting the data into Torch tensors
training_set = torch.FloatTensor(training_set)
test_set = torch.FloatTensor(test_set)
#creating architecture of the Neural Network
class SAE(nn.Module):
def __init__(self,):
super(SAE,self).__init__()
self.fc1 = nn.Linear(nb_movies,20)
self.fc2 = nn.Linear(20,10)
self.fc3 = nn.Linear(10,20)
self.fc4 = nn.Linear(20,nb_movies)
self.activation = nn.Sigmoid()
def forward(self,x):
x = self.activation(self.fc1(x))
x = self.activation(self.fc2(x))
x = self.activation(self.fc3(x))
x = self.fc4(x)
return x
sae = SAE()
criterion = nn.MSELoss()
optimizer = optim.RMSprop(sae.parameters(), lr = 0.01, weight_decay = 0.5)
#training ae
nb_epoch = 200
for epoch in range(1, nb_epoch + 1):
train_loss = 0
s = 0.
for id_user in range(users):
input = Variable(training_set[id_user]).unsqueeze(0)
target = input.clone()
if torch.sum(target.data > 0) > 0:
output = sae(input)
target.require_grad = False
output[target == 0] = 0
loss = criterion(output, target)
mean_corrector = nb_movies/float(torch.sum(target.data > 0) + 1e-10)
loss.backward()
train_loss += np.sqrt(loss.data[0]*mean_corrector)
s += 1.
optimizer.step()
print('epoch: '+str(epoch)+' loss: '+str(train_loss/s))
test_loss = 0
s = 0.
for id_user in range(users):
input = Variable(training_set[id_user]).unsqueeze(0)
target = Variable(test_set[id_user])
if torch.sum(target.data > 0) > 0:
output = sae(input)
target.require_grad = False
output[target == 0] = 0
loss = criterion(output,target)
mean_corrector = nb_movies/float(torch.sum(target.data > 0)+ 1e-10)
test_loss += np.sqrt(loss.data[0]*mean_corrector)
s += 1.
print('test loss: '+str(test_loss/s))