###### tags: `Thonny` `FM636A` # TensorFlow 不支援 32 位元 Python 的解決辦法 Thonny 4.x 之後的版本改用 Python 3.10,如果遇到 Windows 7 的電腦只能安裝 **32 位元 Python 3.8 的 Thonny 4.x**,但是 **FM636A 《Python×AI 生醫感測健康大應用》** 會使用到 TensorFlow,而 TensorFlow 並不支援 32 位元的 Python,所以以下教學為改用 **Colab** 來訓練模型 :::warning 32 位元 Python 3.8 安裝 tensorflow 會出現以下錯誤: ![](https://i.imgur.com/DnrkEOb.jpg) ::: ## 改為使用 Google Colab 來訓練模型 :::info 這裡採FM636A 《Python×AI 生醫感測健康大應用》中的 CH08 (P.70)為範例 ::: ### 操作 Colab 點擊進入 [Colab](https://colab.research.google.com/) 官網,並使用google帳戶登入 ![](https://i.imgur.com/CxdXI54.png) 點選左上角的**檔案 -> 新增記事本** ![](https://i.imgur.com/u0r0jF2.png) 會開啟一個新視窗,也就是編寫程式的頁面: ![](https://i.imgur.com/gpkQPyC.png) 我們附的範例程式碼都有以 pass 敘述分段,而 Colab 有一個很大的特色,可以將程式碼分段執行,方便分段觀察執行結果。所以如果想要新增一段程式碼,則可以按一下左邊的 **+程式碼**,而右邊的**垃圾桶圖標** 則可以刪除一段程式碼: ![](https://i.imgur.com/3elcxri.jpg) ### 如何上傳檔案 在訓練模型時,我們必須上傳自己的資料以及相關模組,在Colab上傳檔案的方式也很簡單,只需匯入模組即可用程式來上傳 ```python from google.colab import files uploaded = files.upload() # 匯入heart_risk.txt uploaded = files.upload() # 匯入keras_lite_convertor ``` 我們將上述程式碼複製到第一段空白窗格裡,並按下左邊的執行鈕: ![](https://i.imgur.com/lQwpuQd.png) 接著點擊**選擇檔案**的按鈕,上傳 heart_risk 檔案: ![](https://i.imgur.com/LE6LYTL.png) 上傳完成後會再需要上傳 keras_lite_convertor.py 檔: ![](https://i.imgur.com/go4u30c.png) ### 開始撰寫訓練模型 :::info 您也可直接開啟 [Colab 範例筆記本](https://colab.research.google.com/drive/1_czR183hUZuPZ9Yd_gqj7OhRZ_TsmV85?usp=sharing)操作。 ::: 請新增一個程式區塊,並複製程式碼到裡面,接下來遇到的每個pass結尾都是一個程式區塊,將不再贅述: ```python=1 # %% 讀取資料 import keras_lite_convertor as kc path_name = 'heart_risk.txt' Data_reader = kc.Data_reader(path_name, mode='regression') data, label = Data_reader.read(random_seed=12) pass ``` ![](https://i.imgur.com/ctZZsE9.png) 點選執行按鈕後則可以執行區塊內的程式,必須確保每一個區塊都被執行到,否則後面執行時會出錯喔! 接下來每一個程式都是個別區塊,一一執行並觀察輸出結果: ```python=9 #資料分割-訓練集 split_num = int(len(data)*0.9) train_data = data[:split_num] train_label = label[:split_num] pass ``` 接著是正規化的區塊: ```python=15 # 資料正規化 # 特徵資料正規化(標準化) mean = train_data.mean(axis=0) std = train_data.std(axis=0) data -= mean data /= std # 標籤正規化(最大值正規化) label /= 100 pass ``` 切割並檢視資料集: ```python=27 # 查看資料集的形狀 # 訓練集 train_data = data[:split_num] # 訓練用資料 print(train_data.shape) train_label = label[:split_num] # 訓練用標籤 # 驗證集 validation_data=data[split_num:-30] # 驗證用資料 print(validation_data.shape) validation_label=label[split_num:-30] # 驗證用標籤 # 測試集 test_data=data[-30:] # 測試用資料,30 筆 print(test_data.shape) test_label=label[-30:] # 測試用標籤 pass ``` 建立神經網路: ```python=42 # 建立神經網路架構 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential() # 建立序列模型 model.add(Dense(200, activation='relu', # 增加一層神經層 input_shape=(9, ))) model.add(Dense(200, activation='relu')) # 增加一層神經層 model.add(Dense(1)) model.summary() pass ``` 執行後會輸出神經網路架構: ![](https://i.imgur.com/UeZvLPd.png) ### 訓練模型 ```python=54 # 編譯及訓練模型 model.compile( optimizer='adam', loss='mse', metrics=['mae']) history=model.fit( train_data, train_label, # 訓練集 validation_data=(validation_data, validation_label), # 驗證集 epochs=300) pass ``` ### 測試並預測模型 ```python=64 # %% 測試模型 prediction = model.predict(test_data) # 預測值 print('prediction:') print(prediction*100) print() # 實際值 print('ground truth:') print(test_label*100) print() # 誤差值 print('error:') print(test_label*100 - prediction*100) ``` 以上就是 Colab 訓練模型的方式,不必受到本機端 Python 版本限制去使用 tensorflow,並且可以分段執行程式清楚每一個段落在做什麼。 ## Ch09 的 temperature_model.py :::info 您也可直接開啟 [Colab 範例筆記本](https://colab.research.google.com/drive/1kc-XXfTrX9XhWBvixgw_vUSeSCSxTsGM?usp=sharing)操作。 ::: 請依照相同的方式建立一個新的筆記本。 ### 上傳檔案 先增加一個程式碼儲存格, 放入以下程式上傳必要的檔案: ```python from google.colab import files uploaded = files.upload() # 匯入 temperatures.txt uploaded = files.upload() # 匯入keras_lite_convertor ``` 在依序新增儲存格加入以下程式碼。首先是載入資料集: ```python=1 # 讀取 temperature.txt import keras_lite_convertor as kc path_name = 'temperature.txt' Data_reader = kc.Data_reader(path_name, mode='regression') data, label = Data_reader.read() ``` 資料預處理與正規化: ```python=8 # 資料預處理 # 取資料中的 85% 當作訓練集 split_num = int(len(data)*0.85) train_data = data[:split_num] train_label = label[:split_num] # 正規化 mean = train_data.mean() # 平均數 data -= mean std = train_data.std() # 標準差 data /= std label /= 100 # 將 label範圍落在 0~1 (label正規化) ``` 切割資料集: ```python=22 # 訓練集、驗證集、測試集的資料形狀 # 訓練集 print(train_data.shape) # 驗證集 validation_data = data[split_num:-5] print(validation_data.shape) validation_label = label[split_num:-5] # 測試集 test_data = data[-5:] print(test_data.shape) test_label = label[-5:] ``` 建立神經網路: ```python=36 # 建立神經網路架構 from tensorflow.keras.models import Sequential from tensorflow.keras import layers model = Sequential() # 增加一個密集層, 使用ReLU激活函數, 輸入層有1個輸入特徵 model.add(layers.Dense(20, activation='relu', input_shape=(1,))) model.add(layers.Dense(20, activation='relu')) model.add(layers.Dense(20, activation='relu')) model.add(layers.Dense(1)) model.summary() # 顯示模型資訊 ``` 編譯及訓練神經網路: ```python=50 # 編譯及訓練模型 model.compile(optimizer='adam', loss='mse', metrics=['mae']) train_history = model.fit( train_data, train_label, # 測試集 validation_data=(validation_data, validation_label), # 驗證集 epochs=1000) # 訓練週期 ``` 測試神經網路: ```python=58 # 測試模型 # 預測值 print('prediction:') print(model.predict(test_data)) print() # 實際值 print('groundtruth:') print(test_label) ``` 儲存訓練好的模型並顯示正規化相關資訊: ```python=67 # 儲存模型 kc.save(model,'temperature_model.json') # 顯示正規化相關資訊 print('mean =',mean) print('std =',std) ``` 請把網頁留在這裡, 稍後需要複製這裡的標準差以及平均值到 MicroPython 的程式中使用: ![](https://i.imgur.com/eqWPglN.png) 另外, 也請按左邊的檔案圖示顯示檔案窗格, 在剛剛儲存的 temperature_model.json 檔案上按滑鼠右鍵選『下載』, 稍後會搭配 MicroPython 程式進行即時預測: ![](https://i.imgur.com/q677UcT.png)