之前自己写的网络一直放在为知笔记里,现在把它们移到这边来。
MNIST数据集介绍
MNIST数据集是学习模式识别和各大深度学习框架的基础数据库,共含有60000个训练样本和10000个测试样本,60000个训练样本又拆分为55000个训练样本和5000个验证样本,验证样本为每张28×28的灰度图片
MNIST数据集可以在:http://m.cnwest.com/data/html/content/11271894.html获取,它一共包含了四个部分:
1、Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
2、Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
3、Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
4、Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)
解压后如下:
搭建网络过程
Step1
仿照莫烦PYTHON里面的分类问题和批训练两节内容,搭建一个只有一个隐藏层且有100个神经元的神经网络
代码如下:
import torch
import torch.nn.functional as nn
import torch.utils.data as data
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.autograd import Variable
num_epoch = 10
BATCH_SIZE = 100
#MNIST数据集加载
train_dataset = datasets.MNIST(
root= '/home/cxm-irene/mnist',
train= True,
transform= transforms.ToTensor(),
download= False
)
train_loader = data.DataLoader(
dataset= train_dataset,
batch_size= BATCH_SIZE,
shuffle= True
)
test_dataset = datasets.MNIST(
root= '/home/cxm-irene/mnist',
train= False,
transform= transforms.ToTensor(),
download= False
)
#搭建网络
class Net_MNIST(torch.nn.Module):
def __init__(self, n_features, n_hidden, n_output):
super(Net_MNIST, self).__init__()
self.hidden = torch.nn.Linear(n_features, n_hidden)
self.predict = torch.nn.Linear(n_hidden, n_output)
def forward(self, x):
x = nn.relu(self.hidden(x))
x = self.predict(x)
return x
input_size = 28*28
num_class = 10
hidden_layer = 100
#定义网络
net_mnist = Net_MNIST(input_size, hidden_layer, num_class)
print(net_mnist)
#进行优化
optimizer = torch.optim.SGD(net_mnist.parameters(), lr = 0.005)
loss_function = torch.nn.CrossEntropyLoss()
#开始训练
for epoch in range(num_epoch):
print('epoch = %d' % epoch)
for i, (batch_x, batch_y) in enumerate(train_loader):
batch_x = Variable(batch_x.view(-1, 28*28))
batch_y = Variable(batch_y)
optimizer.zero_grad()
x = net_mnist(batch_x)
loss = loss_function(x, batch_y)
loss.backward()
optimizer.step()
if i % 50 == 0:
print('loss = %.5f' % loss.data[0])
prediction = torch.max(x, 1)[1]
pred_y = prediction.data.numpy().squeeze()
target_y = batch_y.data.numpy()
accuracy = float((pred_y == target_y).astype(int).sum()) / float(target_y.size)
print('Accuracy=%.2f' % accuracy)
在step1里面,batch_size设置的是100,然后epoch设置的是10,优化器选择的是SGD,学习率设定的是0.005,
网络结构如下图:
图片是28*28的,中间隐藏层有100个神经元,然后最后输出的是10个分类
训练结果如下(截取了三个)
可以看到的是,loss值整体上是下降的,但是到后期这个趋势就没那么明显了,准确度到最后大概是0.9左右
Step2
两层隐藏层,每层隐藏层都是100个神经元,修改部分如下:
class Net_MNIST(torch.nn