最簡單的ann只是由神經元構成的
那麼我們先來定義乙個神經元類networknode
屬性:
public
static
final
int type_input = 0;//輸入層
public
static
final
int type_hidden = 1;//隱藏層
public
static
final
int type_output = 2;//輸出層
//節點型別
private
int type;
//節點誤差
private
float error;
//節點值
private
float value;
方法:
//前向傳播,使用啟用函式
private
float
forwardpropagate(float x)
return
0; }
//設定節點值
public
void
float
setvalue(float value)
再來定義神經網路類
private
int minputcount; //輸入層節點個數
private
int mhiddencount;//隱藏層節點個數
private
int moutputcount;//輸出層節點個數
int i;
private listminputnodes; //輸入層
private listmhiddennodes;//隱藏層
private listmoutputnodes;//輸出層
private
float minputhidden_weight; //輸入層->隱藏層 權重
private
float minputhidden_weight_delta;//輸入層->隱藏層 權重動量
private
float mhiddenoutput_weight; //隱藏層->輸出層 權重
private
float mhiddenoutput_weight_deta;//隱藏層->輸出層 權重動量
public
float mobp=(float) 0.25;//動量係數
public
float rate=(float) 0.22;//學習係數
public
bpnn(int inputcount,int hiddencount,int outputcount)
/*** 更新權重,用動量法調整
* 也可以用梯度下降法調整:每個權重的梯度 = 與其相連的前一層節點的輸出 * 與其相連的後一層的反向傳播的輸出
*/private
void
updateweights()}}
//輸入層<-隱藏層
for(int i=0;i//對每乙個輸入層節點
for(int j=0;j//對應連線所有隱藏層
minputhidden_weight_delta[i][j]=
mobp*minputhidden_weight_delta[i][j]+
rate*mhiddennodes.get(j).geterror()//隱藏層的誤差
*minputnodes.get(i).getvalue();//輸入層的值
minputhidden_weight[i][j] += minputhidden_weight_delta[i][j];
if(i==minputcount-1)}}
}/**
* 前向傳播
*@param list 輸入的列表
*/private
void
forward(listtrainlist)
//輸出層
for(int k=0;k//對每乙個輸出層的節點k
float sum=0;//初始化和
for(int j=0;j//使該節點k接受隱藏層所有節點的輸出
sum += mhiddenoutput_weight[j][k] //求和(接受刺激)
* mhiddennodes.get(j).getvalue();
moutputnodes.get(k).setvalue(sum);//將和作為輸入**化刺激)}}
/*** 反向傳播
*@param targetlist
*/private
void
backward(listtargetlist)
//隱藏層
for(int j=0;jfloat coefficient=0; //係數coefficient
float hiddennodevalue=mhiddennodes.get(j).getvalue();
for(int k=0;kfloat outputnodeerror=moutputnodes.get(k).geterror();
coefficient=hiddennodevalue * outputnodeerror;//+
}mhiddennodes.get(j).seterror(
hiddennodevalue * (1-hiddennodevalue) * coefficient);}
//輸入層
for(int i=0;i0);
}updateweights();
}/**
* 訓練
*@param trainnodes訓練集
*@param times訓練次數
*/public
void
train(listtrainnodes,int times)
public
float answer(datanode datanode)
使用
public
static
void
main(string args) throws exception,,,};
float target =new
float,,,};
listtrainnodes=new arraylist();
for(int i=0,j=0;inew datanode(inputdata[i], target[j])); //封裝資料
//訓練神經網路(用trainnodes訓練50000次)
bpnn.train(trainnodes, 50000);
//原樣本檢測
for(int k=0;kfloat input=inputdata[k];
float expectoutput=target[k];
float bpnn_answer=bpnn.answer(trainnodes.get(k));
system.out.println(arrays.tostring(input)+"-"+
arrays.tostring(expectoutput)+"---"+
arrays.tostring(bpnn_answer));
}//實踐
datanode question=new datanode(new
float, new
float);
system.out.println(arrays.tostring(new
float)+"-"+ //需要分類的點
arrays.tostring(new
float)+"---"+ //真實結果
arrays.tostring(bpnn.answer(question))); //神經網路的結果
}
神經網路 ANN(一)
神經網路 ann 新年啦!先給自己乙個小小的改變,比如寫一篇部落格。再給自己乙個小目標,比如3天內徒手寫個ann 所以,以下內容是在3天的時間內學到的,未免有不足之處,望指教。ann不是一下子就可以被發明出來的,期間經過了幾代人的努力才慢慢成型 參考 從單個神經元講起。乙個神經元其實很笨,它可以有多...
人工神經網路(ANN)
參考資料 從函式上來看,神經網路是回歸方程的級聯疊加,用來逼近目標函式的,本質是一種模擬特徵與目標之間的真實關係函式的模型 乙個有向拓撲,每層有若干節點,節點間有邊,邊上有權值。輸入層隱藏層 多層 後層是前層各節點值的線性組合的函式,即y f x0 w1x1 w2x2 wnxn 線性組合的係數就是邊...
人工神經網路ANN
一 基本概念 ann artificial neural network前饋神經網路的縮寫 二 模型構建 2.1 神經元 2.2 啟用函式 意義 啟用函式是用來讓給神經網路加入非線性因素的,因為線性模型的表達能力不夠。如果沒有啟用函式,那麼該網路僅能表達線性對映,此時即便有再多的隱藏層,其整個網路跟...