Step1 消化一下上周的代码,重新加一些东西
参考: PyTorch实现图像分类-CIFAR10数据集_Knight的博客-CSDN博客_pytorch实现cifar10分类
再上周的基础上,增加了1显示图像数据的代码。2评价神经网络的方式(用标签)
1.显示图像的代码:
#定义显示方法:
import numpy as np
import matplotlib.pyplot as plt
def imshow(img):
#输入数据:类型(torch.tensor[c,h,w]:[宽度,高度,颜色图层])
img=img/2+0.5 #反归一处理
npimg=img.numpy()
plt.imshow(np.transpose(npimg,(1,2,0))) #图像进行转置,变为[h,w,c]
plt.show()
#加载图像:
dataiter=iter(trainloader) #随机加载一个mini batch
images,labels=dataiter.next()
#显示图像:
imshow(torchvision.utils.make_grid(images))
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))
定义一个imshow函数来显示图像
代码的执行顺序从加载图像开始:
1.加载一个mini batch,然后执行imshow(),在imshow()中做一个转置(为什么转置:因为要和plt.imshow()的张量顺序对应),再show()就可以输出图片
2.torchvision.utils.make_grid()的作用是,生成一个网格状的图片
3.print(join那些指的是每个类图片之间加个空行以分隔开),range(4)表示出4个标签(在不同的labels[j]类中,共4类)
参考文章:1.Python join()方法 | 菜鸟教程 (runoob.com)
2.(3条消息) np.transpose(npimg, (1, 2, 0)的作用_Escape the bug的博客-CSDN博客
3.(3条消息) Pytorch save_image和make_grid函数详解_qq7835144的博客-CSDN博客
4.pytorch:.cuda() & .cpu() & .data & .numpy() - 简书 (jianshu.com)
6.(3条消息) numpy与Image互转_liuweizj12的博客-CSDN博客_numpy转image
2评价神经网络的方式(用标签)
#用 输出图形的类标签 来评价神经网络:
dataiter = iter(testloader)
images, labels = dataiter.next()
imshow(torchvision.utils.make_grid(images))
print('原始类: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
outputs = net(images)
_, predicted = torch.max(outputs, 1)
print('预测类: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))
这里的语法问题可以参考上一篇文章的参考文章
结果:(直接盗图)
总结代码:
import torch
import torchvision
#transforms 定义了一系列数据转化形式,并对数据进行处理
import torchvision.transforms as transforms
#定义归一化方法:
#transforms.Compose():将多个transforms组合起来使用
transform=transforms.Compose(
[transforms.ToTensor(), #传入数据转化成张量形式
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)) #定义归一化方法
#transforms.Normalize((mean),(std)):用给定的均值和标准差对每个通道数据进行归一化:
#归一方式: (input[channel]-mean[channel])/std[channel]
]
)
#训练数据集: CIFAR10数据集
trainset=torchvision.datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)
#root(string):数据集的根目录在哪里
#train(bool,optional):如果为True,则创建数据集training.pt,否则创建数据集test.pt。
#download(bool,optional):如果为true,则从Internet下载数据集并将其放在根目录中。如果已下载数据集,则不会再次下载。
#transform(callable ,optional):一个函数/转换,它接收PIL图像并返回转换后的版本。
#target_transform(callable ,optional):接收目标并对其进行转换的函数/转换。
trainloader=torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=True,num_workers=0)
#dataset(dataset):输入的数据类型
#batch_size(数据类型 int):每次输入数据的行数,默认为1。
#shuffle(数据类型 bool):洗牌。默认设置为False。在每次迭代训练时是否将数据洗牌,默认设置是False。将输入数据的顺序打乱,是为了使数据更有独立性,
#num_workers(数据类型 Int):工作者数量,默认是0。使用多少个子进程来导入数据。
#测试数据集:
testset=torchvision.datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)
testloader=torch.utils.data.DataLoader(testset,batch_size=4,shuffle=False,num_workers=0)
classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')
#定义显示方法:
import numpy as np
import matplotlib.pyplot as plt
def imshow(img):
#输入数据:类型(torch.tensor[c,h,w]:[宽度,高度,颜色图层])
img=img/2+0.5 #反归一处理
npimg=img.numpy()
plt.imshow(np.transpose(npimg,(1,2,0))) #图像进行转置,变为[h,w,c]
plt.show()
#加载图像:
dataiter=iter(trainloader) #随机加载一个mini batch
images,labels=dataiter.next()
#显示图像:
imshow(torchvision.utils.make_grid(images))
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))
import torch.nn as nn
import torch.nn.functional as F
# 定义Net类,运用nn中的Module模块,Module是继承的父类
class Net(nn.Module):
# 定义神经网络结构 1x32x32
def __init__(self):
# super()调用下一个父类,并返回父类实例的一个方法
super(Net, self).__init__()
# 第一层:卷积层
self.conv1 = nn.Conv2d(3, 6, 3) # 输入频道:1 输出频道:6 3x3卷积核
# 第二层:卷积层 #上一层的输出频道是下一层的输入频道
self.conv2 = nn.Conv2d(6, 16, 3) # 输入频道:6 输出频道:16 3x3卷积核
# 第三层:全连接层 28:32-2-2
self.fc1 = nn.Linear(16 * 28 * 28, 512) # 输入维度:16x28x28 输出维度:512
# 第四层:全连接层
self.fc2 = nn.Linear(512, 64) # 输入维度:512 输出维度:64
# 第五层:全连接层
self.fc3 = nn.Linear(64, 10) # 输入维度:64 输出维度:10
# 定义神经网络数据流向:
def forward(self, x):
# 第一层卷积层:
x = self.conv1(x)
x = F.relu(x) # 激活
# 传递到第二层卷积层:
x = self.conv2(x)
x = F.relu(x) # 激活
# 传递到第三层全连接层:
x = x.view(-1, 16 * 28 * 28) # 改变x的形状
x = self.fc1(x)
x = F.relu(x)
# 传递到第四层全连接层:
x = self.fc2(x)
x = F.relu(x)
# 传递到第五层全连接层:
x = self.fc3(x)
return x
# 打印神经网络:
net = Net()
print(net)
import torch.optim as optim
#计算损失:
#定义损失函数:
criterion=nn.CrossEntropyLoss() #交叉熵损失函数
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)
#实现随机梯度下降 lr(float):学习速率 momentum(float):动量因子
for epoch in range(2):
for i, data in enumerate(trainloader):
images, labels = data # 数据包括图像与标签两部分
outputs = net(images)
loss = criterion(outputs, labels) # 计算损失
# 更新神经网络权重:
optimizer.zero_grad() # 梯度清零
loss.backward() # 本次学习的梯度反向传递
optimizer.step() # 利用本次的梯度更新权值
# 定期输出:
if (i % 1000 == 0):
print("Epoch:%d,Step:%d,Loss:%.3f" % (epoch, i, loss.item()))
print("Finished!")
# 测试模型:
# 用 准确率 来评价神经网络:
correct = 0.0 # 测试数据中正确个数
total = 0.0 # 总共测试数据数量
with torch.no_grad(): # 不需要梯度
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
# 统计正确数量和总共数量
correct += (predicted == labels).sum()
total += labels.size(0)
print('准确率:',float(correct) / total)
#用 输出图形的类标签 来评价神经网络:
dataiter = iter(testloader)
images, labels = dataiter.next()
imshow(torchvision.utils.make_grid(images))
print('原始类: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
outputs = net(images)
_, predicted = torch.max(outputs, 1)
print('预测类: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))
#用 每个类预测准确率 来评价神经网络:
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze()
for i in range(4):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
for i in range(10):
print('%5s的准确率 : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))
Step2 吴恩达第三周的编程作业
这周把吴恩达视频的week3看了一下(神经网络,梯度下降等)
他的课后作业传送门
(建议新手学会张量和矩阵分析的基础知识后,就直接看吴恩达的视频,特别的通俗易懂)
这部分不重点讲了,因为我是从pytorch入手学习的深度学习,代码对我的最大意义是理解程序运行的流程而不是学会写这部分的代码,所以就简单地看了一下(其实思路很好懂,配合着他的课程一步一步来的,思路很容易懂)
Step3 配置实验室的办公电脑、实现自己的电脑与办公电脑的互动、实现iphone与双电脑的互动
1.microsoft to do:可以在登陆微软账号的多设备进行联动(与iphone账户不冲突)(含苹果,安卓设备,在iphone的提醒事项中可以看到,无需下载微软的microsoft to do软件),android手机记得下载微软的microsoft to do软件才能使用
2.微软便签:可以在登陆微软账号的多设备进行联动(含苹果,安卓设备,在iphone的备忘录中可以看到)(与iphone账户不冲突)
3.onedrive:实现登陆微软账号的多设备进行联动(含苹果,安卓设备,与iphone账户不冲突)没有百度网盘一样的限速,免费5G内存(在淘宝花1元钱可以升级到15G内存)
4.将office文件(word的文件,excel的文件等)的保存目录弄到onedrive文件夹下,多个含office的设备(win,mac等)可以一起处理,不用u盘的来回拷贝,一切都在onedrive上备份和传输
以上总体感觉更方便一下苹果用户(只因为可以和iphone原生软件进行联动,无需下载其他软件)
当然onedrive除外,对mac和win都挺方便的
5.微软的就近共享(仅限win),可以和离得近的人传输网页,文件(类比于苹果的隔空投送),免去了u盘的来回拷贝以及手动打浏览器网址(去微信化和qq化的神器!!)
以上基本都是可以用微信和qq传输可以实现的,这里只是给了一个去微信和qq化的方法(即:利用原生的文件传输方法),方便保护隐私嘛