[Machine Learing]2.0-Convolution Neural NetWork

[Machine Learing]2.0-Convolution Neural NetWork

摘要
本周主要通过学习李宏毅老师的线性代数课程,了解了卷积神经网络的基本结构和各层的功能,以及利用Pytorch搭建了一个较为复杂的神经网络进行实验,但是实验结果并不理想,一是梯度下降慢,精度提升慢,二是在训练集上的效果十分不理想,希望接下来可以得到解决。

1. 机器学习
Convolutional Network:卷积神经网络主要由卷积层,池化层,全连接层组成
卷积层:其中卷积层主要通过卷积核(n*n)按照一定步长(stride)扫描传进来的图片,相当于局部提取图片的信息。
池化层:将扫描后图片的信息取出局部的最大值或者平均值,相当于把图片局部一些比较明显的信息压缩起来。
全连接层:对图像进行过上述处理后,把所有的参数flatten后经过各种处理返回n个值(n为想要得到的数值类数,例如在图像分类问题中就是图像的类别。)

2. 项目
卷积神经网络处理11种事物图像分类问题。

第一步:获取数据


#Pytorch dataset
Class Dataset(dataset):
Def readfile: #通过给定的dir返回值
labels = []
files_list = os.listdir(path) #通过os获得path下的所有文件名
for i in range(len(files_list)):
    labels.append(files_list[i].split('_')[0]) #以_分隔符获得文件名
#path加上所有文件名
file_path_list = [os.path.join(path, img) for img in files_list]#把filelist里的所有文件名加入到path后面
labels = list(map(int, labels)) #把str转int
return file_path_list,labels

Key:
Os.listdir(path), files.spilt(‘_’)[n] [os.path.join(path,img) for img in files_list]
List(map(int,laels))

Def Transform:
transform = transforms.Compose(
    [
        transforms.Resize((224, 224)),  # 将输入的PIL图片转换成给定的尺寸的大小
        #数据增强
        transforms.RandomRotation(degrees=15),  # 按角度旋转图像。
        transforms.ColorJitter(),
        # 随机改变图片的亮度、对比度和饱和度。Grayscale(num_output_channels=1)将图片转成灰度图。参数: num_output_channels(int) —— (1或者3),输出图片的通道数量;返回: 输入图片的灰度图,如果num_output_channels=1, 返回的图片为单通道. 如果 num_output_channels=3, 返回的图片为3通道图片,且r=g=b;返回类型:PIL图片类型
        transforms.RandomHorizontalFlip(),  # 以给定的概率随机水平翻转给定的PIL图像
        transforms.ToTensor(),  # 将PIL图片或者numpy.ndarray转成Tensor类型的
        transforms.Normalize([0.485, 0.456, 0.406],  # 用均值和标准差对张量图像进行标准化处理
                             [0.229, 0.224, 0.225])  # Imagenet standards
    ]
)

第二步:定义卷积神经网络
#网络架构参考AlexNet

Class AlexNet()
Def _init_:
self.conv1 = nn.Sequential( #inputsize 224*224*3
    nn.Conv2d(in_channels=3,out_channels=48,kernel_size=11,stride=4,padding=0),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2) #outputsize 27*27*48
)
self.conv2 = nn.Sequential(#inputsize 27*27*48
    nn.Conv2d(48,128,5,1,2),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2)  #outputsize 13*13*128
)
self.conv3 = nn.Sequential(  # inputsize 13*13*128
    nn.Conv2d(128, 256, 3, 1, 1),
    nn.ReLU(), # outputsize 13*13*256
)
self.conv4 = nn.Sequential(  # inputsize 13*13*256
    nn.Conv2d(256, 256, 3, 1, 1),
    nn.ReLU(),  # outputsize 13*13*256
)
self.conv5 = nn.Sequential(  # inputsize 13*13*256
    nn.Conv2d(256, 128, 3, 1, 1),
    nn.ReLU(),  # outputsize 13*13*256
    nn.MaxPool2d(kernel_size=2)  # outputsize 6*6*128
)
self.fclayer= nn.Sequential(
    nn.Linear(4608,2048),
    nn.ReLU(),
    nn.Linear(2048, 2048),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(2048,11)
)

输入3224224的图片。第一层的参数
Conv1(input=3,output=xx, filter=11,stride 4,padding = 0)
输出图片的大小= (224-11)+2*0/strde 4 +1

第三步:建立训练过程
选好optimizer 和loss
本次project选择的Optimizer = Adam(model.params(),lr=lr)
Loss = nn.Crossentropy()
训练过程不多赘述

第四步:训练

Data = data.cuda()
Model = model.cuda()

最后在cuda上训练训练集达到了80%但是验证集不过50%,仍在分析原因.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值