精华内容
下载资源
问答
  • 学习SVM(一) SVM模型训练与分类的OpenCV实现

    万次阅读 多人点赞 2017-03-29 21:47:52
    学习SVM(一) SVM模型训练与分类的OpenCV实现 学习SVM(二) 如何理解支持向量机的最大分类间隔 学习SVM(三)理解SVM中的对偶问题 学习SVM(四) 理解SVM中的支持向量(Support Vector)Andrew Ng 斯坦福大学...

    简介

    学习SVM(一) SVM模型训练与分类的OpenCV实现
    学习SVM(二) 如何理解支持向量机的最大分类间隔
    学习SVM(三)理解SVM中的对偶问题
    学习SVM(四) 理解SVM中的支持向量(Support Vector)
    学习SVM(五)理解线性SVM的松弛因子

    Andrew Ng 在斯坦福大学的机器学习公开课上这样评价支持向量机:
    support vector machines is the supervised learning algorithm that many people consider the most effective off-the-shelf supervised learning algorithm.That point of view is debatable,but there are many people that hold that point of view.

    可见,在监督学习算法中支持向量机有着非常广泛的应用,而且在解决图像分类问题时有着优异的效果。

    OpenCV集成了这种学习算法,它被包含在ml模块下的CvSVM类中,下面我们用OpenCV实现SVM的数据准备模型训练加载模型实现分类,为了理解起来更加直观,我们用三个工程来实现。

    数据准备

    在OpenCV的安装路径下,搜索digits,可以得到一张图片,图片大小为10002000,有0-9的10个数字,每5行为一个数字,总共50行,共有5000个手写数字,每个数字块大小为2020。 下面将把这些数字中的0和1作为二分类的准备数据。其中0有500张,1有500张。
    用下面的代码将图片准备好,在写入路径提前建立好文件夹:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    	char ad[128]={0};
    	int  filename = 0,filenum=0; 
    	Mat img = imread("digits.png");
    	Mat gray;
    	cvtColor(img, gray, CV_BGR2GRAY);
    	int b = 20;
    	int m = gray.rows / b;   //原图为1000*2000
    	int n = gray.cols / b;   //裁剪为5000个20*20的小图块
    
    	for (int i = 0; i < m; i++)
    	{
    		int offsetRow = i*b;  //行上的偏移量
    		if(i%5==0&&i!=0)
    		{
    			filename++;
    			filenum=0;
    		}
    		for (int j = 0; j < n; j++)
    		{
    			int offsetCol = j*b; //列上的偏移量
    			sprintf_s(ad, "D:\\data\\%d\\%d.jpg",filename,filenum++);
    			//截取20*20的小块
    			Mat tmp;
    			gray(Range(offsetRow, offsetRow + b), Range(offsetCol, offsetCol + b)).copyTo(tmp);
    			imwrite(ad,tmp);
    		}
    	}
    	return 0;
    }
    

    最后可以得到这样的结果:
    这里写图片描述
    组织的二分类数据形式为:

    --D:
      --data
        --train_image
          --0(400张)
          --1(400张)
        --test_image
          --0(100张)
          --1(100张)
    

    这里写图片描述
    训练数据800张,0,1各400张;测试数据200张,0,1各100张

    模型训练

    数据准备完成之后,就可以用下面的代码训练了:

    #include <stdio.h>  
    #include <time.h>  
    #include <opencv2/opencv.hpp>  
    #include <opencv/cv.h>  
    #include <iostream> 
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/ml/ml.hpp>  
    #include <io.h>
    
    using namespace std;
    using namespace cv;
    
    void getFiles( string path, vector<string>& files);
    void get_1(Mat& trainingImages, vector<int>& trainingLabels);
    void get_0(Mat& trainingImages, vector<int>& trainingLabels);
    
    int main()
    {
    	//获取训练数据
    	Mat classes;
    	Mat trainingData;
    	Mat trainingImages;
    	vector<int> trainingLabels;
    	get_1(trainingImages, trainingLabels);
    	get_0(trainingImages, trainingLabels);
    	Mat(trainingImages).copyTo(trainingData);
    	trainingData.convertTo(trainingData, CV_32FC1);
    	Mat(trainingLabels).copyTo(classes);
    	//配置SVM训练器参数
    	CvSVMParams SVM_params;
    	SVM_params.svm_type = CvSVM::C_SVC;
    	SVM_params.kernel_type = CvSVM::LINEAR; 
    	SVM_params.degree = 0;
    	SVM_params.gamma = 1;
    	SVM_params.coef0 = 0;
    	SVM_params.C = 1;
    	SVM_params.nu = 0;
    	SVM_params.p = 0;
    	SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
    	//训练
    	CvSVM svm;
    	svm.train(trainingData, classes, Mat(), Mat(), SVM_params);
    	//保存模型
    	svm.save("svm.xml");
    	cout<<"训练好了!!!"<<endl;
    	getchar();
    	return 0;
    }
    void getFiles( string path, vector<string>& files )  
    {  
    	long   hFile   =   0;  
    	struct _finddata_t fileinfo;  
    	string p;  
    	if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    	{  
    		do  
    		{  
    			if((fileinfo.attrib &  _A_SUBDIR))  
    			{  
    				if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
    					getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
    			}  
    			else  
    			{  
    				files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
    			}  
    		}while(_findnext(hFile, &fileinfo)  == 0);  
    
    		_findclose(hFile);  
    	}  
    } 
    void get_1(Mat& trainingImages, vector<int>& trainingLabels)
    {
    	char * filePath = "D:\\data\\train_image\\1"; 
    	vector<string> files;  
    	getFiles(filePath, files );  
    	int number = files.size();  
    	for (int i = 0;i < number;i++)  
    	{  
    		Mat  SrcImage=imread(files[i].c_str());
    		SrcImage= SrcImage.reshape(1, 1);
    		trainingImages.push_back(SrcImage);
    		trainingLabels.push_back(1);
    	}  
    }
    void get_0(Mat& trainingImages, vector<int>& trainingLabels)
    {
    	char * filePath = "D:\\data\\train_image\\0"; 
    	vector<string> files;  
    	getFiles(filePath, files );  
    	int number = files.size();  
    	for (int i = 0;i < number;i++)  
    	{  
    		Mat  SrcImage=imread(files[i].c_str());
    		SrcImage= SrcImage.reshape(1, 1);
    		trainingImages.push_back(SrcImage);
    		trainingLabels.push_back(0);
    	}  
    }
    

    整个训练过程可以分为一下几个部分:
    数据准备:
    该例程中一个定义了三个子程序用来实现数据准备工作:
    getFiles()用来遍历文件夹下所有文件,可以参考:
    http://blog.csdn.net/chaipp0607/article/details/53914954
    getBubble()用来获取有气泡的图片和与其对应的Labels,该例程将Labels定为1。
    getNoBubble()用来获取没有气泡的图片与其对应的Labels,该例程将Labels定为0。
    getBubble()与getNoBubble()将获取一张图片后会将图片(特征)写入到容器中,紧接着会将标签写入另一个容器中,这样就保证了特征和标签是一一对应的关系push_back(0)或者push_back(1)其实就是我们贴标签的过程。

    trainingImages.push_back(SrcImage);
    trainingLabels.push_back(0);
    

    在主函数中,将getBubble()与getNoBubble()写好的包含特征的矩阵拷贝给trainingData,将包含标签的vector容器进行类型转换后拷贝到trainingLabels里,至此,数据准备工作完成,trainingData与trainingLabels就是我们要训练的数据。

    	Mat classes;
    	Mat trainingData;
    	Mat trainingImages;
    	vector<int> trainingLabels;
    	getBubble(trainingImages, trainingLabels);
    	getNoBubble(trainingImages, trainingLabels);
    	Mat(trainingImages).copyTo(trainingData);
    	trainingData.convertTo(trainingData, CV_32FC1);
    	Mat(trainingLabels).copyTo(classes);
    

    特征选取
    其实特征提取和数据的准备是同步完成的,我们最后要训练的也是正负样本的特征。本例程中同样在getBubble()与getNoBubble()函数中完成特征提取工作,只是我们简单粗暴将整个图的所有像素作为了特征,因为我们关注更多的是整个的训练过程,所以选择了最简单的方式完成特征提取工作,除此中外,特征提取的方式有很多,比如LBP,HOG等等。

      SrcImage= SrcImage.reshape(1, 1);
    

    我们利用reshape()函数完成特征提取,原型如下:

     Mat reshape(int cn, int rows=0) const;
    

    可以看到该函数的参数非常简单,cn为新的通道数,如果cn = 0,表示通道数不会改变。参数rows为新的行数,如果rows = 0,表示行数不会改变。我们将参数定义为reshape(1, 1)的结果就是原图像对应的矩阵将被拉伸成一个一行的向量,作为特征向量。
    参数配置
    参数配置是SVM的核心部分,在Opencv中它被定义成一个结构体类型,如下:

    struct CV_EXPORTS_W_MAP CvSVMParams
    {
        CvSVMParams();
        CvSVMParams(  
        int svm_type, 
        int kernel_type,
        double degree, 
        double coef0,
        double Cvalue, 
        double p,
        CvMat* class_weights, 
        CvTermCriteria term_crit );
        CV_PROP_RW int         svm_type;
        CV_PROP_RW int         kernel_type;
        CV_PROP_RW double      degree; // for poly
        CV_PROP_RW double      gamma;  // for poly/rbf/sigmoid
        CV_PROP_RW double      coef0;  // for poly/sigmoid
        CV_PROP_RW double      C;  // for CV_SVM_C_SVC,       CV_SVM_EPS_SVR and CV_SVM_NU_SVR
        CV_PROP_RW double      nu; // for CV_SVM_NU_SVC, CV_SVM_ONE_CLASS, and CV_SVM_NU_SVR
        CV_PROP_RW double      p; // for CV_SVM_EPS_SVR
        CvMat*      class_weights; // for CV_SVM_C_SVC
        CV_PROP_RW CvTermCriteria term_crit; // termination criteria
    };
    

    所以在例程中我们定义了一个结构体变量用来配置这些参数,而这个变量也就是CVSVM类中train函数的第五个参数,下面对参数进行说明。
    SVM_params.svm_type :SVM的类型:
    C_SVC表示SVM分类器,C_SVR表示SVM回归
    SVM_params.kernel_type:核函数类型
    线性核LINEAR:
    d(x,y)=(x,y)
    多项式核POLY:
    d(x,y)=(gamma*(x’y)+coef0)degree
    径向基核RBF:
    d(x,y)=exp(-gamma*|x-y|^2)
    sigmoid核SIGMOID:
    d(x,y)= tanh(gamma*(x’y)+ coef0)

    SVM_params.degree:核函数中的参数degree,针对多项式核函数;
    SVM_params.gama:核函数中的参数gamma,针对多项式/RBF/SIGMOID核函数;
    SVM_params.coef0:核函数中的参数,针对多项式/SIGMOID核函数;
    SVM_params.c:SVM最优问题参数,设置C-SVCEPS_SVRNU_SVR的参数;
    SVM_params.nu:SVM最优问题参数,设置NU_SVCONE_CLASSNU_SVR的参数;
    SVM_params.p:SVM最优问题参数,设置EPS_SVR 中损失函数p的值.
    训练模型

    CvSVM svm;
    svm.train(trainingData, classes, Mat(), Mat(), SVM_params);
    

    通过上面的过程,我们准备好了待训练的数据和训练需要的参数,**其实可以理解为这个准备工作就是在为svm.train()函数准备实参的过程。**来看一下svm.train()函数,Opencv将SVM封装成CvSVM库,这个库是基于台湾大学林智仁(Lin Chih-Jen)教授等人开发的LIBSVM封装的,由于篇幅限制,不再全部粘贴库的定义,所以一下代码只是CvSVM库中的一部分数据和函数:

    class CV_EXPORTS_W CvSVM : public CvStatModel
    {
    public:
    virtual bool train( 
      const CvMat* trainData, 
      const CvMat* responses,
      const CvMat* varIdx=0, 
      const CvMat* sampleIdx=0,
      CvSVMParams params=CvSVMParams() );
    virtual float predict( 
      const CvMat* sample, 
      bool returnDFVal=false ) const;
    

    我们就是应用类中定义的train函数完成模型训练工作。
    保存模型

    svm.save("svm.xml");
    

    保存模型只有一行代码,利用save()函数,我们看下它的定义:

        CV_WRAP virtual void save( const char* filename, const char* name=0 ) const;
    

    该函数被定义在CvStatModel类中,CvStatModel是ML库中的统计模型基类,其他 ML 类都是从这个类中继承。

    **总结:**到这里我们就完成了模型训练工作,可以看到真正用于训练的代码其实很少,OpenCV最支持向量机的封装极大地降低了我们的编程工作。

    加载模型实现分类

    #include <stdio.h>  
    #include <time.h>  
    #include <opencv2/opencv.hpp>  
    #include <opencv/cv.h>  
    #include <iostream> 
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/ml/ml.hpp>  
    #include <io.h>
    
    using namespace std;
    using namespace cv;
    
    void getFiles( string path, vector<string>& files );
    
    int main()
    {
    	int result = 0;
    	char * filePath = "D:\\data\\test_image\\0"; 
    	vector<string> files;  
    	getFiles(filePath, files );  
    	int number = files.size();  
    	cout<<number<<endl;
    	CvSVM svm;
    	svm.clear();
    	string modelpath = "svm.xml";
    	FileStorage svm_fs(modelpath,FileStorage::READ);
    	if(svm_fs.isOpened())
    	{
    		svm.load(modelpath.c_str());
    	}
    	for (int i = 0;i < number;i++)  
    	{  
    		Mat inMat = imread(files[i].c_str());
    		Mat p = inMat.reshape(1, 1);
    		p.convertTo(p, CV_32FC1);
    		int response = (int)svm.predict(p);
    		if (response == 0)
    		{
    			result++;
    		}
    	}
    	cout<<result<<endl;
    	getchar();
    	return  0;
    }
    void getFiles( string path, vector<string>& files )  
    {  
    	long   hFile   =   0;  
    	struct _finddata_t fileinfo;  
    	string p;  
    	if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    	{  
    		do  
    		{  
    			if((fileinfo.attrib &  _A_SUBDIR))  
    			{  
    				if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
    					getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
    			}  
    			else  
    			{  		files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
    			}  
    		}while(_findnext(hFile, &fileinfo)  == 0);  
    		_findclose(hFile);  
    	}  
    } 
    

    在上面我们把该介绍的都说的差不多了,这个例程中只是用到了load()函数用于模型加载,加载的就是上面例子中生成的模型,load()被定义在CvStatModel这个基类中:

    	svm.load(modelpath.c_str());
    

    load的路径是string modelpath = "svm.xml",这意味着svm.mxl文件应该在测试工程的根目录下面,但是因为训练和预测是两个独立的工程,所以必须要拷贝一下这个文件。最后用到predict()函数用来预测分类结果,predict()被定义在CVSVM类中。

    注意:

    1.为什么要建立三个独立的工程呢?
    主要是考虑写在一起话,代码量会比较大,逻辑没有分开清晰,当跑通上面的代码之后,就可以随意的改了。
    2.为什么加上数据准备?
    之前有评论说道数据的问题,提供数据后实验能更顺利一些,因为本身代码没有什么含金量,这样可以更顺利的运行起来工程,并修改它。
    3.一些容易引起异常的情况:
    (1):注意生成的.xml记得拷贝到预测工程下;
    (2):注意准备好数据路径和代码是不是一致;
    (3):注意训练的特征要和测试的特征一致;

    展开全文
  • 什么是端到端的训练学习

    万次阅读 多人点赞 2019-06-05 15:03:14
    传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,分类器设计等若干步骤。... 深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模...

              传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,分类器设计等若干步骤。分治法的动机是将图像识别的母问题分解为简单、可控且清晰的若干小的子问题。不过分步解决子问题时,尽管可以在子问题上得到最优解,但子问题上的最优解并不意味着就能得到全局问题的最后解。

          深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据到期望输出的映射。

           对深度模型而言,其输入数据是未经任何人为加工的原始样本形式,后续则是堆叠在输入层上的众多操作层,这些操作层整体可以看作一个复杂的函数FCNN, 最终的损失函数由数据损失data loss和模型参数的正则化损失(regularization loss)共同组成,模型深度的训练则是在最终损失驱动下对模型进行参数更新并将误差反向传播至网络各层。

     

    展开全文
  • 深度学习训练过程训练的是什么

    千次阅读 2019-03-14 18:16:16
    本文来解释一下深度学习训练过程训练的是什么,换句话说,训练生成的模型文件里记录的是什么。 先笼统回答一下,记录的是网络节点的权重、偏置等参数。不懂网络节点指的是什么的话接着看下文。 先看一个常见的卷积...

    本文来解释一下深度学习训练过程训练的是什么,换句话说,训练生成的模型文件里记录的是什么。
    先笼统回答一下,记录的是网络节点的权重、偏置等参数。不懂网络节点指的是什么的话接着看下文。
    先看一个常见的卷积网络层:

    layer {
      
    	name: "conv1"
      
    	type: "Convolution"
      
    	bottom: "conv1a"
      
    	top: "conv2a"
      
    	param {
        
    		lr_mult: 1    
    		decay_mult: 1
     
    	 }
      
    	param {
        
    		lr_mult: 1    
    		decay_mult: 0
      
    	}
      
    	convolution_param {
        
    		num_output: 96
        
    		pad: 2
        
    		kernel_size: 5
        
    		stride: 2
        
    		weight_filler {
          
    			type: "msra"
        
    			}
        
    		bias_filler {
          
    			type: "constant"
        
    			}
        
    		engine: CUDNN
      
    	}
    
    }

    卷积层num_output为96,要生成96个map,每个map是不同卷积核在bottom的每个map上进行卷积,并将每个对应位置上的值相加然后再加上一个偏置项。
    在反向传播过程中,若第x层的a节点通过权值W对x+1层的b节点有贡献,则在反向传播过程中,梯度通过权值W从b节点传播回a节点。其中a节点,就比如上述卷积网络中bottom conv1a中某个map上的某个像素,b节点就比如top conv2a中某个map上的某个像素。
     

    展开全文
  • 传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,...深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据期望输出的...

    传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,分类器设计等若干步骤。分治法的动机是将图像识别的母问题分解为简单、可控且清晰的若干小的子问题。不过分步解决子问题时,尽管可以在子问题上得到最优解,但子问题上的最优解并不意味着就能得到全局问题的最后解。

    深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据到期望输出的映射。两者相比,端到端的学习省去了在每一个独立学习任务执行之前所做的数据标注,为样本做标注的代价是昂贵的、易出错的。

    对深度模型而言,其输入数据是未经任何人为加工的原始样本形式,后续则是堆叠在输入层上的众多操作层,这些操作层整体可以看作一个复杂的函数FCNN, 最终的损失函数由数据损失data loss和模型参数的正则化损失(regularization loss)共同组成,模型深度的训练则是在最终损失驱动下对模型进行参数更新并将误差反向传播至网络各层。

     

    展开全文
  • 训练模型&迁移学习

    千次阅读 2020-05-11 17:01:31
    当预训练模型学习到的特征容易泛化的时候,迁移学习才能得到比较有效的使用 迁移学习一个基础的数据集上进行任务的训练,生成一个基础网络 然后将学习到的特征重新进行调整或迁移另一个目标网络上,用来训练...
  • 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多...
  • 阅读基于深度卷积神经网络的图像识别、分类或检测的文献时经常看到“patch”,不是很能理解,后来就总结了一下。 通过阅读,“patch”似乎是CNN输入...CNN学习训练过程中,不是一次来处理一整张图片,而是先...
  • 机器学习当中,什么训练什么是模型?   通过已知的数据和目标,调节算法的参数,这就是训练; 最后得到的映射,就是针对这个问题被训练出来的模型。
  • CIFAR-10 Caffe上训练学习

    千次阅读 2015-12-22 17:38:09
    参考caffe官网... 1. CIFAR-10是什么? Cifar-10是由Hinton的两个大弟子Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的数据集。Cifar是加拿大牵头投资的一个先进科学项目研究所。Hint
  • Pytorch迁移学习加载部分预训练权重

    万次阅读 2019-03-16 15:18:41
    迁移学习在图像分类领域非常常见,利用超大数据集上训练得到的网络权重,迁移自己的数据上进行训练可以节约大量的训练时间,降低欠拟合/过拟合的风险。 如果用原生网络进行迁移学习非常简单,其核心是 model....
  • 离线学习(训练)和在线学习(训练)

    千次阅读 2019-08-26 10:46:43
    https://blog.csdn.net/a133521741/article/details/79221015
  • 针对预训练模型对于个性化图片分类准确度很低,应用了迁移学习的方法,在训练集照片达到30张时,测试集上就能达到80以上的正确率。 一:研究背景 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)...
  • 利用迁移学习,不是从零开始学习,而是从之前解决各种问题时学到的模式开始。这样,你就可以利用以前的学习成果(例如VGG、 Inception、MobileNet),避免从零开始。我们把它看作是站巨人的肩膀上。 计算机视觉...
  • 但是经常说的训练函数、学习函数还有性能函数分别指的是什么? 例如以下例子:“ 设定网络隐层和输出层激励函数分别为tansig和logsig函数, 网络训练函数为traingdx, 网络性能函数为mse,隐层神经元数初设为6。...
  • 一文读懂迁移学习和预训练

    千次阅读 多人点赞 2018-12-04 16:04:15
    引言跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么?贵。尤其是当我们尝试处理...庆幸的是,有一种叫做“迁移学习”的方式,可以使我们他人训练过的模型基础上进行小改动便可投入使用。...
  • 传统机器学习的流程往往由多个独立的模块组成,比如一个典型的自然语言处理(Natural Language Processing)问题中,包括分词、词性标注、句法分析、语义分析等多个独立步骤,每个步骤是一个独立的任务,其结果的...
  • 机器学习之分类学习(模型训练

    千次阅读 2017-08-29 13:28:04
    完成数据的预处理,接下进入分类学习中的重点–模型训练前面我们得到了一批数据,现在我们需要从中提取出一部分数据作为我们训练的数据,当然我们也可以把全部的数据作为我们训练的数据,但是如果我们把全部的...
  • TensorFlow学习:多线程训练

    千次阅读 2018-06-18 21:50:07
    最近在学TensorFlow,此把学到的东西记录一下。在学习别人代码时,遇到多线程训练的问题,代码截取部分如下:image, label = ReadMyOwnData.read_and_decode("dog_and_cat_train.tfrecords") sess = tf....
  • python的图像识别 用opencv或是dlib进行识别 如何进行自动训练或是自动学习呢? 有没有相关的资料或是教程 能有详细的demo最好 例如 识别这个杯子 学习训练后再一大堆杯子中能识别出学习的那个杯子
  • 机器学习中大概有如下步骤:  确定模型----训练模型----使用模型。 模型简单说可以理解为函数。 确定模型是说自己认为这些数据的特征符合哪个函数。 训练模型就是用已有的数据,通过一些方法(最优化或者其他方法)...
  • 本文记录利用resnet18预训练模型进行迁移学习自己的训练数据集上进行重新训练。相关代码重点部分分别介绍如下: model=torchvision.models.resnet18(pretrained=True) num_features=model.fc.in_features ...
  • " 证明进行迁移学习得到的虹膜识别模型性能高于自己训练的模型。 所以我想尝试微调ImageNet上预训练的ResNet模型进行虹膜识别 两种迁移学习方法 pytorchresnet18上进行迁移学习的两种常用方式 预训练的网络...
  • GAN的学习 - 实际的训练过程

    千次阅读 2020-08-24 21:10:09
    前面的文章中,了解了GAN的基础知识,同时介绍了实际代码(如何利用GAN来生成MNIST的数据),前面两篇文章中,进行了具体的基础知识铺垫,但是我实际的训练过程中,也感受了GAN训练不稳定。本篇文章从这个角度来...
  • 增强学习训练AI玩游戏

    千次阅读 2017-02-13 09:58:04
    左为高速学习模式,右为正常玩模式 2.游戏简介 符号A为 AI Agent。 符号@为金币,AI Agent需要尽可能的接取。 符号* 为炸弹,AI Agent需要尽可能的躲避。 游戏下方一组数字含义如下: Bomb hit: 代表目前AI ...
  • 多视角学习-协同训练

    千次阅读 2016-10-08 15:57:46
     传统的有监督学习中,我们通过训练大量有标记数据得到一个强学习器,然后预测一个未知样例。而现实生活中,通常数据集中大量数据是无标记的,只有很少一部分是有标记的。比如电子商务系统中,我们需要推荐用户...
  • 训练、迁移学习和微调理解

    千次阅读 2020-04-24 11:07:12
    1.迁移学习 为了对迁移学习产生一个直观的认识,不妨拿老师与学生之间的关系做类比。 一位老师通常ta所教授的领域有着多年丰富的经验,这些积累的基础上,老师们能够课堂上...这些权重能够被提取出来,迁移...
  • 用自己训练的AI玩王者荣耀是什么体验?

    万次阅读 多人点赞 2021-01-08 13:06:52
    一、前言 ...用自己训练的AI玩王者荣耀是什么体验? 视频两倍速播放,只训练了一个「后裔」英雄,如果想用其他英雄,可以自己训练。 今天继续手把手教学,你准备好了吗? 二、实现原理 为了让我.
  • 那么PyTorch如何在训练时固定底层只更新上层呢?这意味着我们希望反向传播计算梯度时,我们只希望计算最上面的卷积层,对于卷积层,我们并不希望计算梯度并用梯度来更新参数。 我们知道,网络中的所有操作对象都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 669,967
精华内容 267,986
关键字:

在训练学到什么