libsvm库简介及使用

2023-11-12

libsvm是基于支持向量机(support vector machine, SVM)实现的开源库,由台湾大学林智仁(Chih-Jen Lin)教授等开发,它主要用于分类(支持二分类和多分类)和回归。它的License是BSD-3-Clause,最新发布版本是v322。libsvm具有操作简单、易于使用、快速有效、且对SVM所涉及的参数调节相对较少的特点。Code地址: https://github.com/cjlin1/libsvm 

libsvm直接支持的开发语言包括:C++、java、matlab、python。C++主要包括两个文件,一个是头文件svm.h,一个是实现文件svm.cpp,将这两个文件加入到工程中就可以使用libsvm了。

在windows平台下,可以直接使用libsvm/windows目录下已经编译好的执行文件。

关于支持向量机的基础介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/78326704 

libsvm中支持的svm类型包括:C-SVC(multi-class classification)、nu-SVC(multi-class classification)、one-class SVM、epsilon-SVR(regression)、nu-SVR(regression);支持的kernel类型包括:linear(u’*v)、polynomial((gamma*u’*v+coef0)^degree)、radial basis function(径向基, exp(-gamma*|u-v|^2))、sigmoid(tanh(gamma*u’*v+coef0))、precomputed kernel(kernel values in training_set_file)。libsvm中需要的参数虽然较多,但是绝大多数都有其默认值。

libsvm中对数据集进行缩放的目的在于:避免一些特征值范围过大而另一些特征值范围过小;避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。通常将数据缩放到[-1, 1]或[0, 1]之间。

libsvm使用一般步骤:

(1)、按照libsvm所要求的格式准备数据集;

(2)、对数据进行简单的缩放操作;

(3)、考虑选用RBF(radial basis function)核参数;

(4)、如果选用RBF,通过libsvm/tools/grid.py采用交叉验证获取最佳参数C与gamma;

(5)、采用最佳参数C与g对整个训练集进行训练获取支持向量机模型;

(6)、利用获取的模型进行测试与预测。

测试代码执行步骤:

(1)、训练和测试数据采用UCI/Liver-disorders( https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html#liver-disorders ):二分类、训练样本为145、测试样本为200、特征长度为5,分别保存为liver-disorders_train.txt、liver-disorders_predict.txt;

(2)、通过libsvm/tools/checkdata.py来验证liver-disorders数据集是否满足libsvm所要求的数据格式(注:在windows下,此两个.txt文件编码格式要由utf-8改为ansi,否则执行checkdata.py会有errror),执行结果如下:


(3)、调用test_libsvm_scale函数对liver-disorders_train.txt进行缩放操作,并保存scale后的数据liver-disorders_train_scale.txt,并通过checkdata.py验证数据格式;

(4)、通过liver-disorders_train_scale.txt文件调用libsvm/tools/grid.py生成最优参数C和gamma,执行结果如下:


(5)、train,生成svm.model文件,执行结果如下,与libsvm/windows/svm-train.exe执行结果完全一致:


(6)、predict,执行结果如下,与libsvm/windows/svm-predict.exe执行结果完全一致:


以下二分类测试代码是参考libsvm中的svm-scale.c、svm-train.c、svm-predict.c:

#include "libsvm.hpp"
#include <iostream>
#include <limits>
#include <algorithm>
#include <fstream>
#include "svm.h"
#include "common.hpp"

#define Malloc(type,n) (type *)malloc((n)*sizeof(type))

static char* readline(FILE* input, int& max_line_len, char** line)
{
	if (fgets(*line, max_line_len, input) == nullptr) return nullptr;

	int len{ 0 };
	while (strrchr(*line, '\n') == nullptr) {
		max_line_len *= 2;
		*line = (char *)realloc(*line, max_line_len);
		len = (int)strlen(*line);
		if (fgets(*line + len, max_line_len - len, input) == nullptr) break;
	}

	return *line;
}

static void output(const double* feature_max, const double* feature_min, double lower, double upper, long int& new_num_nonzeros, int index, double value, std::ofstream& out_file)
{
	/* skip single-valued attribute */
	if (feature_max[index] == feature_min[index]) return;

	if (value == feature_min[index]) value = lower;
	else if (value == feature_max[index]) value = upper;
	else value = lower + (upper - lower) * (value - feature_min[index]) / (feature_max[index] - feature_min[index]);

	if (value != 0) {
		//fprintf(stdout, "%d:%g ", index, value);
		out_file << index << ":" << value<<" ";
		new_num_nonzeros++;
	}
}

int test_libsvm_scale(const char* input_file_name, const char* output_file_name)
{
	// reference: libsvm/svm-scale.c
	const double lower{ -1. }, upper{ 1. }; // lower: x scaling lower limit(default -1); upper: x scaling upper limit(default +1)
	const double y_lower{ 0. }, y_upper{ 1. }, y_scaling{ 0. }; // y scaling limits (default: no y scaling)
	double y_max{ std::numeric_limits<double>::max() };
	double y_min{ std::numeric_limits<double>::lowest() };
	char* line{ nullptr };
	int max_line_len{ 1024 };
	double* feature_max{ nullptr };
	double* feature_min{ nullptr };
	int max_index{ 0 }, min_index{ 0 }, index{ 0 };
	long int num_nonzeros{ 0 }, new_num_nonzeros{ 0 };

	FILE* fp = fopen(input_file_name, "r");
	CHECK(nullptr != fp);

	line = (char *)malloc(max_line_len * sizeof(char));

#define SKIP_TARGET \
	while (isspace(*p)) ++p; \
	while (!isspace(*p)) ++p;

#define SKIP_ELEMENT \
	while (*p != ':') ++p; \
	++p; \
	while (isspace(*p)) ++p; \
	while (*p && !isspace(*p)) ++p;

	// pass 1: find out max index of attributes
	max_index = 0;
	min_index = 1;

	while (readline(fp, max_line_len, &line) != nullptr) {
		char* p = line;

		SKIP_TARGET

		while (sscanf(p, "%d:%*f", &index) == 1) {
			max_index = std::max(max_index, index);
			min_index = std::min(min_index, index);
			SKIP_ELEMENT
			num_nonzeros++;
		}
	}
	CHECK(min_index >= 1);

	rewind(fp);

	feature_max = (double *)malloc((max_index + 1)* sizeof(double));
	feature_min = (double *)malloc((max_index + 1)* sizeof(double));
	CHECK(feature_max != nullptr && feature_min != nullptr);

	for (int i = 0; i <= max_index; ++i) {
		feature_max[i] = std::numeric_limits<double>::lowest();
		feature_min[i] = std::numeric_limits<double>::max();
	}

	// pass 2: find out min/max value
	while (readline(fp, max_line_len, &line) != nullptr) {
		char *p = line;
		int next_index = 1;
		double target;
		double value;

		CHECK(sscanf(p, "%lf", &target) == 1);
		y_max = std::max(y_max, target);
		y_min = std::min(y_min, target);

		SKIP_TARGET

		while (sscanf(p, "%d:%lf", &index, &value) == 2) {
			for (int i = next_index; i<index; ++i) {
				feature_max[i] = std::max(feature_max[i], 0.);
				feature_min[i] = std::min(feature_min[i], 0.);
			}

			feature_max[index] = std::max(feature_max[index], value);
			feature_min[index] = std::min(feature_min[index], value);

			SKIP_ELEMENT
			next_index = index + 1;
		}

		for (int i = next_index; i <= max_index; ++i) {
			feature_max[i] = std::max(feature_max[i], 0.);
			feature_min[i] = std::min(feature_min[i], 0.);
		}
	}

	rewind(fp);

	std::ofstream out_file(output_file_name);
	CHECK(out_file);

	// pass 3: scale
	while (readline(fp, max_line_len, &line) != nullptr) {
		char *p = line;
		int next_index = 1;
		double target;
		double value;

		CHECK(sscanf(p, "%lf", &target) == 1);
		//fprintf(stdout, "%g ", target);
		out_file << target << " ";

		SKIP_TARGET

		while (sscanf(p, "%d:%lf", &index, &value) == 2) {
			for (int i = next_index; i<index; ++i)
				output(feature_max, feature_min, lower, upper, new_num_nonzeros, i, 0, out_file);

			output(feature_max, feature_min, lower, upper, new_num_nonzeros, index, value, out_file);

			SKIP_ELEMENT
			next_index = index + 1;
		}

		for (int i = next_index; i <= max_index; ++i)
			output(feature_max, feature_min, lower, upper, new_num_nonzeros, i, 0, out_file);
		//fprintf(stdout, "\n");
		out_file << std::endl;
	}

	CHECK(new_num_nonzeros <= num_nonzeros);

	free(line);
	free(feature_max);
	free(feature_min);
	fclose(fp);
	out_file.close();

	return 0;
}

static int read_problem(const char* input_file_name, svm_problem& prob, int& max_line_len, svm_parameter& param, char** line, svm_node** x_space)
{
	int max_index, inst_max_index;
	size_t elements, j;
	char* endptr;
	char *idx, *val, *label;

	FILE* fp = fopen(input_file_name, "r");
	CHECK(fp != nullptr);

	prob.l = 0;
	elements = 0;

	max_line_len = 1024;
	*line = Malloc(char, max_line_len);

	while (readline(fp, max_line_len, line) != nullptr) {
		char *p = strtok(*line, " \t"); // label

		// features
		while (1) {
			p = strtok(nullptr, " \t");
			if (p == nullptr || *p == '\n') // check '\n' as ' ' may be after the last feature
				break;
			++elements;
		}
		++elements;
		++prob.l;
	}
	rewind(fp);

	prob.y = Malloc(double, prob.l);
	prob.x = Malloc(struct svm_node *, prob.l);
	*x_space = Malloc(struct svm_node, elements);

	max_index = 0;
	j = 0;
	for (int i = 0; i<prob.l; i++) {
		inst_max_index = -1; // strtol gives 0 if wrong format, and precomputed kernel has <index> start from 0
		readline(fp, max_line_len, line);
		prob.x[i] = &(*x_space)[j];
		label = strtok(*line, " \t\n");
		CHECK(label != nullptr); // empty line

		prob.y[i] = strtod(label, &endptr);
		CHECK(!(endptr == label || *endptr != '\0'));

		while (1) {
			idx = strtok(nullptr, ":");
			val = strtok(nullptr, " \t");

			if (val == nullptr) break;

			errno = 0;
			(*x_space)[j].index = (int)strtol(idx, &endptr, 10);
			if (endptr == idx || errno != 0 || *endptr != '\0' || (*x_space)[j].index <= inst_max_index) {
				CHECK(0);
			} else {
				inst_max_index = (*x_space)[j].index;
			}

			errno = 0;
			(*x_space)[j].value = strtod(val, &endptr);
			if (endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr))) CHECK(0);

			++j;
		}

		if (inst_max_index > max_index) max_index = inst_max_index;
		(*x_space)[j++].index = -1;
	}

	if (param.gamma == 0 && max_index > 0) param.gamma = 1.0 / max_index;

	if (param.kernel_type == PRECOMPUTED) {
		for (int i = 0; i<prob.l; i++) {
			CHECK(prob.x[i][0].index == 0);
			if ((int)prob.x[i][0].value <= 0 || (int)prob.x[i][0].value > max_index) {
				CHECK(0);
			}
		}
	}

	fclose(fp);

	return 0;
}

int test_libsvm_two_classification_train()
{
	// reference: libsvm/svm-train.c
	const std::string input_file_name{ "E:/GitCode/NN_Test/data/database/liver-disorders/liver-disorders_train.txt" },
		output_file_name{ "E:/GitCode/NN_Test/data/database/liver-disorders/liver-disorders_train_scale.txt" },
		svm_model{"E:/GitCode/NN_Test/data/svm.model"};

	CHECK(0 == test_libsvm_scale(input_file_name.c_str(), output_file_name.c_str())); // data scale

	struct svm_parameter param = {};
	struct svm_problem prob = {};
	struct svm_model* model = nullptr;
	struct svm_node* x_space = nullptr;
	int cross_validation{ 0 };
	int nr_fold{0};
	char* line = nullptr;
	int max_line_len{0};

	param = { C_SVC, RBF, 3, 0.0078125, 0., 100, 1e-3, 512., 0, nullptr, nullptr, 0.5, 0.1, 1, 0 };

	CHECK(read_problem(output_file_name.c_str(), prob, max_line_len, param, &line, &x_space) == 0);
	CHECK(svm_check_parameter(&prob, ¶m) == nullptr);

	model = svm_train(&prob, ¶m);
	CHECK(svm_save_model(svm_model.c_str(), model) == 0);

	svm_free_and_destroy_model(&model);

	svm_destroy_param(¶m);
	free(prob.y);
	free(prob.x);
	free(x_space);
	free(line);

	return 0;
}

static int predict(FILE* input, FILE* output, const svm_model* model, int& max_line_len, char** line, int& max_nr_attr, svm_node** x)
{
	int correct = 0;
	int total = 0;
	double error = 0;
	double sump = 0, sumt = 0, sumpp = 0, sumtt = 0, sumpt = 0;

	int svm_type = svm_get_svm_type(model);
	int nr_class = svm_get_nr_class(model);
	double *prob_estimates = nullptr;
	int j;

	max_line_len = 1024;
	*line = (char *)malloc(max_line_len*sizeof(char));
	while (readline(input, max_line_len, line) != nullptr) {
		int i = 0;
		double target_label, predict_label;
		char *idx, *val, *label, *endptr;
		int inst_max_index = -1; // strtol gives 0 if wrong format, and precomputed kernel has <index> start from 0

		label = strtok(*line, " \t\n");
		CHECK(label != nullptr); // empty line

		target_label = strtod(label, &endptr);
		CHECK(!(endptr == label || *endptr != '\0'));

		while (1) {
			if (i >= max_nr_attr - 1) { // need one more for index = -1
				max_nr_attr *= 2;
				*x = (struct svm_node *) realloc(*x, max_nr_attr*sizeof(struct svm_node));
			}

			idx = strtok(nullptr, ":");
			val = strtok(nullptr, " \t");

			if (val == nullptr) break;

			errno = 0;
			(*x)[i].index = (int)strtol(idx, &endptr, 10);
			CHECK(!(endptr == idx || errno != 0 || *endptr != '\0' || (*x)[i].index <= inst_max_index));
			inst_max_index = (*x)[i].index;

			errno = 0;
			(*x)[i].value = strtod(val, &endptr);
			CHECK(!(endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr))));

			++i;
		}

		(*x)[i].index = -1;

		predict_label = svm_predict(model, *x);
		fprintf(output, "%g\n", predict_label);

		if (predict_label == target_label) ++correct;
		error += (predict_label - target_label)*(predict_label - target_label);
		sump += predict_label;
		sumt += target_label;
		sumpp += predict_label*predict_label;
		sumtt += target_label*target_label;
		sumpt += predict_label*target_label;
		++total;
	}

	fprintf(stdout, "Accuracy = %g%% (%d/%d) (classification)\n", (double)correct / total * 100, correct, total);

	return 0;
}

int test_libsvm_two_classification_predict()
{
	// reference: libsvm/svm-predict.c
	const std::string input_file_name{ "E:/GitCode/NN_Test/data/database/liver-disorders/liver-disorders_predict.txt" },
		scale_file_name{ "E:/GitCode/NN_Test/data/database/liver-disorders/liver-disorders_predict_scale.txt" },
		svm_model{ "E:/GitCode/NN_Test/data/svm.model" },
		predict_result_file_name{ "E:/GitCode/NN_Test/data/svm_predict_result.txt" };

	CHECK(0 == test_libsvm_scale(input_file_name.c_str(), scale_file_name.c_str())); // data scale

	struct svm_node* x = nullptr;
	int max_nr_attr = 64;
	struct svm_model* model = nullptr;
	int predict_probability = 0;
	char* line = nullptr;
	int max_line_len = 0;

	FILE* input = fopen(scale_file_name.c_str(), "r");
	CHECK(input != nullptr);

	FILE* output = fopen(predict_result_file_name.c_str(), "w");
	CHECK(output != nullptr);

	CHECK((model = svm_load_model(svm_model.c_str())) != nullptr);

	x = (struct svm_node *) malloc(max_nr_attr*sizeof(struct svm_node));

	CHECK(svm_check_probability_model(model) == 0);

	predict(input, output, model, max_line_len, &line, max_nr_attr, &x);

	svm_free_and_destroy_model(&model);
	free(x);
	free(line);
	fclose(input);
	fclose(output);

	return 0;
}

GitHubhttps://github.com/fengbingchun/NN_Test 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libsvm库简介及使用 的相关文章

  • 【阅读论文方法总结】

    1 快速浏览摘要 看是否有自己需要的东西 2 如果需要 github上查找相关论文代码 对照着论文进行阅读 这样效率高 能够快速理解
  • 图像识别中,目标分割、目标识别、目标检测和目标跟踪这几个方面区别是什么?+资料列表

    目标识别 深度学习进行目标识别的资源列表 转 https zhuanlan zhihu com p 26076489 以下转自 https www zhihu com question 36500536 作者 知乎用户 链接 https w
  • 深度学习知识体系学习大全 牛!!

    搬来了大牛的博客 点击直接前往 https www yuque com angsweet machine learning jian jie 配一张大牛的思维导图 具体内容点进去都能看到 数学 机器学习 语言 算法 深度学习 书籍推荐 东西
  • 基于Pytorch的模型推理

    训练部分说明 假设我们现在有两个文件 first file train py 用于训练模型 second file inference py 用于推理检测 在train py文件中我们使用了定义了一个类 里面声明了我的网络模型 例如 cla
  • 笔记︱几款多模态向量检索引擎:Faiss 、milvus、Proxima、vearch、Jina等

    转自 https zhuanlan zhihu com p 364923722 引用文章 7 的开篇 来表示什么是 向量化搜索 人工智能算法可以对物理世界的人 物 场景所产生各种非结构化数据 如语音 图片 视频 语言文字 行为等 进行抽象
  • 序列模型——自然语言处理与词嵌入(理论部分)

    1 词汇表征 深度学习已经给自然语言处理 Natural Language Process NLP 带来革命性的变革 其中一个很关键的概念是词嵌入 word embedding 这是语言表示的一种方式 可以让算法自动的了解一些类似的词 例如
  • 3D人体重建方法漫谈

    转自 https blog csdn net Asimov Liu article details 96442990 1 概述 2 模型匹配的方法 2 1SMPL Skinned Multi Person Linear model 模型 2
  • matlab神经网络工具箱函数汇总

    转自 http hi baidu com lingyin55 blog item 7a968ead11fe180c4b36d61e html 1 网络创建函数 newp 创建感知器网络 newlind 设计一线性层 newlin 创建一线性
  • word2vector学习笔记(一)

    word2vector学习笔记 一 最近研究了一下google的开源项目word2vector http code google com p word2vec 其实这玩意算是神经网络在文本挖掘的一项成功应用 本文是看了论文 Distribu
  • 一文看尽深度学习中的15种损失函数

    转自 https zhuanlan zhihu com p 377799012 在机器学习中 损失函数是代价函数的一部分 而代价函数则是目标函数的一种类型 1 Loss function 即损失函数 用于定义单个训练样本与真实值之间的误差
  • pytorch 入门 DenseNet

    知识点0 dense block的结构 知识点1 定义dense block 知识点2 定义DenseNet的主体 知识点3 add module 知识点 densenet是由 多个这种结构串联而成的 import torch import
  • window 7 平台上 MXNET 源码编译

    目的 本文主要描述怎么在windows上编译mxnet源码 得到可用的libmxnet dll和libmxnet lib文件 版本 mxnet x64 release CPU版 运行环境 windows 7 64bit visual stu
  • Dilated Conv and Deformable Conv. 空洞卷积和可变形卷积

    空洞卷积论文地址 https arxiv org pdf 1511 07122 pdf 可变形卷积论文地址 https arxiv org pdf 1703 06211 pdf 之前一直知道这两个方法 一直没时间看论文和实现 后面碰到越来越
  • 词向量的运算与Emoji生成器

    本文参考参考 没有对框架内容进行学习 旨在学习思路和方法 1 词向量运算 之前学习RNN和LSTM的时候 输入的语句都是一个向量 比如恐龙的名字那个例子就是将一个单词中的字母按顺序依次输入 这对于一个单词的预测是可行的 但是对于想让机器学习
  • 深度学习中的优化算法之Adam

    之前在https blog csdn net fengbingchun article details 124909910 介绍过深度学习中的优化算法Adadelta 这里介绍下深度学习的另一种优化算法Adam 论文名字为 ADAM A M
  • cs231n: How to Train a Neuron Network 如何训练神经网络

    CS231N第六第七课时的一些笔记 如何训练神经网络是一个比较琐碎的事情 所以整理了一下 以后训练Neuron Network的时候可以看一下 Activation Functions ReLu good ELU leaky ReLu no
  • 深度学习系统为什么容易受到对抗样本的欺骗?

    转自 https zhuanlan zhihu com p 89665397 本文作者 kurffzhou 腾讯 TEG 安全工程师 最近 Nature发表了一篇关于深度学习系统被欺骗的新闻文章 该文指出了对抗样本存在的广泛性和深度学习的脆
  • 损失函数和正则化

    参考 https www cnblogs com LXP Never p 10918704 html https blog csdn net Heitao5200 article details 83030465 https zhuanla
  • Matting(抠图)--用深度学习自动去除照片背景

    转自 https zhuanlan zhihu com p 38031181 https zhuanlan zhihu com p 151212267 现在又有一个 AI 能干 Photoshop 的活了 自动抠图 一键去除照片背景 这款
  • 谈一谈关于NLP的落地场景和商业价值

    欢迎大家关注微信公众号 baihuaML 白话机器学习 在这里 我们一起分享AI的故事 您可以在后台留言 关于机器学习 深度学习的问题 我们会选择其中的优质问题进行回答 本期的问题 你好 请问下nlp在现在的市场主要应用在哪些方面 什么是N

随机推荐

  • 链接、装载与库——编译与链接

    从第二章开始不再按照目录的顺序总结 而是将大块知识点总结在一起 第二章 编译和链接 集成开发环境 IDE 一般都将编译和链接的过程一步完成 此过程成为构建 Bulid 但其掩盖了系统软件运行机制 gcc hello c a out 一个可执
  • win10离线安装ros-melodic-desktop_full

    在线安装最容易出现安装包下载不了导致的安装失败问题 本篇文章续上篇在线安装 安装在线包 下载ros melodic desktop full 下载地址 ros melodic离线包下载地址 开始菜单中 右键 x64 Native Tools
  • Codeforces Round 875 (Div. 1) A. Copil Copac Draws Trees

    题意 Copil Copac 给定了一个由 n 1 条边组成的列表 该列表描述了一棵由 n 个顶点组成的树 他决定用下面的算法来绘制它 步骤 0 绘制第一个顶点 顶点1 转到步骤1 步骤 1 对于输入中的每一条边 依次 如果该边连接一个已经
  • 【完全开源】小安派-Cam-U 摄像头核心板

    一 概述 小安派 Cam U AiPi Cam U 是安信可开源团队专门为Ai M61 32S设计的一款开发板 支持WiFi6 BLE5 3 所搭载的Ai M61 32S 模组具有丰富的外设接口 具体包括 DVP MJPEG Dispaly
  • [4G&5G专题-120]:培训-跟小朋友聊通信

    用小孩子的语言与小朋友聊通信
  • 【算法 -- LeetCode】(025) K 个一组翻转链表

    1 题目 给你链表的头节点 head 每 k 个节点一组进行翻转 请你返回修改后的链表 k 是一个正整数 它的值小于或等于链表的长度 如果节点总数不是 k 的整数倍 那么请将最后剩余的节点保持原有顺序 你不能只是单纯的改变节点内部的值 而是
  • 什么是钩子函数

    钩子函数 钩子函数 钩子函数是在一个事件触发的时候 在系统级捕获到了他 然后做一些操作 一段用以处理系统消息的程序 钩子 就是在某个阶段给你一个做某些处理的机会 钩子函数 1 是个函数 在系统消息触发时被系统调用 2 不是用户自己触发的 钩
  • Highcharts中更新series的5种方法

    用Highcharts画图时 经常需要更新所画的图表 最常见的就是改变数据以更新图表 在Highcarts中 数据对应的参数是series 这儿就以图1的柱状图为例 列举如何更新series的5种方法 以供参考 源代码可从这儿访问 图1 1
  • 嵌入式Linux驱动开发(LCD屏幕专题)(四)

    单Buffer的缺点与改进方法 1 单Buffer的缺点 如果APP速度很慢 可以看到它在LCD上缓慢绘制图案 即使APP速度很高 LCD控制器不断从Framebuffer中读取数据来显示 而APP不断把数据写入Framebuffer 假设
  • [从零开始学DeepFaceLab-9]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 模型选择

    目录 总体流程 步骤6 模型的选择与训练 模型选择 6 1 模型的差别 6 2 SAEHD模型的超参数
  • spring-integration-redis中分布式锁RedisLockRegistry的使用

    pom依赖
  • Java技术从零到CTO路线图

    在技术方面无论我们怎么学习 总感觉需要提升自已不知道自己处于什么水平了 但如果有清晰的指示图供参考还是非常不错的 这样我们清楚的知道我们大概处于那个阶段和水平 Java程序员 高级特性 反射 泛型 注释符 自动装箱和拆箱 枚举类 可变 参数
  • 毕业设计-基于机器油菜虫害图像识别方法研究 -YOLO

    目录 前言 课题背景和意义 实现技术思路 相关基础理论与技术 1 人工神经网络 2 卷积神经网络 3 基于卷积神经网络的目标检测识别模型 4 YOLO 系列算法 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 韩式多用动态图(甜蜜女孩)

  • 离线在Jenkins安装CoBOT安装插件

    最近在某金融客户做POC 把CoBOT安装在Jenkins上面 当前Jenkins版本没有任何插件 安装后由于是云桌面没有连接互联网或已经设置访问策略 无法进行在线安装插件 所以只能下载插件后再安装 在网络上搜索Jenkins插件 下载到两
  • 【SpringCloud】application.yml和 bootstrap.yml 区别

    1 首先yml和properties文件都是属于配置文件 功能一样 主要是区别于application和bootstrap的加载顺序 Bootstrap yml bootstrap properties 在application yml a
  • caffe问题Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python

    caffe中输入层使用python时 出现问题 Check failed registry count type 1 0 vs 1 Unknown layer type Python 解决方法 在caffe目录下Makefile confi
  • va_start和va_end使用详解

    本文主要介绍va start和va end的使用及原理 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理 1 在C中 当我们无法列出传递函数的所有实参的类型和数目时 可以用省略号指定参数表 void foo void foo par
  • 手机抓包fiddler配置及使用教程

    本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意 Fiddler 是以代理web服务器的形式工作的 它使用代理地址 127 0 0 1 端口 8888 当Fiddler退出的时候它会自动注销 这样就不会影响别的 程序 不过
  • libsvm库简介及使用

    libsvm是基于支持向量机 support vector machine SVM 实现的开源库 由台湾大学林智仁 Chih Jen Lin 教授等开发 它主要用于分类 支持二分类和多分类 和回归 它的License是BSD 3 Claus