您的位置:首页 > 理论基础 > 计算机网络

神经网络的pytorch实现-基于MNIST数据集

2018-01-07 20:10 483 查看

简单的全连接神经网络,包含一个输入层,一个隐藏层,一个输出层

首先利用torchvision来加载数据集

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable

# hyper parameter
input_size = 28 * 28 # image size of MNIST data
num_classes = 10
num_epochs = 10
batch_size = 100
learning_rate = 1e-3

# MNIST dataset
train_dataset = dsets.MNIST(root = '../../data_sets/mnist', #选择数据的根目录
train = True, # 选择训练集
transform = transforms.ToTensor(), #转换成tensor变量
download = False) # 不从网络上download图片
test_dataset = dsets.MNIST(root = '../../data_sets/mnist', #选择数据的根目录
train = False, # 选择训练集
transform = transforms.ToTensor(), #转换成tensor变量
download = False) # 不从网络上download图片
#加载数据

train_loader = torch.utils.data.DataLoader(dataset = train_dataset,
batch_size = batch_size,
shuffle = True)  # 将数据打乱
test_loader = torch.utils.data.DataLoader(dataset = test_dataset,
batch_size = batch_size,
shuffle = True)


建立模型

#input_size = 2
hidden_size = 100
#num_classes = 3

# 创建神经网络模型
class neural_net(nn.Module):
def __init__(self, input_num,hidden_size, out_put):
super(neural_net, self).__init__()
self.fc1 = nn.Linear(input_num, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, out_put)

def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out

model = neural_net(input_size, hidden_size, num_classes)
print(model)


输出结果:

neural_net (
(fc1): Linear (784 -> 100)
(relu): ReLU ()
(fc2): Linear (100 -> 10)
)


优化

# optimization
learning_rate = 1e-3
num_epoches = 5
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)

for epoch in range(num_epoches):

#inputs = Variable(torch.from_numpy(train_x))
#targets = Variable(torch.from_numpy(train_y))

#print(inputs)
#print(targets)

#optimizer.zero_grad()
#outputs = model(inputs)
#loss = criterion(outputs, targets)
#loss.backward()
#optimizer.step()

#print('current loss = %.5f' % loss.data[0])
print('current epoch = %d' % epoch)
for i, (images, labels) in enumerate(train_loader): #利用enumerate取出一个可迭代对象的内容
images = Variable(images.view(-1, 28 * 28))
labels = Variable(labels)

optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()

if i % 100 == 0:
print('current loss = %.5f' % loss.data[0])


几步的优化之后结果就比logistic regression的效果好了,

如果如下:

current epoch = 0
current loss = 2.31471
current loss = 0.37235
current loss = 0.44407
current loss = 0.29467
current loss = 0.32532
current loss = 0.15531
current epoch = 1
current loss = 0.23495
current loss = 0.18591
current loss = 0.19729
current loss = 0.24272
current loss = 0.22655
current loss = 0.21057
current epoch = 2
current loss = 0.19062
current loss = 0.07879
current loss = 0.17636
current loss = 0.08401
current loss = 0.08000
current loss = 0.18595
current epoch = 3
current loss = 0.12932
current loss = 0.13962
current loss = 0.06450
current loss = 0.11173
current loss = 0.14006
current loss = 0.10523
current epoch = 4
current loss = 0.03298
current loss = 0.07106
current loss = 0.04047
current loss = 0.13380
current loss = 0.09479
current loss = 0.05664


尝试下预测:

# 做 prediction
total = 0
correct = 0

for images, labels in test_loader:

images = Variable(images.view(-1, 28 * 28))
outputs = model(images)

_, predicts = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicts == labels).sum()

print('Accuracy = %.2f' % (100 * correct / total))


Accuracy = 97.05


结果还可以,没有做regulization,主要是电脑太慢了,如果epoch跑长点有可能会更好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习