使用TensorFlow实现SVM
作者:sdoddyjm68 发布时间:2023-04-27 00:44:49
标签:TensorFlow,SVM
较基础的SVM,后续会加上多分类以及高斯核,供大家参考。
Talk is cheap, show me the code
import tensorflow as tf
from sklearn.base import BaseEstimator, ClassifierMixin
import numpy as np
class TFSVM(BaseEstimator, ClassifierMixin):
def __init__(self,
C = 1, kernel = 'linear',
learning_rate = 0.01,
training_epoch = 1000,
display_step = 50,
batch_size = 50,
random_state = 42):
#参数列表
self.svmC = C
self.kernel = kernel
self.learning_rate = learning_rate
self.training_epoch = training_epoch
self.display_step = display_step
self.random_state = random_state
self.batch_size = batch_size
def reset_seed(self):
#重置随机数
tf.set_random_seed(self.random_state)
np.random.seed(self.random_state)
def random_batch(self, X, y):
#调用随机子集,实现mini-batch gradient descent
indices = np.random.randint(1, X.shape[0], self.batch_size)
X_batch = X[indices]
y_batch = y[indices]
return X_batch, y_batch
def _build_graph(self, X_train, y_train):
#创建计算图
self.reset_seed()
n_instances, n_inputs = X_train.shape
X = tf.placeholder(tf.float32, [None, n_inputs], name = 'X')
y = tf.placeholder(tf.float32, [None, 1], name = 'y')
with tf.name_scope('trainable_variables'):
#决策边界的两个变量
W = tf.Variable(tf.truncated_normal(shape = [n_inputs, 1], stddev = 0.1), name = 'weights')
b = tf.Variable(tf.truncated_normal([1]), name = 'bias')
with tf.name_scope('training'):
#算法核心
y_raw = tf.add(tf.matmul(X, W), b)
l2_norm = tf.reduce_sum(tf.square(W))
hinge_loss = tf.reduce_mean(tf.maximum(tf.zeros(self.batch_size, 1), tf.subtract(1., tf.multiply(y_raw, y))))
svm_loss = tf.add(hinge_loss, tf.multiply(self.svmC, l2_norm))
training_op = tf.train.AdamOptimizer(learning_rate = self.learning_rate).minimize(svm_loss)
with tf.name_scope('eval'):
#正确率和预测
prediction_class = tf.sign(y_raw)
correct_prediction = tf.equal(y, prediction_class)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
init = tf.global_variables_initializer()
self._X = X; self._y = y
self._loss = svm_loss; self._training_op = training_op
self._accuracy = accuracy; self.init = init
self._prediction_class = prediction_class
self._W = W; self._b = b
def _get_model_params(self):
#获取模型的参数,以便存储
with self._graph.as_default():
gvars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)
return {gvar.op.name: value for gvar, value in zip(gvars, self._session.run(gvars))}
def _restore_model_params(self, model_params):
#保存模型的参数
gvar_names = list(model_params.keys())
assign_ops = {gvar_name: self._graph.get_operation_by_name(gvar_name + '/Assign') for gvar_name in gvar_names}
init_values = {gvar_name: assign_op.inputs[1] for gvar_name, assign_op in assign_ops.items()}
feed_dict = {init_values[gvar_name]: model_params[gvar_name] for gvar_name in gvar_names}
self._session.run(assign_ops, feed_dict = feed_dict)
def fit(self, X, y, X_val = None, y_val = None):
#fit函数,注意要输入验证集
n_batches = X.shape[0] // self.batch_size
self._graph = tf.Graph()
with self._graph.as_default():
self._build_graph(X, y)
best_loss = np.infty
best_accuracy = 0
best_params = None
checks_without_progress = 0
max_checks_without_progress = 20
self._session = tf.Session(graph = self._graph)
with self._session.as_default() as sess:
self.init.run()
for epoch in range(self.training_epoch):
for batch_index in range(n_batches):
X_batch, y_batch = self.random_batch(X, y)
sess.run(self._training_op, feed_dict = {self._X:X_batch, self._y:y_batch})
loss_val, accuracy_val = sess.run([self._loss, self._accuracy], feed_dict = {self._X: X_val, self._y: y_val})
accuracy_train = self._accuracy.eval(feed_dict = {self._X: X_batch, self._y: y_batch})
if loss_val < best_loss:
best_loss = loss_val
best_params = self._get_model_params()
checks_without_progress = 0
else:
checks_without_progress += 1
if checks_without_progress > max_checks_without_progress:
break
if accuracy_val > best_accuracy:
best_accuracy = accuracy_val
#best_params = self._get_model_params()
if epoch % self.display_step == 0:
print('Epoch: {}\tValidaiton loss: {:.6f}\tValidation Accuracy: {:.4f}\tTraining Accuracy: {:.4f}'
.format(epoch, loss_val, accuracy_val, accuracy_train))
print('Best Accuracy: {:.4f}\tBest Loss: {:.6f}'.format(best_accuracy, best_loss))
if best_params:
self._restore_model_params(best_params)
self._intercept = best_params['trainable_variables/weights']
self._bias = best_params['trainable_variables/bias']
return self
def predict(self, X):
with self._session.as_default() as sess:
return self._prediction_class.eval(feed_dict = {self._X: X})
def _intercept(self):
return self._intercept
def _bias(self):
return self._bias
实际运行效果如下(以Iris数据集为样本):
画出决策边界来看看:
来源:https://blog.csdn.net/sdoddyjm68/article/details/79392230


猜你喜欢
- 一. 输出函数print在python中,print()是可以直接使用的输出函数,将数据输出到控制台上。1. print函数的使用1.1 可
- 一、基本概念Reactive X中有几个核心的概念,先来简单介绍一下。1.1、Observable和Observer(可观察对象和观察者)首
- 上节基本完成了SVM的理论推倒,寻找最大化间隔的目标最终转换成求解拉格朗日乘子变量alpha的求解问题,求出了alpha即可求解出SVM的权
- 本文介绍了Vue.js 常用模板语法,分享给大家,具体如下:一、文本渲染Vue支持动态渲染文本,即在修改属性的同时,实时渲染文本内容。同时为
- 一、关系型数据库设计规则遵循ER模型和三范式E entity 代表实体的意思 对应到数据库当中的一张表R relationship 代表关系
- splinter介绍 Splinter是一个使用Python测试Web应用程序的开源工具,可以自动化浏览器操作,例如访问URL和与它们的项
- set函数也是python内置函数的其中一个,属于比较基础的函数。其具体介绍和使用方法,下面进行介绍。set() 函数创建一个无序不重复元素
- 微信小程序实现人脸识别,具体应用场景 前端实现人脸信息采集 拍到正面照片 发送给后端该方法暂
- 本文记录了mysql 5.7.23 winx64安装教程,具体内容如下Step1官方:下载地址选择手动下载版本解压到自己指定的路径上图中的m
- 本篇博客主要介绍的是pyinstaller在windows下的基本使用和基础避坑在windows中使用pyinstaller工具打包时会出现
- Flask子域名一般用于数量比较少的子域名,一个模块对应一个子域名。先看下面一个例子:modules.py:from flask impor
- 核心代码# -*- coding: utf-8 -*-'''python读取英文文件,将每个单词按照空格分开,并将每
- replace 方法返回根据正则表达式进行文字替换后的字符串的复制。stringObj.replace(rgExp, replaceText
- 这十则CSS技巧汇编于网络,作为老手已经司空见惯了,也没有什么新意,但温故而知新,或许阅读一遍也有一定的启发,本文主要面对CSS新手朋友,有
- 我就废话不多说了,直接上代码吧!>>> import torch>>> from torch.autog
- 本文实例讲述了codeigniter发送邮件并打印调试信息的方法。分享给大家供大家参考。具体如下:这里的codeigniter代码实现发送邮
- asp之家补充两点,以让大家看的更明白:一.什么是GUID?由于水平有限在看到这篇文章时,我并不了解什么是GUID,为了看懂文章当然先请教一
- MYSQL中的分组和链接是在操作数据库和数据交互时最常用的两个在功能,把这两项处理好了,MYSQL的执行效率会非常高速。一、group by
- 利用问题的普遍性和特殊性来求解,代码如下:import unittestfrom datetime import datetimeclass
- xlwt工具使用,生成excel栏位宽度可自适应内容长度import xlwtresult = [