如何在Android App中使用matlab的神經網路代碼

來源:互聯網
上載者:User

標籤:

 

整個過程大概可以分成這麼幾步:
  1. 首先你要在matlab中寫一個完整的神經網路
    1. 擷取樣本
    2. 樣本匯入
    3. 神經網路建模
    4. 神經網路訓練
    5. 神經網路測試(最佳化建模)
  2. 然後你要在matlab中重寫一個神經網路,第二個神經網路的特殊之處是
    1. 首先這個神經網路必須寫成函數,具體有幾個細節
    2. 把第一個神經網路的訓練結果net網路儲存成mat檔案
    3. 把相關需要用的但無法直接寫入代碼的資料也儲存成mat檔案(比如資料歸一化的參數)
    4. 然後在函數中把上面幾個mat檔案匯入,基本上就是一個完整的神經網路模型了
    5. 再加上一個神經網路計算語句,並把結果返回,這個函數就完成了
  3. 然後把這個matlab神經網路函數進行打包,打包的結果是一個jar包
    1. 這塊的打包需要注意幾個問題
      1. 配置幾個環境變數
      2. jdk的版本不能太高,它是與Matlab版本相對應的,目前我的這個matlab2015對應的是jdk7,8都不可以
  4. 然後把這個jar包連同另一個jar包一塊匯入Andorid工程,並添加為外部依賴
  5. 最後在Android工程中寫一個專門調用這個Jar包介面代碼的函數,傳入輸入變數,返回計算結果
  6. 結束開始運行測試,你會發現它報錯了,是的,這樣做是不行的,但是在java工程中是可以啟動並執行
    1. 為什麼不行?
    2. 有什麼其他解決辦法?
   1.在matlab中寫一個完整的神經網路1.1.擷取樣本就不說了 1.2.樣本匯入如何匯入資料呢,一般matlab中有通用的資料存放區格式,那就是Mat格式,但是我並不知道怎麼編寫這個格式在我發現有辦法可以把txt中的資料匯入進去之後我就選定它了,因為這種格式也非常方便我用android輸出,也就是說它是一種比較通用的資訊交換格式具體的操作方法非常簡單:
  1. 你在txt中按這種格式儲存資料:每行用斷行符號隔開,每列用空格隔開
  2. 然後你在matlab中load這個檔案,就能得到一個資料的矩陣了
代碼如下: 
alldata = load(‘alldata.txt‘);alldata = alldata(:,:);
  1.3. 1.4. 1.5. 這幾個過程照著代碼修改還是比較簡單的(雖然我當時讀得有點困難。。。),稍微提這麼幾點:
  1. (直接把matlab30個例子的源碼包放到工作路徑,複製裡邊的代碼比較方便)
  2. 輸出資料需要進行一下矩陣轉換
  3. 歸一化處理資料就是多走一步流程,很簡單(雖然不知道原理)
  4. 使用newff工具函數來構建神經網路,使用matlab內部的工具箱(其實就是庫函數)來建模、訓練和計算,不需要自己寫邏輯代碼
  5. 參數配置不是特別懂
  6. 最後出圖的時候好好修改調一調,不難
  7. 中間各種矩陣的變換感覺不是很習慣,可以參看一下工作空間裡的變數狀態,或者一步步列印一些變數的結果來看
 
clc;clear; %匯入300組資料alldata = load(‘alldata.txt‘);alldata = alldata(:,:); %輸入輸出資料input = alldata(:,2:33);outputtemp = alldata(:,1);%輸出資料需要處理一下output = zeros(300,2);%預先分配記憶體for i=1:300    switch outputtemp(i)        case 0            output(i,:) = [1 0];%意思是如果資料結果是0,則輸出層的狀態是[1 0],或者用第一個輸出節點表示        case 1 %能直接識別帶小數位的資料            output(i,:) = [0 1];    endend %從中隨機抽取280組資料作為訓練資料,20組資料作為預測資料k = rand(1,300);[m,n] = sort(k); input_train = input(n(1:280),:)‘;output_train = output(n(1:280),:)‘; input_test = input(n(281:300),:)‘;output_test = output(n(281:300),:)‘; %輸入輸出資料進行歸一化處理[inputn,inputps] = mapminmax(input_train);[outputn,outputps] = mapminmax(output_train); %網路結構構建32-6-2net=newff(inputn,outputn,6); %網路參數配置(迭代次數,學習率,目標)net.trainParam.epochs=100;net.trainParam.lr=0.1;net.trainParam.goal=0.0004; %網路訓練net=train(net,inputn,outputn); %BP網路預測%預測資料歸一化inputn_test=mapminmax(‘apply‘,input_test,inputps); %網路預測輸出an=sim(net,inputn_test); %網路輸出反歸一化BPoutput=mapminmax(‘reverse‘,an,outputps); %結果分析figure(1)plot(BPoutput,‘:og‘)hold onplot(output_test,‘-*‘);legend(‘預測輸出‘,‘期望輸出‘)title(‘BP網路預測輸出‘,‘fontsize‘,12)ylabel(‘函數輸出‘,‘fontsize‘,12)xlabel(‘樣本‘,‘fontsize‘,12)%預測誤差error=BPoutput-output_test; figure(2)plot(error,‘-*‘)title(‘BP網路預測誤差‘,‘fontsize‘,12)ylabel(‘誤差‘,‘fontsize‘,12)xlabel(‘樣本‘,‘fontsize‘,12) figure(3)plot((output_test-BPoutput)./BPoutput,‘-*‘);title(‘神經網路預測誤差百分比‘) errorsum = sum(abs(error))
  2.在matlab中重寫這個神經網路,為匯出jar包做準備 2.1.首先這個神經網路必須寫成函數在matlab寫一個函數的過程是這樣的
  1. 在工作空間中右鍵建立函數,重新命名後開啟,就是這樣
  2. matlab中的函數有點特殊,在這裡一起趁熱講了
    1. 整個函數有一頭一尾兩句固定的聲明,頭是以function開始,然後是:傳回值 = 函數名(函數參數),尾是end,雖然一開始看得不適應,但是習慣還是很好理解的,跟其他的語言差不多
      1. 傳回值可以沒有,那就是直接 函數名(函數參數)
      2. 傳回值可以有多個,參數也可以有多個,他們的形式是這樣:function [x,y,z]=sphere(theta,phi,rho)
      3. 注意Matlab中不會對函數類型進行聲明,所以很多時候你在寫函數的時候一開始就要對輸入參數進行一個檢查
    2. 然後下面接著是官方注釋,第一句是摘要,之後是詳細說明,這些東西會在預覽的時候顯示
    3. 接下來就是函數體了,你可以做各種事情,邏輯語句、調用其他函數
    4. 最後在end之前你需要定義傳回值,matlab在這塊有點特殊,你不用顯示地指定return哪個變數,因為你第一句聲明裡有傳回值變數,所以只要你的函數內容中有這個變數,那麼最後執行到end的時候就會自動返回這個變數這時候的狀態
    5. -----調用函數------
    6. 調用函數的形式跟函式宣告的第一句是一毛一樣的:[輸出參數表]=函數名(輸入參數表)
    7. 調用函數時,輸入和輸出參數的順序應與函數定義時的一致,數目一定不能多於函數定於中的,可能可以少於
    8. 為什麼可以少於,因為在函數內部可以通過nargin()和nargout()擷取函數被調用時使用者指定的輸入、輸出參數個數。所以如果這個函數裡邊有針對不同的少於輸入少於輸出的情況進行if else的話,就可以自動適應
  3. 那麼在這裡,我的輸出是一個int,輸入是一個行矩陣,或者說一個數組,我的函數開頭就這麼寫了:
    function output = annforecastthi(input_test)
  2.2.然後為了不在這個函數裡對神經網路進行訓練(因為matlab的設定就是無法把訓練函數匯出成Jar包),需要把先前神經網路中訓練好的net儲存成mat檔案再在這裡直接匯出
  1. 把先前神經網路中訓練好的net儲存成mat檔案 非常簡單。直接在運算結束後再工作空間中右鍵net變數,儲存為mat檔案就可以了
  2. 然後匯入的時候稍微有點麻煩
    1. 其實load mat檔案有兩種方式,一種是命令列方式,一種是函數方式。我查了一下兩種方式功能上沒什麼區別,但是推薦在函數裡用函數方式,而命令列方式的形式還會簡單很多
    2. 以匯入一個結構體(歸一化參數)為例:
      1. 命令列方式 :load anninputps inputps;
      2. 函數方式:
    3. 而匯入net資料的時候還要麻煩一些:
      1. 命令列方式:load annnet net;
      2. 函數方式:(後邊還要加一句把結構體轉型成網路格式)
  3. 這裡需要匯入三個mat檔案,一個net和兩個歸一化參數(後邊要用來反歸一化)
  2.3.最後返回計算結果,第二個神經網路模型也是神經網路計算函數就完成了output=find(BPoutput(:,1)==max(BPoutput(:,1)));整個函數是這樣:

 

function output = annforecastthi(input_test)%ANNFORECAST%   輸入長度為32的行矩陣,輸出為1或2 A = load(‘annnet.mat‘);B = fieldnames(A);net = A.(B{1});net = network(net); C = load(‘anninputps.mat‘);D = fieldnames(C);inputps = C.(D{1}); E = load(‘annoutputps.mat‘);F = fieldnames(E);outputps = E.(F{1}); %BP網路預測%預測資料歸一化inputn_test=mapminmax(‘apply‘,input_test‘,inputps); %網路預測輸出an=sim(net,inputn_test); %網路輸出反歸一化BPoutput=mapminmax(‘reverse‘,an,outputps); %結果分析%根據網路輸出找出資料屬於哪類output=find(BPoutput(:,1)==max(BPoutput(:,1))); end

 ---待續

如何在Android App中使用matlab的神經網路代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.