백엔드 개발 파이썬 튜토리얼 TensorFlow를 사용하여 다중 클래스 지원 벡터 머신을 구현하기 위한 샘플 코드

TensorFlow를 사용하여 다중 클래스 지원 벡터 머신을 구현하기 위한 샘플 코드

Apr 28, 2018 am 10:24 AM
tensorflow 벡터 지원하다

이 기사에서는 TensorFlow를 사용하여 다중 클래스 지원 벡터 머신을 구현하기 위한 샘플 코드를 주로 소개합니다. 함께 구경해보세요

이 글에서는 붓꽃 데이터 세트를 학습하여 세 가지 종류의 꽃을 분류하는 다중 클래스 지원 벡터 머신 분류기를 자세히 보여드리겠습니다.

SVM 알고리즘은 원래 이진 분류 문제를 위해 설계되었지만 일부 전략을 통해 다중 클래스 분류에도 사용할 수 있습니다. 두 가지 주요 전략은 1대 전체(1대 전체) 접근 방식과 1대 1(1대 1) 접근 방식입니다.

일대일 방법은 두 가지 유형의 샘플 사이에 이진 분류기를 설계하고 생성한 후 가장 많은 표를 얻은 카테고리가 알려지지 않은 샘플의 예측 카테고리가 되는 것입니다. 하지만 카테고리가 많으면(k개 카테고리) k를 생성해야 합니다! /(k-2)! 2! 분류기의 경우 계산 비용은 여전히 ​​상당히 높습니다.

다중 클래스 분류자를 구현하는 또 다른 방법은 각 클래스에 대한 분류자를 생성하는 일대다입니다. 마지막 예측 클래스는 SVM 간격이 가장 큰 클래스입니다. 이 문서에서는 이 방법을 구현합니다.

붓꽃 데이터세트를 로드하고 가우시안 커널 기능을 갖춘 비선형 다중 클래스 SVM 모델을 사용하겠습니다. 붓꽃 데이터 세트에는 산 붓꽃, 변경 가능한 붓꽃, 버지니아 붓꽃(I.setosa, I.virginica 및 I.versicolor)의 세 가지 범주가 포함되어 있습니다. 예측을 위해 세 가지 가우스 커널 함수 SVM을 생성합니다.

# Multi-class (Nonlinear) SVM Example
#----------------------------------
#
# This function wll illustrate how to
# implement the gaussian kernel with
# multiple classes on the iris dataset.
#
# Gaussian Kernel:
# K(x1, x2) = exp(-gamma * abs(x1 - x2)^2)
#
# X : (Sepal Length, Petal Width)
# Y: (I. setosa, I. virginica, I. versicolor) (3 classes)
#
# Basic idea: introduce an extra dimension to do
# one vs all classification.
#
# The prediction of a point will be the category with
# the largest margin or distance to boundary.

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from sklearn import datasets
from tensorflow.python.framework import ops
ops.reset_default_graph()

# Create graph
sess = tf.Session()

# Load the data
# 加载iris数据集并为每类分离目标值。
# 因为我们想绘制结果图,所以只使用花萼长度和花瓣宽度两个特征。
# 为了便于绘图,也会分离x值和y值
# iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]
iris = datasets.load_iris()
x_vals = np.array([[x[0], x[3]] for x in iris.data])
y_vals1 = np.array([1 if y==0 else -1 for y in iris.target])
y_vals2 = np.array([1 if y==1 else -1 for y in iris.target])
y_vals3 = np.array([1 if y==2 else -1 for y in iris.target])
y_vals = np.array([y_vals1, y_vals2, y_vals3])
class1_x = [x[0] for i,x in enumerate(x_vals) if iris.target[i]==0]
class1_y = [x[1] for i,x in enumerate(x_vals) if iris.target[i]==0]
class2_x = [x[0] for i,x in enumerate(x_vals) if iris.target[i]==1]
class2_y = [x[1] for i,x in enumerate(x_vals) if iris.target[i]==1]
class3_x = [x[0] for i,x in enumerate(x_vals) if iris.target[i]==2]
class3_y = [x[1] for i,x in enumerate(x_vals) if iris.target[i]==2]

# Declare batch size
batch_size = 50

# Initialize placeholders
# 数据集的维度在变化,从单类目标分类到三类目标分类。
# 我们将利用矩阵传播和reshape技术一次性计算所有的三类SVM。
# 注意,由于一次性计算所有分类,
# y_target占位符的维度是[3,None],模型变量b初始化大小为[3,batch_size]
x_data = tf.placeholder(shape=[None, 2], dtype=tf.float32)
y_target = tf.placeholder(shape=[3, None], dtype=tf.float32)
prediction_grid = tf.placeholder(shape=[None, 2], dtype=tf.float32)

# Create variables for svm
b = tf.Variable(tf.random_normal(shape=[3,batch_size]))

# Gaussian (RBF) kernel 核函数只依赖x_data
gamma = tf.constant(-10.0)
dist = tf.reduce_sum(tf.square(x_data), 1)
dist = tf.reshape(dist, [-1,1])
sq_dists = tf.multiply(2., tf.matmul(x_data, tf.transpose(x_data)))
my_kernel = tf.exp(tf.multiply(gamma, tf.abs(sq_dists)))

# Declare function to do reshape/batch multiplication
# 最大的变化是批量矩阵乘法。
# 最终的结果是三维矩阵,并且需要传播矩阵乘法。
# 所以数据矩阵和目标矩阵需要预处理,比如xT·x操作需额外增加一个维度。
# 这里创建一个函数来扩展矩阵维度,然后进行矩阵转置,
# 接着调用TensorFlow的tf.batch_matmul()函数
def reshape_matmul(mat):
  v1 = tf.expand_dims(mat, 1)
  v2 = tf.reshape(v1, [3, batch_size, 1])
  return(tf.matmul(v2, v1))

# Compute SVM Model 计算对偶损失函数
first_term = tf.reduce_sum(b)
b_vec_cross = tf.matmul(tf.transpose(b), b)
y_target_cross = reshape_matmul(y_target)

second_term = tf.reduce_sum(tf.multiply(my_kernel, tf.multiply(b_vec_cross, y_target_cross)),[1,2])
loss = tf.reduce_sum(tf.negative(tf.subtract(first_term, second_term)))

# Gaussian (RBF) prediction kernel
# 现在创建预测核函数。
# 要当心reduce_sum()函数,这里我们并不想聚合三个SVM预测,
# 所以需要通过第二个参数告诉TensorFlow求和哪几个
rA = tf.reshape(tf.reduce_sum(tf.square(x_data), 1),[-1,1])
rB = tf.reshape(tf.reduce_sum(tf.square(prediction_grid), 1),[-1,1])
pred_sq_dist = tf.add(tf.subtract(rA, tf.multiply(2., tf.matmul(x_data, tf.transpose(prediction_grid)))), tf.transpose(rB))
pred_kernel = tf.exp(tf.multiply(gamma, tf.abs(pred_sq_dist)))

# 实现预测核函数后,我们创建预测函数。
# 与二类不同的是,不再对模型输出进行sign()运算。
# 因为这里实现的是一对多方法,所以预测值是分类器有最大返回值的类别。
# 使用TensorFlow的内建函数argmax()来实现该功能
prediction_output = tf.matmul(tf.multiply(y_target,b), pred_kernel)
prediction = tf.arg_max(prediction_output-tf.expand_dims(tf.reduce_mean(prediction_output,1), 1), 0)
accuracy = tf.reduce_mean(tf.cast(tf.equal(prediction, tf.argmax(y_target,0)), tf.float32))

# Declare optimizer
my_opt = tf.train.GradientDescentOptimizer(0.01)
train_step = my_opt.minimize(loss)

# Initialize variables
init = tf.global_variables_initializer()
sess.run(init)

# Training loop
loss_vec = []
batch_accuracy = []
for i in range(100):
  rand_index = np.random.choice(len(x_vals), size=batch_size)
  rand_x = x_vals[rand_index]
  rand_y = y_vals[:,rand_index]
  sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})

  temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
  loss_vec.append(temp_loss)

  acc_temp = sess.run(accuracy, feed_dict={x_data: rand_x,
                       y_target: rand_y,
                       prediction_grid:rand_x})
  batch_accuracy.append(acc_temp)

  if (i+1)%25==0:
    print('Step #' + str(i+1))
    print('Loss = ' + str(temp_loss))

# 创建数据点的预测网格,运行预测函数
x_min, x_max = x_vals[:, 0].min() - 1, x_vals[:, 0].max() + 1
y_min, y_max = x_vals[:, 1].min() - 1, x_vals[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
           np.arange(y_min, y_max, 0.02))
grid_points = np.c_[xx.ravel(), yy.ravel()]
grid_predictions = sess.run(prediction, feed_dict={x_data: rand_x,
                          y_target: rand_y,
                          prediction_grid: grid_points})
grid_predictions = grid_predictions.reshape(xx.shape)

# Plot points and grid
plt.contourf(xx, yy, grid_predictions, cmap=plt.cm.Paired, alpha=0.8)
plt.plot(class1_x, class1_y, 'ro', label='I. setosa')
plt.plot(class2_x, class2_y, 'kx', label='I. versicolor')
plt.plot(class3_x, class3_y, 'gv', label='I. virginica')
plt.title('Gaussian SVM Results on Iris Data')
plt.xlabel('Pedal Length')
plt.ylabel('Sepal Width')
plt.legend(loc='lower right')
plt.ylim([-0.5, 3.0])
plt.xlim([3.5, 8.5])
plt.show()

# Plot batch accuracy
plt.plot(batch_accuracy, 'k-', label='Accuracy')
plt.title('Batch Accuracy')
plt.xlabel('Generation')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()

# Plot loss over time
plt.plot(loss_vec, 'k-')
plt.title('Loss per Generation')
plt.xlabel('Generation')
plt.ylabel('Loss')
plt.show()
로그인 후 복사

출력:

업데이트 지침:
대신 `argmax` 사용
Step #25
Loss = -313.391
Step #50
Loss = -650.891
Step #75
Los s = -988.39 STEP #100 #LOSS = -1325.89 Multi -Classification (세 가지 범주) I.Setosa의 비선형 가우스 SVM 모델의 결과, 여기서 감마 값은 10


입니다. SVM 알고리즘을 변경하여 세 가지 유형의 SVM 모델을 동시에 최적화하는 데 중점을 둡니다. 모델 매개변수 b는 차원 하나를 추가하여 세 모델에 대해 계산됩니다. TensorFlow의 내장 함수를 사용하면 알고리즘이 여러 유형의 유사한 알고리즘으로 쉽게 확장될 수 있음을 알 수 있습니다.

관련 권장 사항:

비선형 서포트 벡터 머신의 TensorFlow 구현 방법


위 내용은 TensorFlow를 사용하여 다중 클래스 지원 벡터 머신을 구현하기 위한 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Windows Hello가 지원되지 않는 카메라 문제를 해결하는 방법 Windows Hello가 지원되지 않는 카메라 문제를 해결하는 방법 Jan 05, 2024 pm 05:38 PM

Windows Shello를 사용하는 경우 지원되는 카메라를 찾을 수 없습니다. 일반적인 이유는 사용하는 카메라가 얼굴 인식을 지원하지 않거나 카메라 드라이버가 올바르게 설치되지 않았기 때문입니다. 그럼 설정 방법을 살펴보겠습니다. Windowshello에서 지원되는 카메라 튜토리얼을 찾을 수 없습니다. 이유 1: 카메라 드라이버가 올바르게 설치되지 않았습니다. 1. 일반적으로 Win10 시스템은 다음과 같이 대부분의 카메라에 대한 드라이버를 자동으로 설치할 수 있으며, 카메라를 연결한 후 알림이 표시됩니다. 이때 장치를 열어서 카메라 드라이버가 설치되어 있는지 관리자를 확인하세요. 그렇지 않은 경우 수동으로 설치해야 합니다. WIN+X를 누른 다음 장치 관리자를 선택합니다. 3. 장치 관리자 창에서 카메라 옵션을 확장하면 카메라 드라이버 모델이 표시됩니다.

Conda에 텐서플로우를 설치하는 방법 Conda에 텐서플로우를 설치하는 방법 Dec 05, 2023 am 11:26 AM

설치 단계: 1. Miniconda를 다운로드하여 설치하고 운영 체제에 따라 적절한 Miniconda 버전을 선택한 후 공식 가이드에 따라 설치합니다. 2. "conda create -n tensorflow_env python=3.7" 명령을 사용하여 새 Conda 환경을 만듭니다. 3. Conda 환경을 활성화합니다. 4. "conda install tensorflow" 명령을 사용하여 최신 버전의 TensorFlow를 설치합니다.

PyCharm Community Edition은 충분한 플러그인을 지원합니까? PyCharm Community Edition은 충분한 플러그인을 지원합니까? Feb 20, 2024 pm 04:42 PM

PyCharm Community Edition은 충분한 플러그인을 지원합니까? 구체적인 코드 예제가 필요 소프트웨어 개발 분야에서 Python 언어가 점점 더 널리 사용됨에 따라 전문적인 Python 통합 개발 환경(IDE)인 PyCharm이 개발자들에게 선호되고 있습니다. PyCharm은 Professional 버전과 Community 버전의 두 가지 버전으로 나누어집니다. Community 버전은 무료로 제공되지만 Professional 버전에 비해 플러그인 지원이 제한됩니다. 그렇다면 문제는 PyCharm Community Edition이 충분한 플러그인을 지원하느냐는 것입니다. 이 기사에서는 특정 코드 예제를 사용하여

장점과 단점 분석: 오픈 소스 소프트웨어의 장점과 단점을 자세히 살펴봅니다. 장점과 단점 분석: 오픈 소스 소프트웨어의 장점과 단점을 자세히 살펴봅니다. Feb 23, 2024 pm 11:00 PM

오픈소스 소프트웨어의 장단점: 오픈소스 프로젝트의 장단점을 이해하려면 구체적인 코드 예제가 필요합니다. 오늘날 디지털 시대에 오픈소스 소프트웨어는 점점 더 많은 관심과 존경을 받고 있습니다. 오픈소스 소프트웨어는 협력과 공유의 정신을 바탕으로 한 소프트웨어 개발 모델로서 다양한 분야에서 널리 사용되고 있습니다. 그러나 오픈 소스 소프트웨어의 많은 장점에도 불구하고 몇 가지 과제와 제한 사항도 있습니다. 이 기사에서는 오픈 소스 소프트웨어의 장단점을 자세히 살펴보고 특정 코드 예제를 통해 오픈 소스 프로젝트의 장단점을 보여줍니다. 1. 오픈소스 소프트웨어의 장점 1.1 개방성과 투명성 오픈소스 소프트웨어

ASUS TUF Z790 Plus는 ASUS MCP79 메모리 주파수와 호환됩니다. ASUS TUF Z790 Plus는 ASUS MCP79 메모리 주파수와 호환됩니다. Jan 03, 2024 pm 04:18 PM

ASUS tufz790plus는 메모리 주파수를 지원합니다. ASUS TUFZ790-PLUS 마더보드는 듀얼 채널 DDR4 메모리를 지원하고 최대 64GB의 메모리를 지원하는 고성능 마더보드입니다. 메모리 주파수는 최대 4800MHz로 매우 강력합니다. 지원되는 특정 메모리 주파수에는 2133MHz, 2400MHz, 2666MHz, 2800MHz, 3000MHz, 3200MHz, 3600MHz, 3733MHz, 3866MHz, 4000MHz, 4133MHz, 4266MHz, 4400MHz, 4533MHz, 4600MHz, 4733MHz 및 . 일상적인 사용이든 고성능 요구이든

TensorFlow와 Keras를 사용하여 고양이와 개 사진에 대한 딥 러닝 분류기를 만듭니다. TensorFlow와 Keras를 사용하여 고양이와 개 사진에 대한 딥 러닝 분류기를 만듭니다. May 16, 2023 am 09:34 AM

이 글에서는 TensorFlow와 Keras를 사용하여 고양이 이미지와 개 이미지를 구별할 수 있는 이미지 분류기를 만들어 보겠습니다. 이를 위해 TensorFlow 데이터 세트의 cats_vs_dogs 데이터 세트를 사용합니다. 데이터 세트는 25,000개의 고양이와 개 이미지로 구성되어 있으며, 그 중 80%는 훈련에, 10%는 검증에, 10%는 테스트에 사용됩니다. 데이터 로드 먼저 TensorFlowDatasets를 사용하여 데이터 세트를 로드합니다. 데이터 세트를 각각 데이터의 80%, 10%, 10%를 차지하는 훈련 세트, 검증 세트, 테스트 세트로 나누고 데이터 세트에 일부 샘플 이미지를 표시하는 함수를 정의합니다. 수입품

Flask-Babel을 사용하여 다국어 지원을 구현하는 방법 Flask-Babel을 사용하여 다국어 지원을 구현하는 방법 Aug 02, 2023 am 08:55 AM

Flask-Babel을 사용하여 다중 언어 지원을 구현하는 방법 소개: 인터넷의 지속적인 발전으로 인해 다중 언어 지원은 대부분의 웹 사이트와 애플리케이션에 필요한 기능이 되었습니다. Flask-Babel은 Babel 라이브러리를 기반으로 다국어 지원을 제공하는 편리하고 사용하기 쉬운 Flask 확장입니다. 이 기사에서는 Flask-Babel을 사용하여 다국어 지원을 구현하는 방법을 소개하고 코드 예제를 첨부합니다. 1. Flask-Babel을 설치하기 전에 먼저 Flask-Bab을 설치해야 합니다.

GTX960과 XP 시스템 간의 호환성 및 관련 지침 GTX960과 XP 시스템 간의 호환성 및 관련 지침 Dec 28, 2023 pm 10:22 PM

일부 사용자는 XP 시스템을 사용하고 그래픽 카드를 gtx960으로 업그레이드하고 싶지만 gtx960이 XP 시스템을 지원하는지 여부를 확신하지 못합니다. 실제로 gtx960은 XP 시스템을 지원합니다. 공식 웹사이트에서 XP 시스템에 적합한 드라이버를 다운로드하기만 하면 gtx960을 사용할 수 있습니다. 아래에서 구체적인 단계를 살펴보겠습니다. gtx960은 XP 시스템을 지원합니까? GTX960은 XP 시스템과 호환됩니다. 드라이버를 다운로드하여 설치하기만 하면 됩니다. 먼저 NVIDIA 공식 웹사이트를 열고 홈페이지로 이동해야 합니다. 그런 다음 페이지 위에서 레이블이나 버튼을 찾아야 합니다. 아마도 "Drivers"라는 레이블이 붙을 것입니다. 이 옵션을 찾으면 클릭해야 합니다.

See all articles