Skip to content

Commit 3e647e7

Browse files
committed
upload fc
1 parent 37a92d0 commit 3e647e7

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ __pycache__
33
.ipynb_checkpoints
44
img
55
data
6+
chapter3_MLP/3_Neural_Network/.desktop
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from torch import nn
2+
3+
4+
class simpleNet(nn.Module):
5+
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
6+
super(simpleNet, self).__init__()
7+
self.layer1 = nn.Linear(in_dim, n_hidden_1)
8+
self.layer2 = nn.Linear(n_hidden_1, n_hidden_2)
9+
self.layer3 = nn.Linear(n_hidden_2, out_dim)
10+
11+
def forward(self, x):
12+
x = self.layer1(x)
13+
x = self.layer2(x)
14+
x = self.layer3(x)
15+
return x
16+
17+
18+
class Activation_Net(nn.Module):
19+
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
20+
super(NeuralNetwork, self).__init__()
21+
self.layer1 = nn.Sequential(
22+
nn.Linear(in_dim, n_hidden_1), nn.ReLU(True))
23+
self.layer2 = nn.Sequential(
24+
nn.Linear(n_hidden_1, n_hidden_2), nn.ReLU(True))
25+
self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim))
26+
27+
def forward(self, x):
28+
x = self.layer1(x)
29+
x = self.layer2(x)
30+
x = self.layer3(x)
31+
return x
32+
33+
34+
class Batch_Net(nn.Module):
35+
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
36+
super(Batch_Net, self).__init__()
37+
self.layer1 = nn.Sequential(
38+
nn.Linear(in_dim, n_hidden_1),
39+
nn.ReLU(True), nn.BatchNorm1d(n_hidden_1))
40+
self.layer2 = nn.Sequential(
41+
nn.Linear(n_hidden_1, n_hidden_2),
42+
nn.ReLU(True), nn.BatchNorm1d(n_hidden_2))
43+
self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim))
44+
45+
def forward(self, x):
46+
x = self.layer1(x)
47+
x = self.layer2(x)
48+
x = self.layer3(x)
49+
return x
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
__author__ = 'SherlockLiao'
2+
3+
import torch
4+
from torch import nn, optim
5+
from torch.autograd import Variable
6+
from torch.utils.data import DataLoader
7+
from torchvision import datasets, transforms
8+
9+
import net
10+
11+
# 超参数(Hyperparameters)
12+
batch_size = 64
13+
learning_rate = 1e-2
14+
num_epoches = 20
15+
16+
# 数据预处理
17+
data_tf = transforms.Compose([
18+
transforms.ToTensor(),
19+
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
20+
])
21+
# 下载训练集 MNIST 手写数字训练集
22+
train_dataset = datasets.MNIST(
23+
root='./data', train=True, transform=data_tf, download=True)
24+
25+
test_dataset = datasets.MNIST(root='./data', train=False, transform=data_tf)
26+
27+
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
28+
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
29+
30+
model = net.Batch_Net(28 * 28, 300, 100, 10)
31+
if torch.cuda.is_available():
32+
model = model.cuda()
33+
34+
criterion = nn.CrossEntropyLoss()
35+
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
36+
37+
for epoch in range(num_epoches):
38+
print('epoch {}'.format(epoch + 1))
39+
print('*' * 10)
40+
running_loss = 0.0
41+
running_acc = 0.0
42+
for i, data in enumerate(train_loader, 1):
43+
img, label = data
44+
img = img.view(img.size(0), -1)
45+
if torch.cuda.is_available():
46+
img = Variable(img).cuda()
47+
label = Variable(label).cuda()
48+
else:
49+
img = Variable(img)
50+
label = Variable(label)
51+
# 向前传播
52+
out = model(img)
53+
loss = criterion(out, label)
54+
running_loss += loss.data[0] * label.size(0)
55+
_, pred = torch.max(out, 1)
56+
num_correct = (pred == label).sum()
57+
running_acc += num_correct.data[0]
58+
# 向后传播
59+
optimizer.zero_grad()
60+
loss.backward()
61+
optimizer.step()
62+
63+
if i % 300 == 0:
64+
print('[{}/{}] Loss: {:.6f}, Acc: {:.6f}'.format(
65+
i,
66+
len(train_loader), running_loss / (batch_size * i), running_acc
67+
/ (batch_size * i)))
68+
print('Finish {} epoch, Loss: {:.6f}, Acc: {:.6f}'.format(
69+
epoch + 1, running_loss / (len(train_dataset)), running_acc / (len(
70+
train_dataset))))
71+
72+
model.eval()
73+
eval_loss = 0
74+
eval_acc = 0
75+
for data in test_loader:
76+
img, label = data
77+
img = img.view(img.size(0), -1)
78+
if torch.cuda.is_available():
79+
img = Variable(img, volatile=True).cuda()
80+
label = Variable(label, volatile=True).cuda()
81+
else:
82+
img = Variabel(img, volatile=True)
83+
label = Variable(label, volatile=True)
84+
out = model(img)
85+
loss = criterion(out, label)
86+
eval_loss += loss.data[0] * label.size(0)
87+
_, pred = torch.max(out, 1)
88+
num_correct = (pred == label).sum()
89+
eval_acc += num_correct.data[0]
90+
print('Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(test_dataset)),
91+
eval_acc / (len(test_dataset))))
92+
print('save model ...')
93+
94+
# 保存模型
95+
torch.save(model.state_dict(), './neural_network.pth')
96+
print('model saved!')

0 commit comments

Comments
 (0)