---
# System prepended metadata

title: TensorFlow 不支援 32 位元 Python 的解決辦法
tags: [FM636A, Thonny]

---

###### 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)
