调整cnn网络结构需要增加或者减少layer的层数,并且更改layer的类型,比如在现有的conv层和pooling层后面继续增加conv层和pooling层,目的是为了提取更高层次的特征。当然你也可以增加全连接层数目(那么做训练会变慢--、),修改激活函数和填充器类型。建议你还是使用caffe中自带的cifar10_quick和caffenet进行训练,然后针对你的数据修改相应的网络参数和solver参数。
不是。稀疏自编码器(SparseAutoencoder)可以自动从无标注数据中学习特征,可以给出比原始数据更好的特征描述,和深度学习不是同一个方向,深度学习是指多层的人工神经网络和训练它的方法。
常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。
一 颜色特征
(一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。
(二)常用的特征提取与匹配方法
(1) 颜色直方图
其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。
最常用的颜色空间:RGB颜色空间、HSV颜色空间。
颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。
(2) 颜色集
颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系
采样率,我们直每看到的一副画面都是上亿像素的,我们的大脑很难像电脑那样直接存储。研究表明,我们将每一副图像都提取出很少的信息用于存储是可行的。我们把它叫做稀疏编码,即Sparse Coding把稀疏编码的方法运用到分类中的机器学习方法,就叫做SRC即采样率,采样率越高分辨率也越高,保真度越高,但数据量也越大,所以根据需要取适当值即可。
datastructh
typedef struct list
{
int c; //多项式的项数
int e; //多项式的指数
struct list next; //下一结点
};
typedef struct list LinkList;
typedef struct list Node;
下面是线性表的 *** 作相关函数声明,对应文件ListOperh:
//File: ListOperh
#ifndef DATASTRUCT
#define DATASTRUCT
#include "datastructh"
#endif
//some functions declaretioin
bool CreateList(LinkList &L);
Node CreateNode(int e, int c);
void FreeList(LinkList &L);
void SortList(LinkList &L);
void DeleteNextNode(Node d);
void SweepNextNode(Node s);
void OutPutList(LinkList &L);
相关函数的实现,对应文件ListOpercpp:
//File: ListOpercpp
#include <stdlibh>
#include <iostream>
#ifndef DATASTRUCT
#define DATASTRUCT
#include "datastructh"
#endif
#include "ListOperh"
using namespace std;
bool CreateList(LinkList &L)
{
//TODO: 创建线性链表
Node head;
head=(Node )malloc(sizeof(Node));
if(head==NULL)
{
cout << "内存分配错误" << endl;
return false;
}
head->next=NULL;
head->c=0;
head->e=0;
L=head;
return true;
}
Node CreateNode(int e, int c)
{
//TODO: 创建结点
Node pos;
pos=(Node )malloc(sizeof(Node));
if(pos==NULL)
{
cout << "内存分配错误" << endl;
exit(1);
}
pos->e=e;
pos->c=c;
pos->next=NULL;
return pos;
}
void FreeList(LinkList &L)
{
//TODO: 释放整个线性表所占用的内存空间
Node pos;
Node next;
pos=L;
while(pos!=NULL)
{
next=pos->next;
free(pos);
pos=next;
}
}
void SortList(LinkList &L)
{
bool flag=true; //是否需要排序标志
Node head=L->next;
Node pos;
Node last;
Node temp;
if(head->next==NULL)
{
return;
}
while(flag)
{
flag=true;
last=head;
pos=last->next;
if(last==NULL||last->next==NULL)
{
break;
}
while(last!=NULL && last->next!=NULL)
{
flag=false;
pos=last->next;
if(last->e<pos->e) //哈哈哈哈哈,HTML代码
{
SweepNextNode(last);
flag=true;
}
if(last->e==pos->e)
{
last->c+=pos->c;
DeleteNextNode(last);
flag=true;
/last=last->next;
pos=last->next;/
}
last=last->next;
}
}
}
void DeleteNextNode(Node d)
{
Node temp;
temp=d->next;
d->next=temp->next;
free(temp);
}
void SweepNextNode(Node s)
//一点偷懒的办法,只交换值,不修改指针
{
int c,e;
c=s->c;e=s->e;
s->c=s->next->c;s->e=s->next->e;
s->next->c=c;s->next->e=e;
}
void OutPutList(LinkList &L)
{
Node pos;
pos=L->next;
cout << "输出表达式:";
while(pos!=NULL)
{
if(pos->c>0)
{
cout << "+";
}
if(pos->c!=1)
{
cout << pos->c;
}
if(pos->e!=0)
{
cout << "x^";
cout << pos->e;
}
pos=pos->next;
}
cout << endl;
}
主单元文件maincpp:
#include <iostream>
#include <stdlibh>
#include <ctypeh>
#include "ListOperh"
using namespace std;
LinkList AnayString(char aString[], int aLength);
int main(int argc, char argv[]) //-------------------------------
{
LinkList L;
char InStr[1024];
int len;
cout << "一元稀疏多项式计算器" << endl;
cout << "Copyright@1999-2004, Gashero Liu" << endl;
cout << "作者:刘晓明" << endl << endl;
cout << "请输入一个1024个字符以内的稀疏多项式:";
cin >> InStr;
len=strlen(InStr);
L=AnayString(InStr,len);
SortList(L);
OutPutList(L);
FreeList(L);
system("PAUSE");
return 0;
}
LinkList AnayString(char aString[], int aLength) //---------------
//TODO: 字符串分析函数
{
LinkList L=NULL;
Node pos=NULL;
Node last;
Node head;
CreateList(L);
head=L;
last=head;
int c=0;
int e=0;
char temp[1];
char tp;
bool plus=true;
char status='n'; //状态指示符,我省略了系数为负的情况
/
n: 非运算状态
c: 正在计算系数
e: 正在计算指数
p: 指数为0
f: 完成了一个项目的输入
/
for(int i=0;i<aLength;i++)
{
temp[0]=aString[i];
tp=temp[0];
switch(status)
{
case 'n':
{
c=0;e=0;
status='c';
if(tp=='-')
{
plus=false;
continue;
}
if(isdigit(tp))
{
c=atoi(temp);
continue;
}
if(tp=='x')//多项式以x开头
{
c=1;
status='e';
continue;
}
}
case 'c':
{
if(isdigit(aString[i]))
{
if(plus)
{
c=c10+atoi(temp);
}
else
{
c=c10-atoi(temp);
}
continue;
}
if(tp=='x')
{
if(c==0)
{
c=1;
}
status='e';
e=0;
continue;
}
//此处考虑了常数项出现在其他位置的可能
if(tp=='+')
{
plus=true;
status='p';
continue;
}
if(tp=='-')
{
plus=false;
status='p';
continue;
}
/if(temp[0]=='^')
{
status='e';
e=0;
continue;
}/ //此种情况不可能出现
continue;
} //正在解析系数
case 'e':
{
if(tp=='^')
{
continue;
}
if(isdigit(tp))
{
e=e10+atoi(temp);
continue;
}
if(tp=='+')
{
plus=true;
status='f';
continue;
}
if(tp=='-')
{
plus=false;
status='f';
continue;
}
} //正在解析系数
case 'p':
{
e=0;
status='f';
continue;
}
case 'f':
{
pos=CreateNode(e,c);
last->next=pos;
last=pos;
c=0;e=0;
status='c';
i--;
continue;
}
}
}
pos=CreateNode(e,c);
last->next=pos;
return L;
不知道是不是你需要的
以上就是关于深度学习中,稀疏自编码神经网络怎么微调训练全部的内容,包括:深度学习中,稀疏自编码神经网络怎么微调训练、稀疏自编码和深度学习是同一个方向吗、稀疏编码怎样进行图像的特征提取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)