import torchvision
用来生成图片,视频数据集,和一些流行的模型类和预训练模型。
import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision # 数据库模块
import matplotlib.pyplot as plt
torch.manual_seed(1)# reproducible
EPOCH = 1 # 训练整批数据多少次, 为了节约时间, 我们只训练一次
BATCH_SIZE = 50 #mini——batch的大小
LR = 0.001 # 学习率
DOWNLOAD_MNIST = True # 如果你已经下载好了mnist数据就写上 False
train_data=torchvision.datasets.MNIST(
root="./mnist/",#存放的地址
train=True,#如果是下载train的数据集就是True,下载test就是false
transform=torchvision.transforms.ToTensor(),#把图像中每个层的0-255压缩到0-1
download=DOWNLOAD_MNIST,#没下载就下载, 下载了就不用再下了
)#从MNIST下载下来的训练集
test_data=torchvision.datasets.MNIST(
root='./mnist/', train=False)#从MNIST下载下来的测试集
#批训练
train_loader=Data.DataLoader(
dataset=train_data,
batch_size=BATCH_SIZE,
shuffle=True
)
test_x=torch.unsqueeze(test_data.test_data,dim=1).type(torch.FloatTensor)[:2000]/255. #这里的test_x需要在变成Tensor32型,/255就是归一化
test_y = test_data.test_labels[:2000]#取前2000个测试集
#
print(train_data.train_data.size()) # (60000, 28, 28)
print(train_data.train_labels.size()) # (60000)
plt.imshow(train_data.train_data[1].numpy(), cmap='gray')
plt.title('%i' % train_data.train_labels[0])
plt.show()
class CNN(nn.Module):
def __init__(self):
super(CNN,self).__init__() #继承module
self.conv1=nn.Sequential(
nn.Conv2d(
in_channels=1, # 输出的图片是黑白的
out_channels=16, # 16个滤波器
kernel_size=5, # filter size
stride=1, # 步长
padding=2, # 两侧补0
), # output shape (16, 28, 28)
nn.ReLU(),
nn.MaxPool2d(kernel_size=2) # 在 2x2 空间里向下采样, output shape (16, 14, 14)
)
self.conv2=nn.Sequential(
nn.Conv2d(16,32,5,1,2),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.out=nn.Linear(32*7*7,10)
def forward(self,x):
x=self.conv1(x)
x=self.conv2(x) #(50,32,7,7)
x=x.view(x.size(0),-1)
# 展平多维的卷积图成 (batch_size, 32 * 7 * 7)
output = self.out(x)
return output
cnn = CNN()
# print(cnn) # net architecture
optimizer=torch.optim.Adam(cnn.parameters(),lr=LR)
loss_func=nn.CrossEntropyLoss()
for eopch in range(EPOCH):
for step,(b_x,b_y) in enumerate(train_loader):
output=cnn(b_x)
loss=loss_func(output,b_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
test_output=cnn(test_x[:10] #为了快速呈现,选测试的前10个图像
pred_y=torch.max(test_output,1)[1].data.numpy().squeeze()
print(pred_y, 'prediction number')
print(test_y[:10].numpy(), 'real number')
padding有same和valid两种方式。valid很简单,如果不够pooling直接丢弃。same的话会把最后不够池化的补0以后在进行最后一次池化
卷积后的边长n_h=(n+2p-f)/s+1(变化后的边长)
————————————————————————————————————————————————我是一名机器学习的初学者,是万千小白中努力学习中的一员