储存参数是模型最开始的工作吗
时间: 2024-03-04 21:50:11 浏览: 85
储存参数不是模型最开始的工作。模型最开始的工作通常是建立模型结构,即确定模型的层数、每层的神经元数量、激活函数等。在建立好模型结构后,模型需要进行初始化,即对模型的参数进行随机初始化或使用预训练模型进行初始化。然后,模型才能进行训练,训练的过程中,模型会自动调整参数,以使得模型的输出结果尽可能地接近真实结果。在模型训练完成后,需要将训练得到的模型参数保存在文件中以便于后续使用。因此,储存参数是模型训练完成后的工作,不是模型最开始的工作。
相关问题
储存参数是模型计算流程最开始的一步吗,在模型输入层之前?
储存参数不是模型计算流程最开始的一步,也不在模型输入层之前。模型的计算流程最开始的一步是将输入数据经过预处理后,转化为模型可以处理的格式,并将其输入到模型的输入层中进行处理。在模型的输入层中,模型会根据输入数据和初始化的模型参数,进行一系列的计算和变换,最终得到模型的输出结果。在模型训练完成后,需要将训练得到的模型参数保存在文件中以便于后续使用。因此,储存参数是在模型计算流程的某个阶段进行的,不是最开始的一步,也不在模型输入层之前。
将最开始的代码每一行写注释
好的,以下是对最开始的代码每一行的注释:
```
function untitled() % 定义一个函数,函数名为untitled
load('D:\mat格式的MNIST数据\test_labels.mat') % 读取测试集标签数据
load('D:\mat格式的MNIST数据\train_images.mat') % 读取训练集图像数据
load('D:\mat格式的MNIST数据\train_labels.mat') % 读取训练集标签数据
load('D:\mat格式的MNIST数据\test_images.mat') % 读取测试集图像数据
train_num = 6000; % 训练集大小
test_num = 200; % 测试集大小
%训练数据,图像转向量
data_train = mat2vector(train_images(:,:,1:train_num),train_num); % 将训练集图像数据转换成向量形式,并存储在data_train中
data_test = mat2vector(test_images(:,:,1:test_num),test_num); % 将测试集图像数据转换成向量形式,并存储在data_test中
% 处理训练数据,防止后验概率为0
[data_train,position] = fun(data_train,train_labels1(1:train_num)'); % 处理训练数据,防止后验概率为0,并将处理后的数据存储在data_train中,position存储每个类别中被删除的特征的下标
% 处理测试数据
for rows = 1:10
data_test(:,position{1,rows})=[]; % 将测试数据中被删除的特征删除
end
%模型部分
% 超参数全部取了默认值,比较重要的,如类别的先验概率,如果不进行修改,则计算输入数据中类别的频率
% 查看nb_model即可确认所使用的超参数
Mdl = fitcnb(data_train,train_labels1(1:train_num)); % 使用朴素贝叶斯分类器训练模型,并存储在Mdl中
%测试结果
result = predict(Mdl,data_test); % 使用训练好的模型对测试数据进行分类预测,并将结果存储在result中
result = result.'; % 将结果进行转置,变成行向量
xlabel=[0,1,2,3,4,5,6,7,8,9]; % x轴标签,即数字0~9
resultbar = [0,0,0,0,0,0,0,0,0,0]; % 存储分类结果的频数
testbar = [0,0,0,0,0,0,0,0,0,0]; % 存储测试数据的实际频数
for i = 1:test_num
temp1=result(i); % 获取第i个测试数据的分类结果
temp1=temp1+1; % 将分类结果的值加1,使其符合数组下标从1开始的规定
resultbar(temp1)=resultbar(temp1)+1; % 将分类结果的频数加1
temp2=test_labels1(i); % 获取第i个测试数据的实际分类结果
temp2=temp2+1; % 将实际分类结果的值加1,使其符合数组下标从1开始的规定
testbar(temp2)=testbar(temp2)+1; % 将实际分类结果的频数加1
end
bar(xlabel, [resultbar' testbar']); % 绘制直方图,横坐标为数字0~9,纵坐标为分类结果的频数和实际频数
% 整体正确率
acc = 0.;
for i = 1:test_num
if result(i)==test_labels1(i) % 如果分类结果和实际结果相等,则正确率加1
acc = acc+1;
end
end
title('精确度为:',(acc/test_num)*100) % 在图像上添加标题,显示整体正确率
end
function [output,position] = fun(data,label) % 定义一个函数,处理训练数据,防止后验概率为0
position = cell(1,10); % 创建一个cell,存储每类中删除的特征的下标
for i = 0:9
temp = []; % 用于存储每个类别中的数据
pos = []; % 用于存储每个类别中被删除的特征的下标
for rows = 1:size(data,1)
if label(rows)==i
temp = [temp;data(rows,:)]; % 将属于第i类的数据存储到temp中
end
end
for cols = 1:size(temp,2)
var_data = var(temp(:,cols)); % 计算特征的方差
if var_data==0 % 如果方差为0,则将该特征的下标存储到pos中
pos = [pos,cols];
end
end
position{i+1} = pos; % 将第i类中被删除的特征的下标存储到position中
data(:,pos)=[]; % 将第i类中被删除的特征删除
end
output = data; % 返回处理后的训练数据
end
function [data_]= mat2vector(data,num) % 定义一个函数,将图像数据转换成向量形式
[row,col,~] = size(data); % 获取图像数据的行数和列数
data_ = zeros(num,row*col); % 创建一个矩阵,用于存储转换后的向量
for page = 1:num
for rows = 1:row
for cols = 1:col
data_(page,((rows-1)*col+cols)) = im2double(data(rows,cols,page)); % 将第page个图像的第rows行第cols列的像素值存储到data_中
end
end
end
end
```
阅读全文