VGG-16-Net卷积神经网络的理解并对手势数据集识别
论文:《Very Deep Convolutional Networks for Large-Scale Image Recognition》
链接:https://arxiv.org/abs/1409.1556
源码:https://github.com/DoubleYuanL/VGG-Net
附带数据集
VGG网络相比AlexNet网络的最主要改进是使用多个小的卷积核代替大卷积核使得网络层数得以更深,特征提取效果更加精细
本文根据VGG-16的设置条件进行网络搭建,由图可知,VGG16是由13层卷积加3层全连接构成16层网络,可以看到,卷积时所有卷积核大小都为3,1-2层卷积为64通道,3-4为128通道,5-6-7为256通道,8-9-10为512,11-12-13也为512通道,在每一个块之后加最大池化操作,池化都是ksize=2,strides=2。
一:简单介绍一下VGG16中的参数设置和AlexNet有哪些不同
第一点:将AlexNet卷积层中的(11x11,7x7,5x5)卷积核大小全部改为3x3的卷积核大小
第二点:使用连续的3x3卷积核代替大卷积核,使用2个或者3个连续的3x3卷积来代替11x11,7x7,5x5的卷积核。
第三点:因为使用了更小的卷积核,所以可以设置比AlexNet更深的网络结果,VGG在图像特征提取上更为出色。
本文依然使用64x64x3的数据集进行处理,因此参数我在VGG基础上减少了参数大小,以求符合这个小型数据集
二:详细代码操作过程
分为训练和测试两个步骤
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"][:])
train_set_y_orig = np.array(train_dataset["train_set_y"][:])
test_dataset = h5py.File('datasets/test_signs.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:])
test_set_y_orig = np.array(test_dataset["test_set_y"][:])
classes = np.array(test_dataset["list_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(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
return X_train, Y_train, X_test, Y_test, classes
1.3:创建占位符
def create_placeholder(n_H0, n_W0, n_C0, n_y):
X = tf.placeholder(tf