1. 本文目的
使用SVM代替CNN网络的全连接层,即CNN提取特征后利用SVM进行分类。(注:仍使用完整CNN网络进行训练获取卷积层参数,SVM参数单独训练获得,后续会对此进行详细说明。)
2. 实验流程:
- 对样本数据进行处理
- 建立完整的卷积神经网络(CNN)
- 利用训练数据进行训练,获取卷积层权重参数
- 将卷积层输出转换为SVM输入特征向量
- 利用上一步特征向量对SVM进行训练
- 利用测试数据进行准确率测试。
3. 网络结构

CNN有两个卷积层,两个全连接层,其中卷积层卷积核大小为5 * 5,步长为1,池化层卷积核大小为2 * 2,第一个全连接层输出h_fc1转化为特征向量输入SVM。
feature map大小变化如表所示:
| Conv1 | Pooling1 | Conv2 | Pooling2 | Full_Connectin1 | SVM | |
|---|---|---|---|---|---|---|
| input size | 16*16 | 16*16 | 8*8 | 8*8 | 4 * 4 * 64 | 1* 256 |
| filter | 5*5 | 2*2 | 5*5 | 2*2 | - | - |
| output size | 16 * 16 | 8*8 | 8*8 | 4*4 | 256 | - |
4. 核心代码
# coding=utf8
import random
import numpy as np
import tensorflow as tf
from sklearn import svm
for file_num in range(10):
# 在十个随机生成的不相干数据集上进行测试,将结果综合
print('testing NO.%d dataset.......' % file_num)
f1 = open('digit_train_' + file_num.__str__() + '.data')
lines1 = f1.readlines()
# 训练数据
X_train = []
y_train = []
y_train_temp = []
y_train_transform = []
for i in range(len(lines1)):
X_train.append(list(map(int, map(float, lines1[i].split(' ')[:256]))))
y_train.append(list(map(int, lines1[i].split(' ')[256:266])))
y_train_transform.append(np.argmax(list(map(int, lines1[i].split(' ')[256:266]))))
f1.close()
f2 = open

最低0.47元/天 解锁文章
5114

被折叠的 条评论
为什么被折叠?



