数据来源于吴恩达L2HW3(SIGNS 数据集),训练集包含1800张64*64像素的彩色图片,图片内容为手势,表示从0到5的数字,所要做的是搭建较深的神经网络,以实现图片分类。测试集包含120张图片。

数据集读取:

def load_dataset():%cd '/content/drive/MyDrive/Colab Notebooks/吴恩达L2HW3/dataset'train_dataset = h5py.File('train_signs.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set featurestrain_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labelstest_dataset = h5py.File('test_signs.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set featurestest_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labelsclasses = np.array(test_dataset["list_classes"][:]) # the list of classestrain_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
X_train_orig , Y_train_orig , X_test_orig , Y_test_orig , classes = load_dataset()
index = 12
plt.imshow(X_train_orig[index])
plt.show()
print(X_train_orig.shape)#1080张图片,64*64*3
Y_train_orig.shape

数据预处理 :

train.sign.h5文件包含的是训练集,train_set_x为64*64*3*1800的tensor,1800为样本数,train_set_y为所对应的类别,维度为6*1080,需要首先每一样本数据进行归一化(/255),之后进行flatten才可输入模型,flatten之后的维度为(122280,1800)(X_train)

X_train_flatten=X_train_orig.reshape(X_train_orig.shape[0], -1).T
X_train_flatten.shape#每一列代表一个样本
X_test_flatten = X_test_orig.reshape(X_test_orig.shape[0], -1).T
#归一化
X_train_flatten=X_train_flatten/255
X_test_flatten=X_test_flatten/255

对训练集进行随机划分(Mini-Batch):

def random_mini_batches(X,Y,mini_batch_size,seed):m=X.shape[1]mini_batches=[]np.random.seed(seed)permutation=list(np.random.permutation(m))shuffled_X=X[:,permutation]shuffled_Y=Y[:,permutation]num_complete_minibatches=math.floor(m/mini_batch_size)for k in range(num_complete_minibatches):mini_batch_X=shuffled_X[:,k*mini_batch_size:(k+1)*mini_batch_size]mini_batch_Y=shuffled_Y[:,k*mini_batch_size:(k+1)*mini_batch_size]mini_batch=(mini_batch_X,mini_batch_Y)mini_batches.append(mini_batch)if m % mini_batch_size != 0:mini_batch_X = shuffled_X[:,num_complete_minibatches*mini_batch_size:m]mini_batch_Y = shuffled_Y[:,num_complete_minibatches*mini_batch_size:m]mini_batch = (mini_batch_X,mini_batch_Y)mini_batches.append(mini_batch)return mini_batches

shuffle:如下所示,创建训练集(X,Y)的随机打乱版本。X和Y中的每一列代表一个训练示例。随机打乱是在X和Y之间同步完成的。

Partition:将打乱后的(X,Y)划分为大小为mini_batch_size(此处为32)的小批处理。训练示例的数量并不总是可以被mini_batch_size整除。最后的小批量可能较小。

模型搭建:全连接层-->relu-->全连接层-->relu-->全连接层

class Model(torch.nn.Module):def __init__(self,n_x,h1,h2,n_y):super(Model,self).__init__()self.linear1=torch.nn.Linear(n_x,h1)#(上一层特征数,该层神经元数)self.relu1=torch.nn.ReLU()self.linear2=torch.nn.Linear(h1,h2)self.relu2=torch.nn.ReLU()self.linear3=torch.nn.Linear(h2,n_y)self.model=torch.nn.Sequential(self.linear1,self.relu1,self.linear2,self.relu2,self.linear3)def forward(self,x):return self.model(x)

训练数据输入模型:

m=Model(X_train_flatten.shape[0],25,12,6)#隐藏层神经元数为25,12,6最后一层输出对应类别的概率
num = torch.cuda.device_count()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
X_train_flatten = torch.from_numpy(X_train_flatten).to(torch.float32).to(device)
Y_train = torch.from_numpy(Y_train_orig).to(torch.float32).to(device)
X_test_flatten = torch.from_numpy(X_test_flatten).to(torch.float32).to(device)
Y_test = torch.from_numpy(Y_test_orig).to(torch.float32).to(device)

模型参数的设定:

m.to(device)
epoch_num = 2000
learning_rate = 0.0001
minibatch_size = 32
seed = 3
costs = []
optimizer = torch.optim.Adam(m.model.parameters(), lr=learning_rate)
loss_func = torch.nn.CrossEntropyLoss()

模型训练:

for epoch in range(epoch_num):num_minibatches = int(X_train_flatten.shape[1] / minibatch_size)minibatches = random_mini_batches(X_train_flatten, Y_train, minibatch_size, seed)epoch_cost = 0for minibatch in minibatches:(minibatch_X, minibatch_Y) = minibatchy_pred = m.forward(minibatch_X.T)y = minibatch_Y.Ty = y.view(-1)loss = loss_func(y_pred, y.long())epoch_cost = epoch_cost + loss.item()#在pytorch里用item取出这个唯一的元素optimizer.zero_grad()loss.backward()optimizer.step()epoch_cost = epoch_cost / (num_minibatches + 1)if epoch % 5 == 0:costs.append(epoch_cost)# 是否打印:if epoch % 100 == 0:print("epoch = " + str(epoch) + "    epoch_cost = " + str(epoch_cost))

这里需要注意:计算损失时,我们需要将预测标签值y_pred和实际标签值y传入损失函数中,y_pred的维度为(n,6),而y的维度为(n),交叉熵函数(pytorch)会在内部将y转换为one-hot形式,y的维度会变成(n,6)。而在tensorflow框架中,损失函数不会帮我们完成one-hot的转换,我们要自己完成。

epoch = 0    epoch_cost = 1.7447822058902067
epoch = 100    epoch_cost = 1.0144566087161793
epoch = 200    epoch_cost = 0.8499525382238275
epoch = 300    epoch_cost = 0.7405223215327543
epoch = 400    epoch_cost = 0.6508408206350663
epoch = 500    epoch_cost = 0.5719360849436592
epoch = 600    epoch_cost = 0.5000492202885011
epoch = 700    epoch_cost = 0.4312421894248794
epoch = 800    epoch_cost = 0.36556195949806886
epoch = 900    epoch_cost = 0.3063356779954013
epoch = 1000    epoch_cost = 0.25039714048890505
epoch = 1100    epoch_cost = 0.19280040614745197
epoch = 1200    epoch_cost = 0.14023028938647578
epoch = 1300    epoch_cost = 0.10207015522481765
epoch = 1400    epoch_cost = 0.11564182287410778
epoch = 1500    epoch_cost = 0.09902713168412447
epoch = 1600    epoch_cost = 0.06645032955224023
epoch = 1700    epoch_cost = 0.045455615638810044
epoch = 1800    epoch_cost = 0.07567436467198764
epoch = 1900    epoch_cost = 0.02966493705068441
#模型保存:
torch.save(m,'/content/drive/MyDrive/Colab Notebooks/吴恩达L2HW3/图片数字分辨.pth')

测试集上的表现:

y_test_pred=m.forward(X_test_flatten.T)
y = Y_test.T
y = y.view(-1)
loss = loss_func(y_test_pred, y.long())
y_model_pred=[]
for i in range(X_test_flatten.shape[1]):y_model_pred.append(torch.argmax(y_test_pred[i],dim=0).item())
for index in range(X_test_flatten.shape[1]):plt.imshow(X_test_orig[index])plt.show()print(y_model_pred[index])

0

0

0

0

2

搭建神经网络实现简单图片分类相关推荐

  1. 基于PaddlePaddle构建ResNet18残差神经网络的食物图片分类问题

    基于PaddlePaddle构建ResNet18残差神经网络的食物图片分类问题 Introduction 本项目是在李宏毅机器学习课程的作业3进行的工作,任务是手动搭建一个CNN模型进行食物图片分类( ...

  2. 基于pytorch的简单图片分类问题实现

    pytorch中基于简单图片分类问题的实现大致可以分为以下几个步骤: 1.建立处理图片的神经网络,提前设置好损失函数(图片分类问题一般使用交叉熵损失函数),以及优化器. 2.在每一个学习的步骤中,将训 ...

  3. 基于卷积神经网络CNN的图片分类实现——附代码

    目录 摘要: 1.卷积神经网络介绍: 2.卷积神经网络(CNN)构建与训练: 2.1 CNN的输入图像 2.2 构建CNN网络 2.3 训练CNN网络 3.卷积神经网络(CNN)的实际分类测试: 4. ...

  4. 搭建简单图片分类的卷积神经网络(一)-- 训练模型的图片数据预处理

    一.训练之前数据的预处理主要包括两个方面 1.将图片数据统一格式,以标签来命名并存到train文件夹中(假设原始图片按类别存到文件夹中). 2.对命名好的图片进行训练集和测试集的划分以及图片数据化. ...

  5. PyTorch入门-简单图片分类

    一. CNN图像分类 PyTorch Version: 1.0.0 import torch import torch.nn as nn import torch.nn.functional as F ...

  6. 【深度学习】利用tensorflow2.0卷积神经网络进行卫星图片分类实例操作详解

    本文的应用场景是对于卫星图片数据的分类,图片总共1400张,分为airplane和lake两类,也就是一个二分类的问题,所有的图片已经分别放置在2_class文件夹下的两个子文件夹中.下面将从这个实例 ...

  7. 神经网络python实例分类_Python使用神经网络进行简单文本分类

    原文链接:http://tecdat.cn/?p=8613​tecdat.cn 深度学习无处不在.在本文中,我们将使用Keras进行文本分类. 准备数据集 出于演示目的,我们将使用 20个新闻组 数据 ...

  8. 用BP神经网络解决简单的分类问题

    有关于BP神经网络原理前人之述备矣,这里就暂且略过.从一年前第一次接触机器学习到现在,已经学习很多类似的智能学习算法,无论是遗传算法.群算法.模拟退火算法还是神经网络算法,在有监督的学习算法中,无非就 ...

  9. PyTorch搭建简单神经网络实现回归和分类

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 安装 PyTorch 会安装两个模块,一个是torch,一个 torchvision, tor ...

最新文章

  1. oracle datetime
  2. 通用联手谷歌,应用程序和语音助手将整合到车辆中
  3. property、staticmethod、classmethod与__str__的用法
  4. 时间和空间复杂度概述【Java _demo版】
  5. POJ - 1584 A Round Peg in a Ground Hole(综合几何)
  6. ApplicationInsights的探测器尝鲜
  7. 求4个数字组成的不重复三位数,Python简洁解法
  8. 重磅!Python又第一了!网友:为什么找不到好工作?真相让人脸红…
  9. mysql 端口 telnet 不通_3306端口不通,不一定是网络的问题
  10. Python实现倒计时按钮
  11. 花书+吴恩达深度学习(九)优化方法之二阶近似方法(牛顿法, CG, BFGS, L-BFGS)
  12. 三元一次方程组步骤_人教版数学七年级下册8.4三元一次方程组的解法精讲
  13. mysql 数据导入导出说明
  14. Java加密的几种方式
  15. 女生转行学习IT技术需要考虑什么
  16. Proxmox VE桌面虚拟化
  17. 搭载网站的云服务器需要空间备案,网站空间要备案吗
  18. 主流浏览器发展史及其内核初探
  19. http://nxlhero.blog.51cto.com/962631/1666250?plg_nld=1plg_uin=1plg_auth=1plg_nld=1plg_usr=1plg_...
  20. nssm将 netCore项目注册成服务。

热门文章

  1. 15. 三数之和LeetCode
  2. Tkinter 插入就JPG格式图片
  3. Springboot+疫苗预约网站 毕业设计-附源码190950
  4. java多线程并发及线程池
  5. oracle外键--详解
  6. linux hexdump显示格式c数组,linux hexdump使用
  7. CentOS配置Nginx SSL
  8. 大数据电信号分析项目
  9. JMeter实用教程【二】-BeanShell的使用
  10. 耗子叔ARTS:第十四周