欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:java中使用BP網(wǎng)絡(luò)進(jìn)行回歸

柚子快報(bào)邀請(qǐng)碼778899分享:java中使用BP網(wǎng)絡(luò)進(jìn)行回歸

http://yzkb.51969.com/

在神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)扮演著至關(guān)重要的角色,它們?yōu)榫W(wǎng)絡(luò)引入了非線性因素,使得網(wǎng)絡(luò)能夠?qū)W習(xí)和模擬復(fù)雜的非線性關(guān)系。下面列出的各種激活函數(shù)及其特點(diǎn)如下:

LINEAR ("Linear"):

線性激活函數(shù)實(shí)際上就是恒等函數(shù),即?f(x)=x。它不會(huì)給網(wǎng)絡(luò)帶來(lái)任何非線性特性,因此在實(shí)際應(yīng)用中很少使用(除了在某些特殊情況下,如回歸問(wèn)題或某些層作為輸出層時(shí))。RAMP ("Ramp"):

Ramp函數(shù)是一種分段線性函數(shù),通常定義為當(dāng)?x<0?時(shí)?f(x)=0,當(dāng)?x≥0?時(shí)?f(x)=x。它與ReLU(Rectified Linear Unit)類似,但Ramp函數(shù)在?x<0?時(shí)保持輸出為0,而不是像ReLU那樣保持不變。Ramp函數(shù)有時(shí)被認(rèn)為是一個(gè)更平滑的ReLU版本。STEP ("Step"):

Step函數(shù)是一種簡(jiǎn)單的二值激活函數(shù),通常定義為當(dāng)?x<0?時(shí)?f(x)=0,當(dāng)?x≥0?時(shí)?f(x)=1。它將任意輸入值映射到兩個(gè)輸出值之一,這種非連續(xù)性使得它在大多數(shù)現(xiàn)代神經(jīng)網(wǎng)絡(luò)中不太實(shí)用。SIGMOID ("Sigmoid"):

Sigmoid函數(shù)是一個(gè)S形曲線,定義為?f(x)=1+e?x1?。它將任意實(shí)值壓縮到區(qū)間(0, 1)內(nèi),非常適合用于二分類問(wèn)題的輸出層。然而,由于梯度消失問(wèn)題和計(jì)算量較大,它在深度神經(jīng)網(wǎng)絡(luò)中的使用已經(jīng)減少。TANH ("Tanh"):

Tanh函數(shù)是雙曲正切函數(shù),定義為?f(x)=ex+e?xex?e?x?。它將輸入值壓縮到區(qū)間(-1, 1)內(nèi),并且是零中心的(即,輸出的均值為0)。這有助于加快收斂速度,因此它比Sigmoid函數(shù)更受歡迎。然而,梯度消失問(wèn)題仍然存在。GAUSSIAN ("Gaussian"):

高斯(或稱為高斯)激活函數(shù)使用高斯(或正態(tài))分布函數(shù),形式可能因具體實(shí)現(xiàn)而異,但通常與標(biāo)準(zhǔn)正態(tài)分布相關(guān)。它將輸入值映射到一個(gè)鐘形曲線,但這種激活函數(shù)在神經(jīng)網(wǎng)絡(luò)中不太常見(jiàn),因?yàn)槠渌せ詈瘮?shù)通常能提供更好的性能。TRAPEZOID ("Trapezoid"):

梯形激活函數(shù)是一種非線性函數(shù),其形狀類似于梯形。它結(jié)合了線性和非線性的部分,但在實(shí)際應(yīng)用中不太常見(jiàn),可能是因?yàn)樗狈ψ銐虻睦碚撘罁?jù)或優(yōu)勢(shì)。SGN ("Sgn"):

Sgn(符號(hào))函數(shù)根據(jù)輸入值的正負(fù)輸出+1、-1或0(取決于具體定義)。它是一種簡(jiǎn)單的二值激活函數(shù),但在神經(jīng)網(wǎng)絡(luò)中并不常用,因?yàn)樗奶荻仍诖蟛糠州斎肷隙际?(除了0點(diǎn)附近的微小區(qū)域),這會(huì)導(dǎo)致梯度消失問(wèn)題。SIN ("Sin"):

Sin函數(shù)是正弦函數(shù),將輸入值映射到[-1, 1]區(qū)間的正弦波上。它是一個(gè)周期性的非線性函數(shù),但在神經(jīng)網(wǎng)絡(luò)中不常用,因?yàn)樯窠?jīng)網(wǎng)絡(luò)通常希望激活函數(shù)具有單調(diào)遞增或遞減的特性,以便進(jìn)行有效的梯度下降。LOG ("Log"):

Log函數(shù)(可能指的是自然對(duì)數(shù)或其他對(duì)數(shù))將輸入值映射到對(duì)數(shù)尺度上。它在某些特定領(lǐng)域(如機(jī)器學(xué)習(xí)中的某些損失函數(shù))中很有用,但在作為神經(jīng)網(wǎng)絡(luò)的激活函數(shù)時(shí)并不常見(jiàn)。RECTIFIED ("RectifiedLinear", ReLU):

ReLU(Rectified Linear Unit)函數(shù)是當(dāng)前深度學(xué)習(xí)中使用最廣泛的激活函數(shù)之一。它定義為?f(x)=max(0,x),即將所有負(fù)值置為0,保持正值不變。ReLU函數(shù)簡(jiǎn)單、計(jì)算效率高,且有助于緩解梯度消失問(wèn)題(在正值區(qū)域內(nèi))。然而,它也存在死亡ReLU問(wèn)題(即某些神經(jīng)元在訓(xùn)練過(guò)程中永遠(yuǎn)不會(huì)被激活)。

? ?為了分析1個(gè)y和3個(gè)自變量(x,z,? k)?(0為訓(xùn)練集,1為測(cè)試集) 的回歸問(wèn)題使用java的BP網(wǎng)絡(luò)激活函數(shù)使用RECTIFIED如下使用依賴如下:

2.96

1.0.3

org.neuroph

neuroph-core

${neuroph-core.version}

javax.visrec

visrec-api

${visrec-api.version}

進(jìn)行回歸的方法如下:

private static void poly3UseBpn(Double[] x0, Double[] z0, Double[] k0, Double[] y, Double[] x1, Double[] z1, Double[] k1, Double[] y0, Double[] y1) {

// 歸一化數(shù)據(jù)

double minX = Arrays.stream(x0).min(Double::compareTo).get();

double maxX = Arrays.stream(x0).max(Double::compareTo).get();

double rangeX = maxX - minX;

double minZ = Arrays.stream(z0).min(Double::compareTo).get();

double maxZ = Arrays.stream(z0).max(Double::compareTo).get();

double rangeZ = maxZ - minZ;

double minK = Arrays.stream(k0).min(Double::compareTo).get();

double maxK = Arrays.stream(k0).max(Double::compareTo).get();

double rangeK = maxK - minK;

// 創(chuàng)建數(shù)據(jù)集 (3 個(gè)輸入,1 個(gè)輸出)

DataSet trainingSet = new DataSet(3, 1);

for (int i = 0; i < x0.length; i++) {

double normalizedInputX = (x0[i] - minX) / rangeX;

double normalizedInputZ = (z0[i] - minZ) / rangeZ;

double normalizedInputK = (k0[i] - minK) / rangeZ;

trainingSet.add(new DataSetRow(new double[]{normalizedInputX, normalizedInputZ, normalizedInputK}, new double[]{y[i]}));

}

// 創(chuàng)建一個(gè)具有 3 個(gè)輸入層神經(jīng)元,10 個(gè)隱藏層神經(jīng)元,1 個(gè)輸出層神經(jīng)元的神經(jīng)網(wǎng)絡(luò)

MultiLayerPerceptron neuralNet = new MultiLayerPerceptron(TransferFunctionType.RECTIFIED, 3, 10, 1);

//使用固定的權(quán)重

neuralNet.randomizeWeights(new Random(1));

// 設(shè)置學(xué)習(xí)率和迭代次數(shù)

double currentLearningRate = 0.01;

int iterations = 10000;

double errorThreshold = 0.001;

double minLearningRate = 1e-5;

double decay = 0.9;

// 訓(xùn)練網(wǎng)絡(luò)

BackPropagation backPropagation = new BackPropagation();

backPropagation.setLearningRate(currentLearningRate);

neuralNet.setLearningRule(backPropagation);

for (int i = 0; i < iterations; i++) {

neuralNet.learn(trainingSet);

// 獲取當(dāng)前誤差

double error = backPropagation.getTotalNetworkError();

if (error < errorThreshold) {

System.out.println("error:" + error + "---->" + (error < errorThreshold) + "====>" + i);

break;

}

// 更新學(xué)習(xí)率(指數(shù)衰減)

currentLearningRate = Math.max(minLearningRate, currentLearningRate * decay);

backPropagation.setLearningRate(currentLearningRate);

}

// 在 x0 和 z0 上評(píng)估擬合值,并將結(jié)果存儲(chǔ)在 y0 中

for (int i = 0; i < x0.length; i++) {

double normalizedInputX = (x0[i] - minX) / rangeX;

double normalizedInputZ = (z0[i] - minZ) / rangeZ;

double normalizedInputK = (k0[i] - minK) / rangeZ;

neuralNet.setInput(normalizedInputX, normalizedInputZ, normalizedInputK);

neuralNet.calculate();

y0[i] = neuralNet.getOutput()[0];

}

// 在 x1 和 z1 上評(píng)估擬合值,并將結(jié)果存儲(chǔ)在 y1 中

for (int i = 0; i < x1.length; i++) {

double normalizedInputX = (x1[i] - minX) / rangeX;

double normalizedInputZ = (z1[i] - minZ) / rangeZ;

double normalizedInputK = (k1[i] - minK) / rangeZ;

neuralNet.setInput(normalizedInputX, normalizedInputZ, normalizedInputK);

neuralNet.calculate();

y1[i] = neuralNet.getOutput()[0];

}

由于這邊數(shù)據(jù)量比較小大概在70條左右,由于neuroph是單線程的,在執(zhí)行到neuralNet.learn(trainingSet);這里時(shí)會(huì)卡住,調(diào)整學(xué)習(xí)率和減少隱藏層單元后仍舊無(wú)法訓(xùn)練故只能換個(gè)方法如下使用deeplearning4j

1.0.0-M1

1.0.0-M1

org.deeplearning4j

deeplearning4j-core

${dl4j.version}

org.deeplearning4j

deeplearning4j-nn

${dl4j.version}

org.nd4j

nd4j-native-platform

${nd4j.version}

修改后的訓(xùn)練方法如下:

public void poly3UseBpn(double[] x0, double[] z0, double[] k0, double[] y,

double[] x1, double[] z1, double[] k1, double[] y0, double[] y1) {

// 創(chuàng)建輸入數(shù)據(jù)集 (3個(gè)輸入,1個(gè)輸出)

List dataSetList = new ArrayList<>();

for (int i = 0; i < x0.length; i++) {

INDArray input = Nd4j.create(new double[][]{{x0[i], z0[i], k0[i]}});

INDArray output = Nd4j.create(new double[][]{{y[i]}});

org.nd4j.linalg.dataset.DataSet DataSet = new org.nd4j.linalg.dataset.DataSet(input, output);

dataSetList.add(DataSet);

}

ListDataSetIterator trainingData = new ListDataSetIterator<>(dataSetList);

// 構(gòu)建網(wǎng)絡(luò)配置

MultiLayerNetwork model = new MultiLayerNetwork(new NeuralNetConfiguration.Builder()

.seed(42)//隨機(jī)種子

.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) //隨機(jī)梯度下降

.updater(new org.nd4j.linalg.learning.config.Adam(0.01)) //初始化學(xué)習(xí)率

.weightInit(WeightInit.RELU)//權(quán)重初始化

.list()

.layer(0, new DenseLayer.Builder()

.nIn(3)

.nOut(10)

.activation(Activation.RELU) //激活函數(shù)

.build()) // 輸入層 3個(gè)輸入

.layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.MSE) //MSE損失函數(shù) MSE表示均方誤差

.nIn(10)

.nOut(1)

.activation(Activation.IDENTITY)

.build()) // 輸出層 1個(gè)輸出

.build());

//網(wǎng)絡(luò)初始化

model.init();

//用于輸出誤差信息 100次輸出1個(gè)

model.setListeners(new ScoreIterationListener(100));

// 設(shè)置訓(xùn)練參數(shù)

double errorThreshold = 0.001;

int maxIterations = 1000;

int patience = 10;

double bestError = Double.MAX_VALUE;

int noImprovementCount = 0;

for (int i = 0; i < maxIterations; i++) {

model.fit(trainingData);

double currentError = model.score();

System.out.println("error:" + currentError + "====>" + i);

if (currentError < bestError) {

bestError = currentError;

noImprovementCount = 0;

} else {

noImprovementCount++;

}

if (currentError < errorThreshold || noImprovementCount >= patience) {

break;

}

}

// 評(píng)估在 x0 和 z0 上的擬合值,并將結(jié)果存儲(chǔ)在 y0 中

for (int i = 0; i < x0.length; i++) {

INDArray input = Nd4j.create(new double[][]{{x0[i], z0[i], k0[i]}});

INDArray output = model.output(input);

y0[i] = output.getDouble(0);

}

// 評(píng)估在 x1 和 z1 上的擬合值,并將結(jié)果存儲(chǔ)在 y1 中

for (int i = 0; i < x1.length; i++) {

INDArray input = Nd4j.create(new double[][]{{x1[i], z1[i], k1[i]}});

INDArray output = model.output(input);

y1[i] = output.getDouble(0);

}

}

修改完后重新運(yùn)行,已經(jīng)可以順利訓(xùn)練出數(shù)據(jù)了,自此記錄一下!

參考資料:

https://deeplearning4j.konduit.ai/v/zhong-wen-v1.0.0

柚子快報(bào)邀請(qǐng)碼778899分享:java中使用BP網(wǎng)絡(luò)進(jìn)行回歸

http://yzkb.51969.com/

精彩鏈接

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19534222.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄