1 Star 1 Fork 0

张浩ZHao/LSTM-Classification-pytorch

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
main.py 5.50 KB
一键复制 编辑 原始数据 按行查看 历史
蒋庆远 提交于 2017-08-02 17:37 . first commit
import os
import torch
import copy
from torch.utils.data import DataLoader
import utils.DataProcessing as DP
import utils.LSTMClassifier as LSTMC
import torch.optim as optim
import torch.nn as nn
from torch.autograd import Variable
use_plot = True
use_save = True
if use_save:
import pickle
from datetime import datetime
DATA_DIR = 'data'
TRAIN_DIR = 'train_txt'
TEST_DIR = 'test_txt'
TRAIN_FILE = 'train_txt.txt'
TEST_FILE = 'test_txt.txt'
TRAIN_LABEL = 'train_label.txt'
TEST_LABEL = 'test_label.txt'
## parameter setting
epochs = 50
batch_size = 5
use_gpu = torch.cuda.is_available()
learning_rate = 0.01
def adjust_learning_rate(optimizer, epoch):
lr = learning_rate * (0.1 ** (epoch // 10))
for param_group in optimizer.param_groups:
param_group['lr'] = lr
return optimizer
if __name__=='__main__':
### parameter setting
embedding_dim = 100
hidden_dim = 50
sentence_len = 32
train_file = os.path.join(DATA_DIR, TRAIN_FILE)
test_file = os.path.join(DATA_DIR, TEST_FILE)
fp_train = open(train_file, 'r')
train_filenames = [os.path.join(TRAIN_DIR, line.strip()) for line in fp_train]
filenames = copy.deepcopy(train_filenames)
fp_train.close()
fp_test = open(test_file, 'r')
test_filenames = [os.path.join(TEST_DIR, line.strip()) for line in fp_test]
fp_test.close()
filenames.extend(test_filenames)
corpus = DP.Corpus(DATA_DIR, filenames)
nlabel = 8
### create model
model = LSTMC.LSTMClassifier(embedding_dim=embedding_dim,hidden_dim=hidden_dim,
vocab_size=len(corpus.dictionary),label_size=nlabel, batch_size=batch_size, use_gpu=use_gpu)
if use_gpu:
model = model.cuda()
### data processing
dtrain_set = DP.TxtDatasetProcessing(DATA_DIR, TRAIN_DIR, TRAIN_FILE, TRAIN_LABEL, sentence_len, corpus)
train_loader = DataLoader(dtrain_set,
batch_size=batch_size,
shuffle=True,
num_workers=4
)
dtest_set = DP.TxtDatasetProcessing(DATA_DIR, TEST_DIR, TEST_FILE, TEST_LABEL, sentence_len, corpus)
test_loader = DataLoader(dtest_set,
batch_size=batch_size,
shuffle=False,
num_workers=4
)
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
loss_function = nn.CrossEntropyLoss()
train_loss_ = []
test_loss_ = []
train_acc_ = []
test_acc_ = []
### training procedure
for epoch in range(epochs):
optimizer = adjust_learning_rate(optimizer, epoch)
## training epoch
total_acc = 0.0
total_loss = 0.0
total = 0.0
for iter, traindata in enumerate(train_loader):
train_inputs, train_labels = traindata
train_labels = torch.squeeze(train_labels)
if use_gpu:
train_inputs, train_labels = Variable(train_inputs.cuda()), train_labels.cuda()
else: train_inputs = Variable(train_inputs)
model.zero_grad()
model.batch_size = len(train_labels)
model.hidden = model.init_hidden()
output = model(train_inputs.t())
loss = loss_function(output, Variable(train_labels))
loss.backward()
optimizer.step()
# calc training acc
_, predicted = torch.max(output.data, 1)
total_acc += (predicted == train_labels).sum()
total += len(train_labels)
total_loss += loss.data[0]
train_loss_.append(total_loss / total)
train_acc_.append(total_acc / total)
## testing epoch
total_acc = 0.0
total_loss = 0.0
total = 0.0
for iter, testdata in enumerate(test_loader):
test_inputs, test_labels = testdata
test_labels = torch.squeeze(test_labels)
if use_gpu:
test_inputs, test_labels = Variable(test_inputs.cuda()), test_labels.cuda()
else: test_inputs = Variable(test_inputs)
model.batch_size = len(test_labels)
model.hidden = model.init_hidden()
output = model(test_inputs.t())
loss = loss_function(output, Variable(test_labels))
# calc testing acc
_, predicted = torch.max(output.data, 1)
total_acc += (predicted == test_labels).sum()
total += len(test_labels)
total_loss += loss.data[0]
test_loss_.append(total_loss / total)
test_acc_.append(total_acc / total)
print('[Epoch: %3d/%3d] Training Loss: %.3f, Testing Loss: %.3f, Training Acc: %.3f, Testing Acc: %.3f'
% (epoch, epochs, train_loss_[epoch], test_loss_[epoch], train_acc_[epoch], test_acc_[epoch]))
param = {}
param['lr'] = learning_rate
param['batch size'] = batch_size
param['embedding dim'] = embedding_dim
param['hidden dim'] = hidden_dim
param['sentence len'] = sentence_len
result = {}
result['train loss'] = train_loss_
result['test loss'] = test_loss_
result['train acc'] = train_acc_
result['test acc'] = test_acc_
result['param'] = param
if use_plot:
import PlotFigure as PF
PF.PlotFigure(result, use_save)
if use_save:
filename = 'log/LSTM_classifier_' + datetime.now().strftime("%d-%h-%m-%s") + '.pkl'
result['filename'] = filename
fp = open(filename, 'wb')
pickle.dump(result, fp)
fp.close()
print('File %s is saved.' % filename)
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhang_hao_zhao/LSTM-Classification-pytorch.git
git@gitee.com:zhang_hao_zhao/LSTM-Classification-pytorch.git
zhang_hao_zhao
LSTM-Classification-pytorch
LSTM-Classification-pytorch
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385