pytorch深度学习入门与实战——今天我们来对一张图像进行卷积、池化,以及激活层的使用展示

import numpy as np
import torch
import  torch.nn as nn
import matplotlib.pyplot as plt
from PIL import Image
#######################读取图像->转换为灰度图片->转换为Numpy数组########################
myim = Image.open(r'G:\code\data\chap2\1.jpg')#读取图片
myimgray = np.array(myim.convert("L"), dtype=np.float32)#使用convert方法转化为灰度图
#############################可视化图像###########################################
"""
plt.figure(figsize=(6,6))
plt.imshow(myimgray,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
"""
##############################################################################


imh,imw=myimgray.shape
myimgray_t =torch.from_numpy(myimgray.reshape((1, 1, imh, imw)))#调整张量维度后转换numpy数组
myimgray.shape#torch.size=([1, 1, 512, 512])





###########################对灰度图像进行卷积提取图像轮廓  定义卷积核#################################
kersize = 5  ##定义边缘检测卷积核,并将维度处理为1*1*5*5
ker = torch.ones(kersize,kersize,dtype=torch.float32)*-1#生成一个5*5的二维全1张量,然后再所有元素都乘以-1,得到一个5*5的全-1张量
ker[2,2] = 24#将5*5的张量最中间的一个元素赋值为24
ker = ker.reshape((1,1,kersize,kersize))

#########################################进行卷积操作############################################
conv2d = nn.Conv2d(1,2,(kersize,kersize),bias=False)#输入通道为1,输出通道为2,卷积核为(5*5),其他值全是None,不添加偏置,2是有两个卷积核,第一个是边缘卷积核,第二个是随机数卷积核
##设置卷积时使用的核,第一个核使用边缘检测核
conv2d.weight.data[0] = ker#对卷积核的参数赋值其实就是一个5*5的卷积核,这个是为了赋予卷积核的
imconv2dout = conv2d(myimgray_t)##对灰度图像进行卷积操作
imconv2dout_im = imconv2dout.data.squeeze()#移除所有维度为1的维度 ,对卷积后的输出进行维度压缩
print("卷积后的尺寸:",imconv2dout_im.shape)

"""
##可视化卷积后的图像
plt.figure(figsize=(12,6))##订尺寸
plt.subplot(1,2,1)#输出一行两列的图像,当前激活第一个图
plt.imshow(imconv2dout_im[0],cmap=plt.cm.gray)
plt.axis("off")#关闭坐标轴
plt.subplot(1,2,2)
plt.imshow(imconv2dout_im[1],cmap=plt.cm.gray)#输出一行两列的图像,当前激活第二个图
plt.axis("off")#关闭坐标轴
plt.show()
"""


程序里都有完整的备注,下面简单介绍:
总体顺序是
读取图像
转化为灰度图像
将图像数组转换成张量
转化为numpy数组
定义边缘检测卷积核

设置卷积(卷积核设置)(只定义了第一个卷积核,第二个卷积核采用随机的)

对灰度图像进行卷积
模型压缩

可视化卷积后的图像
《二》池化层
池化的目的是对卷积后得到的特征进行进一步处理(降维),起到进一步浓缩的效果。不能在上文使用squeeze是对其进行维度压缩再池化,因为维度对应不上。
下面是池化的操作

#####################################池化操作######################################
"""
torch.nn.MxPool2d(kernel_size,#最大池化窗口大小
                  stride=done,#步长
                  padding=0,#填充
                  dilation=1,#步幅
                  return_indices=False,#if = Ture 返回最大值索引
                  ceil_model=False#Ture返回输出信号大小,使用向上取整,默认向下取整)#输入时(N,Cin,Hin,Win)的张量,输出为(N,Cin,Hin,Win)
"""
###################################介绍完毕#######################################

###################################对卷积后的结果进行最大池化###################################
maxpoo12 = nn.MaxPool2d(2,stride=2)#定义池化层
poo12_out = maxpoo12(imconv2dout)#卷积后进行池化
poo12_out_im = poo12_out.squeeze()#压缩维度
#poo12_out_im.shape
######################################可视化最大池化后的结果#####################################
"""
plt.figure(figsize=(12,6))##订尺寸
plt.subplot(1,2,1)#输出一行两列的图像,当前激活第一个图
plt.imshow(poo12_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")#关闭坐标轴
plt.subplot(1,2,2)
plt.imshow(poo12_out_im[1].data,cmap=plt.cm.gray)#输出一行两列的图像,当前激活第二个图
plt.axis("off")#关闭坐标轴
plt.show()
"""
######################################################################################




####################################平均池化##################################################
avgpool12 = nn.AvgPool2d(2,stride=2)
poo12_out = avgpool12(imconv2dout)
poo12_out_im = poo12_out.squeeze()
##################################可视化平均池化结果############################################
plt.figure(figsize=(12,6))##订尺寸
plt.subplot(1,2,1)#输出一行两列的图像,当前激活第一个图
plt.imshow(poo12_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")#关闭坐标轴
plt.subplot(1,2,2)
plt.imshow(poo12_out_im[1].data,cmap=plt.cm.gray)#输出一行两列的图像,当前激活第二个图
plt.axis("off")#关闭坐标轴
plt.show()
######################################################################################




#######################################自适应平均值池化######################################################
AdapAvgpool2 = nn.AdaptiveAvgPool2d(output_size=(100,100))
poo12_out = AdapAvgpool2(imconv2dout)
poo12_out_im = poo12_out.squeeze()
#######################################可视化自适应平均值池化######################################################
plt.figure(figsize=(12,6))##订尺寸
plt.subplot(1,2,1)#输出一行两列的图像,当前激活第一个图
plt.imshow(poo12_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")#关闭坐标轴
plt.subplot(1,2,2)
plt.imshow(poo12_out_im[1].data,cmap=plt.cm.gray)#输出一行两列的图像,当前激活第二个图
plt.axis("off")#关闭坐标轴
plt.show()
#############################################################################################

《三》激活层

######################################激活函数#######################################################
######################################打印激活函数#######################################################
x = torch.linspace(-6,6,100)
sigmoid = nn.Sigmoid()     ##Sigmoid函数
ysigmoid = sigmoid(x)

tanh = nn.Tanh()        ##Tanh激活函数
ytanh = tanh(x)

relu = nn.ReLU()      ##relu激活函数
yrelu = relu(x)

softplus =nn.Softplus()     ##softplus激活函数
ysoftplus =softplus(x)

######################################可视化激活函数#######################################################
plt.figure(figsize=(10,10))

plt.subplot(1,4,1)
plt.plot(x.data.numpy(),ysigmoid.data.numpy(),"r-")
plt.title("Sigmoid")

plt.subplot(1,4,2)
plt.plot(x.data.numpy(),ytanh.data.numpy(),"r-")
plt.title("Tanh")

plt.subplot(1,4,3)
plt.plot(x.data.numpy(),yrelu.data.numpy(),"r-")
plt.title("Relu")

plt.subplot(1,4,4)
plt.plot(x.data.numpy(),ysoftplus.data.numpy(),"r-")
plt.title("Softplus")

plt.grid()
plt.show()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gale_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值