在win10安裝keras.net紀錄

Installing Keras.net on vs2019/win10 and using c# for MNIST handwritten digit recognition

最近想研究AI,Keras算是最好的工具之一,但它的語言是python,與我熟悉的C# or VB是截然不同的環境。因為畢竟C#/VB擁有很好的使用者介面,是一個很好的應用程式開發工具。在搜尋後,發現,有keras.net這個工具,可以將Keras包裝成C#語言來執行,而其背後仍需安裝python、keras與tensorflow。

網路上,對於如何安裝寫得十分不清楚,我也對python不熟,經過好幾天諸多摸索,google,今天終於搞定,因此記錄一下。首先,先講我試過錯誤的部分

1.使用VS2019中的python,試圖用虛擬環境來安裝,安裝keras、tensorflow都OK,但到了keras.net nuget便失敗,總是有無法找到python38.dll的問題===>後來發現keras.net的python版本似乎必須是3.8 (測試過python-3.8.9-amd64.exe是OK的,但python 3.9版因為tensorflow還不支援,因此建議不要使用)

2.CPU必須是64位元,且必須支援AVX指令,基本上,Pentium or celeron都不支援,i3/i5/i7才有可能。不支援的結果,執行時會發生錯誤。

最後記錄一下安裝過程

1.先下載python 3.8.2: https://www.python.org/ftp/python/3.8.2/python-3.8.2-amd64.exe
(之前試過3.9,但某些原因失敗,也許可以再試一次。)

2.雙擊執行安裝,安裝時,有一個選項是加入環境變數,必須選取

3.安裝完畢後,到win10下方搜尋方塊,打入cmd,執行command line interface
(之前誤以為是從python idle去執行,但指令都不認識)

4.執行pip install keras
執行時,它會顯示正在下載資料,基本上,會有點久,別誤以為是當機,必須等到prompt跳回來

5.此時通常它會在最後顯示,你的pip版本可以更新,指令為'python -m pip install --upgrade pip',可打入該指令,將pip更新

6.接下來便是安裝tensorflow,打入pip install tensorflow
此過程中,我曾經有一次斷線錯誤,安裝失敗,再打一次安裝就可以

7.基本上你現在已經可以使用keras,但接下來我們要安裝keras.net在win vs2019上

8. 確定VS2019 community(我的是16.9.3版)安裝完成,有裝python開發、.net桌面開發、使用C++的桌面開發、python選項也是最原始的設定

9.開啟新檔案,選C#、主控台、(.net framework),注意,framework要選擇最高的至少4.7以上(我的是4.7.2),否則等一下安裝nuget套件會說錯誤(因為會用到tuplevale等新功能)

10.到工具=>Nuget套件管理員=>管理方案的Nuget套件

11.此時會出現一視窗,請選瀏覽,輸入keras.net,它便會出現套件,選擇Keras.net,並在右邊視窗選擇你的專案,安裝最新穩定版,點安裝後開始安裝
注意這安裝是逐一專案安裝的,它會幫你設好相關的參考並安裝相關的套件

12.注意有無錯誤,若.net framework版本太低會發生類似無法找到.net framework套件的錯誤,將之改成4.7以上便可以(專案屬性去改)

13.此時專案很可能會出現以下錯誤: "所建置之專案的處理器架構 "MSIL" 與參考 "Python.Runtime, Version=2.5.1.0, Culture=neutral, processorArchitecture=AMD64" 的處理器架構 "AMD64" 不相符。這可能會導致執行階段失敗。請考慮透過組態管理員變更專案的目標處理器架構,使專案與參考之間的處理器架構相對應,或者使用符合專案目標處理器架構之處理器架構的參考相依性。"

此時只要把 選單中,Debug Any Cpu,選一下Any Cpu=>組態管理員=>使用中的平台方案=>新增=>X64=>確定,即可將平台改為x64。錯誤便可消失。

14.找個範例吧: 試試看這個連結中的MNIST 便是手寫數字: https://github.com/SciSharp/Keras.NET

注意執行開頭會有錯誤:

"2021-04-12 20:57:08.525370: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found

2021-04-12 20:57:08.533700: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine."

這是因為沒有GPU安裝所致,不影響執行。

連同using的程式摘錄如下:

using Keras;

using Keras.Datasets;

using Keras.Layers;

using Keras.Models;

using Keras.Optimizers;

using Keras.Utils;

using Numpy;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

static void Main(string[] args)

{

int batch_size = 128;

int num_classes = 10;

int epochs = 12;

// input image dimensions

int img_rows = 28, img_cols = 28;

Shape input_shape = null;

// the data, split between train and test sets

var ((x_train, y_train), (x_test, y_test)) = MNIST.LoadData();

if (Backend.ImageDataFormat() == "channels_first")

{

x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols);

x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols);

input_shape = (1, img_rows, img_cols);

}

else

{

x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1);

x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1);

input_shape = (img_rows, img_cols, 1);

}

x_train = x_train.astype(np.float32);

x_test = x_test.astype(np.float32);

x_train /= 255;

x_test /= 255;

Console.WriteLine($"x_train shape: {x_train.shape}");

Console.WriteLine($"{x_train.shape[0]} train samples");

Console.WriteLine($"{x_test.shape[0]} test samples");

// convert class vectors to binary class matrices

y_train = Util.ToCategorical(y_train, num_classes);

y_test = Util.ToCategorical(y_test, num_classes);

// Build CNN model

var model = new Sequential();

model.Add(new Conv2D(32, kernel_size: (3, 3).ToTuple(),

activation: "relu",

input_shape: input_shape));

model.Add(new Conv2D(64, (3, 3).ToTuple(), activation: "relu"));

model.Add(new MaxPooling2D(pool_size: (2, 2).ToTuple()));

model.Add(new Dropout(0.25));

model.Add(new Flatten());

model.Add(new Dense(128, activation: "relu"));

model.Add(new Dropout(0.5));

model.Add(new Dense(num_classes, activation: "softmax"));

model.Compile(loss: "categorical_crossentropy",

optimizer: new Adadelta(), metrics: new string[] { "accuracy" });

model.Fit(x_train, y_train,

batch_size: batch_size,

epochs: epochs,

verbose: 1,

validation_data: new NDarray[] { x_test, y_test });

var score = model.Evaluate(x_test, y_test, verbose: 0);

Console.WriteLine($"Test loss: {score[0]}");

Console.WriteLine($"Test accuracy: {score[1]}");

Console.ReadLine();

}


14.將程式貼到main{ }中,此時許多namespace還沒連進來,因此,可在紅線部分,看它給的建議提示中,有關import XXXX部分,點選之,完成後,即可執行。
執行過程中可能有警告: "2021-04-12 19:29:51.056309: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
2021-04-12 19:29:51.062421: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore
above cudart dlerror if you do not have a GPU set up on your machine."
這是因為沒有裝GPU所致,不會影響結果。如何裝GPU,還得研究一下。

15.以下為執行畫面,正確率99.099%