手写单隐层神经网络_鸢尾花分类(matlab实现)
生活随笔
收集整理的這篇文章主要介紹了
手写单隐层神经网络_鸢尾花分类(matlab实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 思路
- 留言
- 效果
- 代碼
- mian
- split
- training
- testing
思路
sigmoid函數做激活函數
二分類交叉熵做損失函數
mian函數:數據預處理
split函數:數據集分割
training函數:神經網絡訓練
testing函數:神經網絡測試
留言
1、這雖是單隱層神經網絡,但是這分類效果好得出奇,好不容易才訓練出86.7%這么低的準確率(接受誤差:[-0.02 0.02]),可能是因為數據集太好了,或者數據集太小了,訓練出來一般都是100%的準確率
2、由于用的是二分類交叉熵做損失函數,于是將類別編號為0、1的保留,其他的剔除,可修改損失函數做所有鳶尾花數據集的分類
3、數據集下載
修正數據集下載地址,提取碼:5c02
原數據集,提取碼:got0
效果
代碼
mian
clear all; clc;%% 數據導入 iris_data=csvread("iris_dataset.csv");%% 數據預處理 nums_train=70; nums_test=30; Dimension=5;[train_set,test_set]=data_split(iris_data, nums_train, nums_test); training_x = train_set(:,1:4)'; training_y = train_set(:,5)'; testing_x = test_set(:,1:4)'; testing_y = test_set(:,5)';%% 神經網絡初始化 %參數設置 Net_Scale = [4 5 1]; step = 0.01; nums_iteration = 200; %偏置添加 & 初始化 global Neural_Net_layer_1; global Neural_Net_layer_2; Neural_Net_layer_1 = rand([Net_Scale(2) Net_Scale(1)]+[0 1]); Neural_Net_layer_2 = rand([Net_Scale(3) Net_Scale(2)]+[0 1]);%% 神經網絡訓練 train_neural_net(training_x,training_y,step, nums_iteration);%% 神經網絡評價 error = 0.02; accuracy = test_neural_net(testing_x,testing_y,error); fprintf("the accuracy is %.1f\n%",100*accuracy);split
function [training,testing] = data_split(data,nums_train,nums_test) training=data(1:nums_train,:); testing=data(1:nums_test,:); endtraining
function []= train_neural_net(training_x,training_y,step,nums_iteration) %接收每層神經網絡層參數, 訓練數據 %返回每層神經網絡參數 global Neural_Net_layer_1; global Neural_Net_layer_2;%每層參數規模 size_layer_1=size(Neural_Net_layer_1); size_layer_2=size(Neural_Net_layer_2);for i = 1: nums_iteration%輸出層計算 arrayfun函數:激活函數(Sigmoid)作用于矩陣內每個數值 %第一層 W_X_1 = Neural_Net_layer_1(:,1: size_layer_1(2)-1) * training_x; W_X_B_1 = W_X_1+ Neural_Net_layer_1(:,size_layer_1(2)); layer_1 = arrayfun(@(x) 1/(1+exp(-x)), W_X_B_1);%第二層 W_X_2 = Neural_Net_layer_2(:,1: size_layer_2(2)-1) * layer_1; W_X_B_2 = W_X_2+ Neural_Net_layer_2(:,size_layer_2(2)); layer_2 = arrayfun(@(x) 1/(1+exp(-x)), W_X_B_2);%損失函數誤差計算 %第三層 a_grad_3 = arrayfun(@(x,y) (1-y)./(1-x)-(y./x),layer_2,training_y);%第二層 a_grad_2 = Neural_Net_layer_2(:,1: size_layer_2(2)-1)'*a_grad_3;%激活函數自變量梯度計算 %第三層 z_grad_3 = a_grad_3.*layer_2.*(1-layer_2);%第二層 z_grad_2 = a_grad_2.*layer_1.*(1-layer_1);%梯度下降 %W的梯度下降 Neural_Net_layer_2(:,1: size_layer_2(2)-1) = Neural_Net_layer_2(:,1: size_layer_2(2)-1) - step.*z_grad_3*layer_1'; Neural_Net_layer_1(:,1: size_layer_1(2)-1) = Neural_Net_layer_1(:,1: size_layer_1(2)-1) - step.*z_grad_2*training_x';%b的梯度下降 Neural_Net_layer_2(:,size_layer_2(2)) = Neural_Net_layer_2(:,size_layer_2(2)) - sum(step*z_grad_3,2); Neural_Net_layer_1(:,size_layer_1(2)) = Neural_Net_layer_1(:,size_layer_1(2)) - sum(step*z_grad_2,2); end endtesting
function [accuracy] = test_neural_net(testing_x,testing_y,error) global Neural_Net_layer_1; global Neural_Net_layer_2;%測試集規模 size_test=size(testing_x);%每層參數規模 size_layer_1=size(Neural_Net_layer_1); size_layer_2=size(Neural_Net_layer_2);%輸出層計算 %第一層 W_X_1 = Neural_Net_layer_1(:,1: size_layer_1(2)-1) * testing_x; W_X_B_1 = W_X_1+ Neural_Net_layer_1(:,size_layer_1(2)); layer_1 = arrayfun(@(x) 1/(1+exp(-x)), W_X_B_1); %第二層 W_X_2 = Neural_Net_layer_2(:,1: size_layer_2(2)-1) * layer_1; W_X_B_2 = W_X_2+ Neural_Net_layer_2(:,size_layer_2(2)); layer_2 = arrayfun(@(x) 1/(1+exp(-x)), W_X_B_2);%正確率計算 accuracy = sum(abs(layer_2-testing_y)<=error)/size_test(2); end總結
以上是生活随笔為你收集整理的手写单隐层神经网络_鸢尾花分类(matlab实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分组密码应用技术
- 下一篇: crontab定时任务运行