```import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.optim as optim
import torch.nn.functional as F
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
#%matplotlib inline
image_size=28
num_classes=10
num_epochs=20
batch_size=64
train_dataset=dsets.MNIST(root='./data',
train=True,
transform=transforms.ToTensor(),
download=True)
test_dataset=dsets.MNIST(root='./data',
train=False,
transform=transforms.ToTensor())
train_loader=torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)
indices=range(len(test_dataset))
indices_val=indices[:5000]
indices_test=indices[5000:]
sampler_val=torch.utils.data.sampler.SubsetRandomSampler(indices_val)
sampler_test=torch.utils.data.sampler.SubsetRandomSampler(indices_test)
validation_loader=torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False,
sampler=sampler_val
)
test_loader=torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False,
sampler=sampler_test
)
idx=110 #随机选取的
muteimg=train_dataset[idx][0].numpy()
plt.imshow(muteimg[0,...])
plt.show()
print('标签是:',train_dataset[idx][1])
depth=[4,8]
class ConvNet(nn.Module):
def init(self):
super(ConvNet,self).__init__()
self.conv1=nn.Conv2d(1,4,5,padding=2)
self.pool=nn.MaxPool2d(2,2)
self.conv2=nn.Conv2d(depth[0],depth[1],5,padding=2)
self.fc1=nn.Linear(image_size//4*image_size//4*depth[1],512)
self.fc2=nn.Linear(512,num_classes)
def forward(self, x):
x=self.conv1(x)
x=F.relu(x)
x=self.pool(x)
x=self.conv2(x)
x=F.relu(x)
x=self.pool(x)
x=x.view(-1,image_size//4*image_size//4*depth[1])
x=F.relu(self.fc1(x))
x=F.dropout(x,training=self.training)
x=self.fc2(x)
x=F.log_softmax(x,dim=1)
return x
def retrieve_features(self,x):
feature_map1=F.relu(self.conv1(x))
x=self.pool(feature_map1)
feature_map2=F.relu(self.conv2(x))
return (feature_map1,feature_map2)
net=ConvNet()
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)
record=[]
weights=[]
for epoch in range(num_epochs):
train_rights=[]
for batch_idx,(data,target) in enumerate (train_loader):
data,target=Variable(data),Variable(target)
net.train()
output=net(data)
loss=criterion(output,target)
optimizer.zero_grad()
optimizer.step()
right=rightness(output,target)
train_rights.append(right)
if batch_idx % 100 ==0:
net.eval()
val_rights=[]
for(data,target) in validation_loader:
data,target=Variable(data),Variable(target)
output=net(data)
right=rightness(output,target)
val_rights.append(right)
train_r=(sum([tup[o] for tup in train_rights]),sum([tup[1] for tup in train_rights]))
val_r=(sum([tup[0] for tup in val_rights]),sum([tup[1] for tup in val_rights]))
record.append((100 - 100.*train_r[0]/train_r[1],100-100.*val_r[0]/val_r[1]))
weights.append([net.conv1.weight.data.clone(),net.conv1.bias.data.clone(),
net.conv2.weight.data.clone(),net.conv2.bias.data.clone()])
net.eval()
vals=[]
for dara,target in test_loader:
data,targrt=Variable(data,volatile=True),Variable(target)
output = net(data)
val=rightness(output,target)
vals.append(val)
rights=(sum([tup[0] for tup in vals]),sum([tup[1] for tup in vals]))
rights_rate=1.0*rights[0]/rights[1]
right_rate
plt.figure(figsize=(10,7))
plt.plot(record)
plt.xlabel('Steps')
plt.ylabel('Error rate')
```pytorch 中 写入class ConvNet(nn.Module): 语句之后 出现错误NameError: name 'ConvNet' is not defined 这是怎么回事