先介紹乙個簡單的例子,放入字串的第乙個字元,讓遞迴網路複述出後面的字串,我們看看是如何工作的
public classbasicrnnexample
// we need to use rnnoutputlayer for our rnn
rnnoutputlayer.builder outputlayerbuilder =
new
rnnoutputlayer.builder(lossfunction.
mcxent
);//配置rnn的輸出層,設定損失函式為交叉熵
// softmax normalizes the output neurons, the sum of all outputs is 1
// this is required for our samplefromdistribution-function
outputlayerbuilder.activation(
"softmax"
);//設定輸出層的啟用函式為softmax,為了使輸出概率和為1
outputlayerbuilder.nin(
hidden_layer_width
);//設定輸出層的輸入節點50
outputlayerbuilder.nout(learnstring_chars.size())
;//設定輸出層的輸出節點20
listbuilder.layer(
hidden_layer_cont
, outputlayerbuilder.build())
;//裝入網路配置列表末端
// finish builder
listbuilder.pretrain(
false
);//不進行預訓練
listbuilder.backprop(
true
);//使用反向傳播
// create network
multilayerconfiguration conf = listbuilder.build()
;//通過build方法變成多層配置,注意
multilayerconfiguration和
neuralnetconfiguration的關係
multilayernetwork net =
new
multilayernetwork(conf)
;//把配置轉入多層網路
net.init()
;//初始化網路
net.setlisteners(
new
scoreiterationlistener(1))
;//設定***,每次迭代列印score
/** create our training data
*/// create input and output arrays: sample_index, input_neuron,
// sequence_position
indarray input = nd4j.
zeros(1
, learnstring_chars_list
.size()
, learnstring
.length
);//建立全0輸入向量,1代表1維陣列,每個元素是乙個20*64的矩陣,20是字元計數,64是要學習的字串長度
indarray labels = nd4j.
zeros(1
, learnstring_chars_list
.size()
, learnstring
.length
);//建立全0標籤向量,1代表1維陣列,每個元素是乙個20*64的矩陣
// loop through our sample-sentence
int
samplepos =
0;//初始索引為0
for
(char
currentchar :
learnstring
) , 1)
;//new int
本身是乙個3個元素的陣列,元素分別是0,當前字元的在字元集合中的索引,自增位置,1代表置這個元素為1,putscalar就是把陣列位置索引的元素置為1
// output neuron for next-char is 1 at "samplepos"
labels.putscalar(
new int ,
1);//同理
new int
本身是乙個3個元素的陣列,元素分別是0,下乙個字元的在字元集合中的索引,自增位置,1代表置這個元素為1,putscalar就是把陣列位置索引的元素置為1
samplepos++
;//位置自增
} dataset trainingdata =
new
dataset(input
, labels)
;//由上面兩個陣列構成訓練資料,最終輸入資料有是乙個長度為20的陣列,有64組資料,這樣做的目的是保證每次只輸入乙個字元,其他字元都是0,然後順序的輸入其他字元,這也符合遞迴或者流式的思想,標籤一直都代表下乙個要輸入的字元來不斷矯正輸入的字元
// some epochs
for
(int
epoch = 0;
epoch <
100;
epoch++)
int
sampledcharacteridx =
findindexofhighestvalue
(outputprobdistribution)
;//找出陣列中的最大值索引
// print the chosen output
system.
out.print(
learnstring_chars_list
.get(sampledcharacteridx))
;//輸出**值
// use the last output as input
indarray nextinput = nd4j.
zeros
(learnstring_chars_list
.size())
;//建立儲存上次輸出的陣列
nextinput.putscalar(sampledcharacteridx, 1
);//把最大索引位置置為1
output = net.rnntimestep(nextinput)
;//以上次的輸出為輸入再執行乙個時間步
} system.
out.print("\n
");}
}private static int
findindexofhighestvalue
(double
distribution)
}return
maxvalueindex;}
}
深度學習 深度神經網路
神經網路是由乙個個神經元相互連線並按層次排列構成的,深度神經網路是有任意層的神經網路,這裡的深度是指層次的多,而不是神經元數量的多。有任意層,那麼就要有乙個迴圈來負責遍歷每一層進行計算。所以深度神經網路的計算形式,就必須要適應這個迴圈結構。我們先來說說神經元吧 對於多神經元神經網路,其實也是一樣的。...
深度學習 深度前饋網路
1 學習xor 2 基於梯度的學習 3 隱藏單元 4 架構設計 5 反向傳播 和其他微分演算法 6 歷史小計 reference 原文 joselynzhao.top 夏木青 深度前饋網路 資訊流過 x 的函式,流經用於 定義 f 的中間計算過程,最終到達輸出 y。前饋神經網路被稱作網路 netwo...
深度學習 深度網路 backbone 含義
q 深度學習的 中網路都會有backbone,這個是什麼意思呢?關注用的什麼backbone意義是什麼呢?比如某篇 backbone用的resnet,這代表什麼呢?a backbone這個單詞原意指的是人的脊梁骨,後來引申為支柱,核心的意思。在神經網路中,尤其是cv領域,一般先對影象進行特徵提取 常...