[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%,仍在分析原因.