AlexNet卷积神经网络的理解并对手势数据集识别
论文:《ImageNet Classification with Deep Convolutional Neural Networks》
链接:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
AlexNet卷积神经网络结构
源码:https://github.com/DoubleYuanL/AlexNet.git
附带数据集
一:简单介绍一下AlexNet网结构
由结构图可知:
AlexNet卷积神经网络组成:5个卷积+三个池化+3个全连接(包含输出层)
更加细化一下:
输入图像数据[-1, 227, 227, 3]
卷积层_1:卷积核大小[11,11], stride = 4,数量96,以及激活函数relu,(原始AlexNet有lrn层,但是会减慢训练速度,代码里有写,但被我屏蔽了),采用有效卷积(VALID)
经过第一层卷积 结果为[-1, 55, 55, 96] 计算公式: output-size = (input_size - kernel_size + 2*padding)/stride + 1
池化层_1:采用最大池化 max_pooling kernel_size[3,3], stride = 2, 计算公式:width = (width - kernel_size)/stride + 1 长也是一样
池化结果:[-1, 27, 27, 96]
卷积层_2:卷积核大小[5,5], stride = 2,数量256, 以及激活函数relu, 以及lrn层,采用SAME卷积。
经过第二层卷积 结果为[-1, 27, 27, 256]
池化层_2:采用最大池化 max_pooling kernel_size[3,3], stride = 2,
池化结果:[-1, 13, 13, 96]
卷积层_3:卷积核大小[3,3], stride = 2,数量384, 以及激活函数relu, 采用SAME卷积。
卷积层_4:卷积核大小[3,3], stride = 2,数量384, 以及激活函数relu, 采用SAME卷积。
卷积层_5:卷积核大小[3,3], stride = 2,数量256, 以及激活函数relu, 采用SAME卷积。
因为三层都是SAME卷积,所以H和W不变,仅仅通道数改变
卷积结果:[-1, 13, 13, 256]
池化层_3:采用最大池化 max_pooling kernel_size[3,3], stride = 2,
池化结果:[-1, 6, 6, 256]
全连接层_1:生成4096个节点
全连接层_2:生成4096个节点
全连接层_3:生成分类数量的节点(这里为1000)
由于AlexNet对227,227像素的图片进行处理,并进行1000分类,我的电脑不支持,则采用64,64,3的图片,进行6分类,并且在代码里改变了全连接层节点的数量来适应这个小型数据集。
二:详细代码操作过程
分为训练和测试两个步骤
1:训练
1.1:加载数据集
将h5文件类型的图片转化为numpy类型,进行处理
def load_dataset():
train_dataset = h5py.File('datasets/train_signs.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
test_dataset = h5py.File('datasets/test_signs.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
classes = np.array(test_dataset["list_classes"][:]) # the list of classes
train_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
1.2:初始化数据集
将输入书进行归一化处理以及label标签进行one-hot处理
def init_dataset():
X_train_orig , Y_train_orig , X_test_orig , Y_test_orig , classes = load_dataset()
X_train = X_train_orig/255.
X_test = X_test_orig/255.
Y_train = convert_to_one_hot(Y_train_orig, 6).T
Y_test = convert_to_one_hot(Y_test_orig, 6).T
print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(