资源简介
传统的卷积神经网络是利用全连接层进行分类,svm对于小样本数据具有较强的分类效果,利用SVM代替卷积神经网络中的全连接层,可以提高网络识别精度
代码片段和文件信息
# -*- coding: utf-8 -*-
“““
Created on Sat Oct 19 21:39:21 2019
@author: 华阳
“““
import random
import tensorflow as tf
import numpy as np
from libsvm.python.svmutil import *
train_data = np.load(“train_data.npy“)
train_label = np.load(“train_label.npy“)
test_data = np.load(“test_data.npy“)
test_label = np.load(“test_label.npy“)
train_data = train_data.reshape(15006400)
test_data = test_data.reshape(3006400)
sess = tf.InteractiveSession()
def weight_variable(shape):
initial = tf.truncated_normal(shape stddev = 0.05) #截断的正态分布,标准差stddev
return tf.Variable(initial)
# 偏置参数初始化
def bias_variable(shape):
initial = tf.constant(0.1 shape = shape)
return tf.Variable(initial)
# 定义卷积层
def conv2d(x W):
# stride的四个参数:[batch height width channels] [batch_size image_rows image_cols number_of_colors]
# height width就是图像的高度和宽度,batch和channels在卷积层中通常设为1
return tf.nn.conv2d(x W strides = [1 1 1 1] padding = ‘SAME‘)
def max_pool_2x2(x):
return tf.nn.max_pool(x ksize = [1 2 2 1] strides = [1 2 2 1] padding = ‘SAME‘)
xs = tf.placeholder(tf.float32 [None 6400])
ys = tf.placeholder(tf.float32 [None 2])
keep_prob = tf.placeholder(tf.float32)
x_image = tf.reshape(xs [-1 80 80 1])# -1 28 28 1
#print(x_image.shape)
# 卷积层一
# patch为5*5,in_size为1,即图像的厚度,如果是彩色,则为3,32是out_size,输出的大小-》32个卷积和(滤波器)
W_conv1 = weight_variable([9 9 1 32])
b_conv1 = bias_variable([32])
# ReLU操作,输出大小为28*28*32
h_conv1 = tf.nn.relu(conv2d(x_image W_conv1) + b_conv1)
# Pooling操作,输出大小为14*14*32
h_pool1 = max_pool_2x2(h_conv1)
# 卷积层二
# patch为5*5,in_size为32,即图像的厚度,64是out_size,输出的大小
W_conv2 = weight_variable([9 9 32 64])
b_conv2 = bias_variable([64])
# ReLU操作,输出大小为14*14*64
h_conv2 = tf.nn.relu(conv2d(h_pool1 W_conv2) + b_conv2)
# Pooling操作,输出大小为7*7*64
h_pool2 = max_pool_2x2(h_conv2)
# 全连接层一
W_fc1 = weight_variable([20 * 20 * 64 640])
b_fc1 = bias_variable([640])
# 输入数据变换
h_pool2_flat = tf.reshape(h_pool2 [-1 20 * 20 * 64]) #整形成m*n列n为7*7*64
# 进行全连接操作
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat W_fc1) + b_fc1) # tf.matmul
# 防止过拟合,dropout
h_fc1_drop = tf.nn.dropout(h_fc1 keep_prob)
# 全连接层二
W_fc2 = weight_variable([640 2])
b_fc2 = bias_variable([2])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop W_fc2) + b_fc2)
# 计算loss
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(tf.clip_by_value(prediction1e-81.0))))
# 神经网络训练
train_step = tf.train.AdamOptimizer(0.0001).minimize(cross_entropy) #0.0001
# 定义Session
sess = tf.Session()
init = tf.global_variables_initializer()
# 执行初始化
sess.run(init)
for i in range(500):
# 跑3000轮迭代,每次随机从训练样本中抽出50个进行训练
batch = ([] [])
p = random.sample(range(1500) 50)
for k in p:
batch[0].append(train_data[k])
batch[1].append(train_label[k])
sess.run(train_step feed_dict={xs: batch[0] ys: batch[1] keep_prob: 0.6})
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4595 2019-11-08 10:45 基于CNN+SVM的猫狗识别\CNN_SVM.py
文件 76800128 2019-10-22 10:41 基于CNN+SVM的猫狗识别\train_data.npy
文件 12128 2019-10-22 10:41 基于CNN+SVM的猫狗识别\train_label.npy
文件 3840128 2019-10-23 12:29 基于CNN+SVM的猫狗识别\x_temp.npy
文件 768128 2019-10-23 12:29 基于CNN+SVM的猫狗识别\x_temp2.npy
文件 163 2019-11-08 10:50 基于CNN+SVM的猫狗识别\说明.txt
目录 0 2020-10-12 16:31 基于CNN+SVM的猫狗识别\
评论
共有 条评论