使用神經網路解決XOR問題 C

2021-09-26 12:24:50 字數 3148 閱讀 1949

這篇文章的目的是讓你了解如何在c#.net中使用sianet庫和寫入來使用神經網路。我將使用xor問題,這是最簡單的問題之一,但是,minksy和*****t(1969)表明這是20世紀60年代神經網路架構的乙個大問題,稱為感知器。你可以在這裡閱讀神經元的功能,以便更多地了解我在說什麼。

現在這是乙個問題。讓我們嘗試構建和訓練乙個神經網路,它將產生下面的真值表,稱為』異或』或』異或』(a或b,但不是兩者):

以下是在任何深度學習庫中遵循的常規步驟,用於構建和訓練模型以解決此類問題:

建立一層神經元,對於這種情況,我們將使用完全連線(密集層)

設定所有神經元的啟用函式

在訓練過程中會發現錯誤的損失函式

乙個優化函式,它將更新神經元突觸的權重並使其為下一次迭代做好準備。

條件

從站點安裝arrayfire:https:

配置專案

建立乙個新的visual studio .net核心控制台專案

現在,在您建立的專案中,使用nuget包管理器:sianet,sianet.backend.arrayfire和sianet.backend.tensorsharp安裝sianet庫。

在專案中開啟program.cs檔案並使用以下命名空間

using sianet;

using sianet.data;

using sianet.engine;

using sianet.layers;

using system;

在main函式中寫下第一行來設定引擎。該引擎方法有兩個引數:backend和device

//setup engine 

global.useengine(sianet.backend.arrayfire.sianetbackend.instance, devicetype.cpu);

建立乙個輔助函式prepdataset,它將建立xor訓練集

private static (dataframe2d, dataframe2d) prepdataset()

); dataframe2d y = new dataframe2d(1);

y.load(new float );

return (x, y);

}

從main方法呼叫prepdataset

//prep data

var (x, y) = prepdataset();

dataframeiter trainset = new dataframeiter(x, y);

使用少量fullyconnected或dense layers構建乙個簡單的模型。所以我們有乙個輸入層,不需要定義,也可以從資料集本身推斷出來。隱藏層有64個神經元,後來輸出乙個神經元。我已經為隱藏和輸出層設定了啟用功能,如下面的**所示。

//build model with ****** fully connected layers

var model = new sequential();

model.epochend += model_epochend;

model.add(new dense(64, acttype.relu));

model.add(new dense(1, acttype.sigmoid));

使用損失函式編譯模型,在這種情況下,我們使用meansquared error,乙個公制函式,它是binaryaccurary,最後是乙個優化函式,它將負責有效地更新神經權重。

通過傳遞訓練資料集呼叫訓練方法,迭代次數以重新訪問資料集以學習模式和批量大小以批量學習,這對於更大的資料集是有用的。

//compile with optimizer, loss and metric

model.compile(optimizertype.sgd, losstype.meansquarederror, metrictype.binaryaccurary);

// train for 1000 epoch with batch size of 2

model.train(trainset, epochs: 1000, batchsize: 2);

在訓練之後,讓我們呼叫**函式來檢查模型的準確性。原始**生成乙個十進位制值,因此我使用round函式將其完成為最接近的整數值

//create prediction data to evaluate

dataframe2d predx = new dataframe2d(2);

predx.load(0, 0, 0, 1); //result should be 0 and 1

var rawpred = model.predict(predx);

global.currentbackend.round(rawpred).print();

console.readline();

讓我們執行該函式,您將看到在model_epochend方法中列印的迭代日誌。

對於我們提供的測試資料,**結果準確,0和1。 此外,如果我們看到訓練期間的準確率在第100個時期內達到100%(準確度:1)。 這是乙個關於庫入門的簡單示例。 您可以通過更改第一行**來更改後端以使用tensorsharp:

global.useengine(sianet.backend.tensorsharp.sianetbackend.instance,devicetype.cpu);

線性神經網路 解決異或問題

日常三大包 import numpy as np import pandas as pd import matplotlib.pyplot as plt多想想upadte函式的原理,這裡是先隨機乙個權重w,然後w的置換與x相乘去,得到的是乙個列 w1x1 w2x2 w3x3的形式 然後其與y進行比較...

BP神經網路 解決異或問題

import numpy as np import matplotlib.pyplot as plt 輸入資料 4,3 x np.array 1,0,0 1,0,1 1,1,0 1,1,1 標籤y np.array 0,1,1,0 權值初始化,1行3列,取值範圍 1到1 v np.random.ra...

訓練神經網路解決而分類問題

導入庫 import tensorflow as tf from numpy.random import randomstate 定義訓練資料batch的大小 batch size 8 定義神經網路的引數 w1 tf.variable tf.random normal 2,3 stddev 1,se...