本项目是《MATLAB Deep Learning》(Phil Kim 攥写)的示例源代码。
以最简单的MNIST数据集为例,详细代码如下。
Images = loadMNISTImages('./MNIST/t10k-images.idx3-ubyte'); % 加载图片Images = reshape(Images, 28, 28, []); % reshape 为张量Labels = loadMNISTLabels('./MNIST/t10k-labels.idx1-ubyte'); % 加载标签Labels(Labels == 0) = 10; % 将标签 0 转换为标签 10rng(1); % 随机数W1 = 1e-2*randn([9 9 20]); % 随机初始化权重 W5 = (2*rand(100, 2000) - 1) * sqrt(6) / sqrt(360 + 2000); % 随机初始化权重Wo = (2*rand( 10, 100) - 1) * sqrt(6) / sqrt( 10 + 100); % 随机初始化权重% 取前 8000 个样本作为训练集X = Images(:, :, 1:8000);D = Labels(1:8000);% 训练模型%限于计算资源,迭代次数只取3for epoch = 1:3 epoch [W1, W5, Wo] = MnistConv(W1, W5, Wo, X, D);end% 保存模型save('MnistConv.mat');% 取后 2000 个样本作为测试集X = Images(:, :, 8001:10000);D = Labels(8001:10000);% 测试acc = 0;N = length(D);for k = 1:N x = X(:, :, k); y1 = Conv(x, W1); y2 = ReLU(y1); y3 = Pool(y2); y4 = reshape(y3, [], 1); v5 = W5*y4; y5 = ReLU(v5); v = Wo*y5; y = Softmax(v); [~, i] = max(y); % 输出向量再转换数字标签 % 统计正确预测的标签数量 if i == D(k) acc = acc + 1; endendacc = acc / N;fprintf('Accuracy is %f
', acc);
Accuracy is 0.946500
可视化特征
首先加载训练好的模型
load('MnistConv.mat') % 加载预训练模型
取训练集中第 2 张图片作为例子进行说明
k = 2;x = X(:, :, k);y1 = Conv(x, W1);y2 = ReLU(y1);y3 = Pool(y2);y4 = reshape(y3, [], 1);v5 = W5*y4;y5 = ReLU(v5);v = Wo*y5;y = Softmax(v);figure;display_network(x(:)); % 显示输入的图片title('Input Image')
显示卷积层用到的滤波器
卷积层用到的滤波器
显示图片经过卷积处理后的结果
卷积处理后的结果
显示图片经过卷积 + ReLU 处理后的结果
过卷积 + ReLU 处理后的结果
显示图片经过卷积 + ReLU + 池化处理后的结果
卷积 + ReLU + 池化处理后的结果
留言与评论(共有 0 条评论) “” |