这里到Matlab中导出三层卷积核参数(即网络权重和偏移)
保存为txt文本文件,简单一点,只用 3倍模型
%保存模型权重
%载入模型
model = 'model\x3.mat';
load(model);
%保存模型数据
%偏移
%---------------------------------------
FID=fopen('model_x3.txt','w');
%biases_conv1
fprintf(FID,'biases_conv1\n' );
k=length(biases_conv1);
fprintf(FID,'长度 %d\n',k );%有多少个
for j=1:k
fprintf(FID, '%f \n',biases_conv1(j)); %
end
%--------------------------------------
%biases_conv2
fprintf(FID,'biases_conv2\n' );
k=length(biases_conv2);
fprintf(FID,'长度 %d\n',k );%有多少个
for j=1:k
fprintf(FID, '%f \n',biases_conv2(j)); %
end
%--------------------------------------
%biases_conv3
fprintf(FID,'biases_conv3\n' );
fprintf(FID,'长度 %d\n',1 );%有多少个
fprintf(FID, '%f \n',biases_conv3); %
%--------------------------------------
%权重
%weights_conv1
fprintf(FID,'weights_conv1\n' );
[m,n,p]=size(weights_conv1);
fprintf(FID,'长度和宽度 %d %d\n',m,n );%有多少个
for i=1:n
for j=1:m
fprintf(FID, '%f \n',weights_conv1(j,i)); %
end
end
%--------------------------------------
%weights_conv2
fprintf(FID,'weights_conv2\n' );
[m,n,p]=size(weights_conv2);
fprintf(FID,'长度和通道 %d %d\n',m,p );%有多少个
for j=1:p
weights_conv2_p = weights_conv2(:,:,j);
for i=1:m
fprintf(FID, '%f \n',weights_conv2_p(i,1)); %
end
end
%--------------------------------------
%weights_conv3
fprintf(FID,'weights_conv3\n' );
[m,n,p]=size(weights_conv3);
fprintf(FID,'长度和宽度 %d %d\n',m,n );%有多少个
for j=1:m
for i=1:n
fprintf(FID, '%f \n',weights_conv3(j,i)); %
end
end
fclose(FID);
%---------------------------------------
model_x3.txt 中的数据:
biases_conv1
长度 64
-0.002024
-0.083690
-0.021551
... (省略,下同)
-0.073157
-0.012042
0.040996
-0.003123
biases_conv2
长度 32
-0.001080
-0.006114
-0.007997
...
biases_conv3
长度 1
0.028888
weights_conv1
长度和宽度 81 64
...
0.102138
weights_conv2
长度和通道 64 32
0.215097
...
0.161985
0.108080
weights_conv3
长度和宽度 32 25
-0.015818
...
0.010603
-0.005007
-0.005743
0.011435
(共8141行)
在程序中再导入数据作为卷积核数据,后面用到的loadModel,和导出对应:
bool loadModel(SRCNN模型 *sr)
{
char name[]="model_x3.txt";
std::ifstream fin(name);
//检查文件是否存在
if (!fin)
{
return false;
}
//从档案载入
char str[40];
int len,len1;
//biases_conv1
fin >> str;
cout<<str<<endl;
fin >> str;
cout<<str<<endl;
fin >> len;//需要载入的个数
cout<<len<<endl;
if(len==sr->偏移_conv1_长度)
{
for (int i=0; i<len; ++i)
{
fin >> sr->偏移_conv1_数据[i];
}
}
//biases_conv2
fin >> str;
cout<<str<<endl;
fin >> str;
cout<<str<<endl;
fin >> len;//需要载入的个数
cout<<len<<endl;
if(len==sr->偏移_conv2_长度)
{
for (int i=0; i<len; ++i)
{
fin >> sr->偏移_conv2_数据[i];
}
}
//biases_conv3
fin >> str;
cout<<str<<endl;
fin >> str;
cout<<str<<endl;
fin >> len;//需要载入的个数
cout<<len<<endl;
if(len==sr->偏移_conv3_长度)
{
for (int i=0; i<len; ++i)
{
fin >> sr->偏移_conv3_数据[i];
}
}
//weights_conv1
fin >> str;
cout<<str<<endl;
fin >> str;
cout<<str<<endl;
fin >> len;//需要载入的个数
cout<<len<<endl;
fin >> len1;//需要载入的个数
cout<<len1<<endl;
if((len==sr->权重_conv1_长度)&&(len1==sr->权重_conv1_宽度))
{
for (int i=0; i<len; ++i)
{
for (int j=0; j<len1; ++j)
{
fin >> sr->权重_conv1_数据[i*len1+j];
}
}
}
//weights_conv2
fin >> str;
cout<<str<<endl;
fin >> str;
cout<<str<<endl;
fin >> len;//需要载入的个数
cout<<len<<endl;
fin >> len1;//需要载入的个数
cout<<len1<<endl;
if((len==sr->权重_conv2_长度)&&(len1==sr->权重_conv2_通道))
{
for (int i=0; i<len; ++i)
{
for (int j=0; j<len1; ++j)
{
fin >> sr->权重_conv2_数据[i*len1+j];
}
}
}
//weights_conv3
fin >> str;
cout<<str<<endl;
fin >> str;
cout<<str<<endl;
fin >> len;//需要载入的个数
cout<<len<<endl;
fin >> len1;//需要载入的个数
cout<<len1<<endl;
if((len==sr->权重_conv3_长度)&&(len1==sr->权重_conv3_宽度))
{
for (int i=0; i<len; ++i)
{
for (int j=0; j<len1; ++j)
{
fin >> sr->权重_conv3_数据[i*len1+j];
}
}
}
fin.close ();
return true;
}