###### 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 會出現以下錯誤:

:::
## 改為使用 Google Colab 來訓練模型
:::info
這裡採FM636A 《Python×AI 生醫感測健康大應用》中的 CH08 (P.70)為範例
:::
### 操作 Colab
點擊進入 [Colab](https://colab.research.google.com/) 官網,並使用google帳戶登入

點選左上角的**檔案 -> 新增記事本**

會開啟一個新視窗,也就是編寫程式的頁面:

我們附的範例程式碼都有以 pass 敘述分段,而 Colab 有一個很大的特色,可以將程式碼分段執行,方便分段觀察執行結果。所以如果想要新增一段程式碼,則可以按一下左邊的 **+程式碼**,而右邊的**垃圾桶圖標** 則可以刪除一段程式碼:

### 如何上傳檔案
在訓練模型時,我們必須上傳自己的資料以及相關模組,在Colab上傳檔案的方式也很簡單,只需匯入模組即可用程式來上傳
```python
from google.colab import files
uploaded = files.upload() # 匯入heart_risk.txt
uploaded = files.upload() # 匯入keras_lite_convertor
```
我們將上述程式碼複製到第一段空白窗格裡,並按下左邊的執行鈕:

接著點擊**選擇檔案**的按鈕,上傳 heart_risk 檔案:

上傳完成後會再需要上傳 keras_lite_convertor.py 檔:

### 開始撰寫訓練模型
:::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
```

點選執行按鈕後則可以執行區塊內的程式,必須確保每一個區塊都被執行到,否則後面執行時會出錯喔!
接下來每一個程式都是個別區塊,一一執行並觀察輸出結果:
```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
```
執行後會輸出神經網路架構:

### 訓練模型
```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 的程式中使用:

另外, 也請按左邊的檔案圖示顯示檔案窗格, 在剛剛儲存的 temperature_model.json 檔案上按滑鼠右鍵選『下載』, 稍後會搭配 MicroPython 程式進行即時預測:
