diff --git a/main.py b/main.py old mode 100755 new mode 100644 diff --git a/model.py b/model.py index ce0158b..db6586f 100644 --- a/model.py +++ b/model.py @@ -18,41 +18,24 @@ def __init__(self, args): Ks = args.kernel_sizes self.embed = nn.Embedding(V, D) - # self.convs1 = [nn.Conv2d(Ci, Co, (K, D)) for K in Ks] - self.convs1 = nn.ModuleList([nn.Conv2d(Ci, Co, (K, D)) for K in Ks]) - ''' - self.conv13 = nn.Conv2d(Ci, Co, (3, D)) - self.conv14 = nn.Conv2d(Ci, Co, (4, D)) - self.conv15 = nn.Conv2d(Ci, Co, (5, D)) - ''' + self.convs = nn.ModuleList([nn.Conv2d(Ci, Co, (K, D)) for K in Ks]) self.dropout = nn.Dropout(args.dropout) - self.fc1 = nn.Linear(len(Ks)*Co, C) + self.fc1 = nn.Linear(len(Ks) * Co, C) - def conv_and_pool(self, x, conv): - x = F.relu(conv(x)).squeeze(3) # (N, Co, W) - x = F.max_pool1d(x, x.size(2)).squeeze(2) - return x + if self.args.static: + self.embed.weight.requires_grad = False def forward(self, x): x = self.embed(x) # (N, W, D) - - if self.args.static: - x = Variable(x) - + x = x.unsqueeze(1) # (N, Ci, W, D) - x = [F.relu(conv(x)).squeeze(3) for conv in self.convs1] # [(N, Co, W), ...]*len(Ks) + x = [F.relu(conv(x)).squeeze(3) for conv in self.convs] # [(N, Co, W), ...]*len(Ks) x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x] # [(N, Co), ...]*len(Ks) x = torch.cat(x, 1) - ''' - x1 = self.conv_and_pool(x,self.conv13) #(N,Co) - x2 = self.conv_and_pool(x,self.conv14) #(N,Co) - x3 = self.conv_and_pool(x,self.conv15) #(N,Co) - x = torch.cat((x1, x2, x3), 1) # (N,len(Ks)*Co) - ''' x = self.dropout(x) # (N, len(Ks)*Co) logit = self.fc1(x) # (N, C) return logit diff --git a/mydatasets.py b/mydatasets.py index 8fddfce..26fae46 100644 --- a/mydatasets.py +++ b/mydatasets.py @@ -26,14 +26,33 @@ def download_or_unzip(cls, root): urllib.request.urlretrieve(cls.url, tpath) with tarfile.open(tpath, 'r') as tfile: print('extracting') - tfile.extractall(root) + def is_within_directory(directory, target): + + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + + return prefix == abs_directory + + def safe_extract(tar, path=".", members=None, *, numeric_owner=False): + + for member in tar.getmembers(): + member_path = os.path.join(path, member.name) + if not is_within_directory(path, member_path): + raise Exception("Attempted Path Traversal in Tar File") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(tfile, root) return os.path.join(path, '') class MR(TarDataset): url = 'https://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz' - filename = 'rt-polaritydata.tar' + filename = 'rt-polaritydata.tar.gz' dirname = 'rt-polaritydata' @staticmethod @@ -71,7 +90,7 @@ def clean_str(string): string = re.sub(r"\s{2,}", " ", string) return string.strip() - text_field.preprocessing = data.Pipeline(clean_str) + text_field.tokenize = lambda x: clean_str(x).split() fields = [('text', text_field), ('label', label_field)] if examples is None: diff --git a/train.py b/train.py index 7f90aaa..9e29b33 100644 --- a/train.py +++ b/train.py @@ -14,19 +14,16 @@ def train(train_iter, dev_iter, model, args): steps = 0 best_acc = 0 last_step = 0 - model.train() for epoch in range(1, args.epochs+1): for batch in train_iter: + model.train() feature, target = batch.text, batch.label - feature.data.t_(), target.data.sub_(1) # batch first, index align + feature.t_(), target.sub_(1) # batch first, index align if args.cuda: feature, target = feature.cuda(), target.cuda() optimizer.zero_grad() logit = model(feature) - - #print('logit vector', logit.size()) - #print('target vector', target.size()) loss = F.cross_entropy(logit, target) loss.backward() optimizer.step() @@ -37,9 +34,9 @@ def train(train_iter, dev_iter, model, args): accuracy = 100.0 * corrects/batch.batch_size sys.stdout.write( '\rBatch[{}] - loss: {:.6f} acc: {:.4f}%({}/{})'.format(steps, - loss.data[0], - accuracy, - corrects, + loss.item(), + accuracy.item(), + corrects.item(), batch.batch_size)) if steps % args.test_interval == 0: dev_acc = eval(dev_iter, model, args) @@ -60,14 +57,14 @@ def eval(data_iter, model, args): corrects, avg_loss = 0, 0 for batch in data_iter: feature, target = batch.text, batch.label - feature.data.t_(), target.data.sub_(1) # batch first, index align + feature.t_(), target.sub_(1) # batch first, index align if args.cuda: feature, target = feature.cuda(), target.cuda() logit = model(feature) loss = F.cross_entropy(logit, target, size_average=False) - avg_loss += loss.data[0] + avg_loss += loss.item() corrects += (torch.max(logit, 1) [1].view(target.size()).data == target.data).sum() @@ -94,8 +91,7 @@ def predict(text, model, text_field, label_feild, cuda_flag): print(x) output = model(x) _, predicted = torch.max(output, 1) - #return label_feild.vocab.itos[predicted.data[0][0]+1] - return label_feild.vocab.itos[predicted.data[0]+1] + return label_feild.vocab.itos[predicted.item()+1] def save(model, save_dir, save_prefix, steps):