# tensorflow --- CNN
###### tags: `實驗室課` `計算智慧與規劃`
## 前置作業
- [Tensorflow教學](https://hackmd.io/@vincentinttsh/ryVuYu_Sd)
- Pipfile
```[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
pandas = "~=1.2"
tensorflow = "~=2.4"
[dev-packages]
[requires]
python_version = "3.8"
```
「tensorflow沒有安裝」和「python版本錯誤」都可以從Popfile確認(python 3.8 , tensoflow 2.4)
:::warning
看到 **Installation Succeeded** 才是安裝完成
:::
- 關於Pipenv
[Python 工具箱 (1) — 專案必備 Pipenv](https://medium.com/citycoddee/python-%E5%B7%A5%E5%85%B7%E7%AE%B1-1-%E5%B0%88%E6%A1%88%E5%BF%85%E5%82%99-pipenv-a517e292f6c)
[Pipenv 基本教學](https://hackmd.io/@cjchengtw/BJD3Q5btB?print-pdf#/)
## 執行
- `dataloader`.py -> `algorithm`.py -> `test`.py
- load data -> train model -> test model

### 進入虛擬環境
``` cmd=
cd "資料夾"
pipenv shell
```
### load data
#### dataLoader
``` python=
import tensorflow as tf
import numpy as np
import pandas as pd
class DataLoader():
def __init__(self):
trainData = pd.read_csv("train.csv", sep=",")
testData = pd.read_csv("test.csv", sep=",")
self.__trainData = [ x[3:] for x in trainData.values ]
self.__testData = [ x[3:] for x in testData.values]
self.argsLength = len(self.__testData[0])
self.num_train_data = len(self.__trainData)
self.train_data = tf.constant(self.__trainData)
self.test_data = tf.constant(self.__testData)
self.train_label = tf.constant([ x[2] for x in trainData.values ])
self.test_label = tf.constant([ x[2] for x in testData.values ])
def ignore(self, ignoreList):
need = set([ i for i in range(self.argsLength) ]) - set(ignoreList)
self.train_data = tf.constant([ [ x[i] for i in need ] for x in self.__trainData ])
self.test_data = tf.constant([ [ x[i] for i in need ] for x in self.__testData ])
def get_batch(self, batch_size):
index = np.random.randint(0, self.num_train_data, batch_size)
train_data = tf.constant([self.train_data[i].numpy() for i in index])
train_label = tf.constant([self.train_label[i].numpy() for i in index])
return train_data, train_label
```
#### dataLoader_cnn
``` python=
import tensorflow as tf
import numpy as np
import pandas as pd
from datetime import date
class DataLoader():
def __init__(self):
trainData = pd.read_csv("train.csv", sep=",")
testData = pd.read_csv("test.csv", sep=",")
past = date.fromisoformat(trainData.values[0][0])
now_data = []
now_label = 0
self.__train_data = []
self.train_label = []
for x in trainData.values:
now = date.fromisoformat(x[0])
if now == past:
now_data.append(x[3:])
now_label += x[2]
else:
if len(now_data) == 24:
self.__train_data.append(now_data)
self.train_label.append(now_label/24)
now_data = [x[3:]]
now_label = x[2]
past = now
self.num_train_data = len(self.__train_data)
self.argsLength = len(self.__train_data[0][0])
self.train_data = tf.constant(self.__train_data)
self.train_label = tf.constant(self.train_label)
past = date.fromisoformat(testData.values[0][0])
now_data = []
now_label = 0
self.__test_data = []
self.test_label = []
for x in testData.values:
now = date.fromisoformat(x[0])
if now == past:
now_data.append(x[3:])
now_label += x[2]
else:
if len(now_data) == 24:
self.__test_data.append(now_data)
self.test_label.append(now_label/24)
now_data = [x[3:]]
now_label = x[2]
past = now
self.test_data = tf.constant(self.__test_data)
self.test_label = tf.constant(self.test_label)
def ignore(self, ignoreList):
need = set([ i for i in range(self.argsLength) ]) - set(ignoreList)
temp = []
for i in range(len(self.__train_data)):
temp.append([[ x[i] for i in need ] for x in self.__train_data[i] ])
self.train_data = tf.constant(temp)
temp = []
for i in range(len(self.__test_data)):
temp.append([[ x[i] for i in need ] for x in self.__test_data[i] ])
self.test_data = tf.constant(temp)
def get_batch(self, batch_size):
index = np.random.randint(0, self.num_train_data, batch_size)
train_data = tf.constant([self.train_data[i].numpy() for i in index])
train_label = tf.constant([self.train_label[i].numpy() for i in index])
return train_data, train_label
```
### train model
#### liner
``` python=
import tensorflow as tf
import dataLoader
data = dataLoader.DataLoader();
data.ignore([])
X, y = data.train_data, data.train_label
model = tf.keras.Sequential(name="myLinerModel")
model.add(tf.keras.layers.Dense(units=1, activation='linear'))
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01), loss="mae", metrics = [tf.keras.metrics.RootMeanSquaredError()])
batch_size = 1000
epochs = 1000
model.fit(X, y, epochs=epochs, batch_size = batch_size)
model.summary()
model.save('linerModel', save_format="tf")
```
#### nn
``` python=
import tensorflow as tf
import dataLoader
data = dataLoader.DataLoader();
data.ignore([])
X, y = data.train_data, data.train_label
model = tf.keras.Sequential(name="nnModel")
model.add(tf.keras.layers.Dense(units=12, activation='relu', name="hidden1",
kernel_regularizer = tf.keras.regularizers.L1(0.01),
activity_regularizer = tf.keras.regularizers.L1(0.01)))
model.add(tf.keras.layers.Dense(units=4, activation='relu', name="hidden2",
kernel_regularizer = tf.keras.regularizers.L1(0.01),
activity_regularizer = tf.keras.regularizers.L1(0.01)))
model.add(tf.keras.layers.Dense(units=1))
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01), loss="mae", metrics = [tf.keras.metrics.RootMeanSquaredError()])
batch_size = 1000
epochs = 1000
model.fit(X, y, epochs=epochs, batch_size = batch_size)
model.summary()
model.save('nnModel', save_format="tf")
```
#### cnn
``` python=
from tensorflow.keras import Sequential, layers, metrics
from tensorflow.keras import regularizers, optimizers
import dataLoader_cnn as dataLoader
if __name__ == "__main__":
data = dataLoader.DataLoader()
data.ignore([])
X, y = data.train_data, data.train_label
model = Sequential(name="MyCNN")
model.add(layers.InputLayer(input_shape=(24,6)))
model.add(layers.Conv1D(filters=12, kernel_size=3, padding='same', activation='relu'))
model.add(layers.ReLU())
model.add(layers.MaxPool1D(pool_size=2))
model.add(layers.Conv1D(filters=6, kernel_size=3, padding='same', activation='relu'))
model.add(layers.ReLU())
model.add(layers.MaxPool1D(pool_size=2))
model.add(layers.Flatten())
model.add(layers.Dense(units=12, activation='relu', name="hidden1",
kernel_regularizer=regularizers.L1(0.01),
activity_regularizer=regularizers.L2(0.01)))
model.add(layers.Dense(units=4, activation='relu', name="hidden2",
kernel_regularizer=regularizers.L1(0.01),
activity_regularizer=regularizers.L2(0.01)))
model.add(layers.Dense(units=1, name="output"))
model.summary()
model.compile(optimizer=optimizers.SGD(learning_rate=0.01),
loss='mae',
metrics=[metrics.RootMeanSquaredError()])
epochs = 100
model.fit(X, y, epochs=epochs)
model.save('cnnModel', save_format="tf")
```
### test model
#### test
```python=
import tensorflow as tf
import dataLoader
REAL_PM = 319
if __name__ == "__main__":
data = dataLoader.DataLoader()
data.ignore([])
X, y = data.test_data, data.test_label
modelName = "linerModel"
model = tf.saved_model.load(modelName)
y_pred = model(X)
print("Liner:")
print(tf.reduce_mean(tf.math.abs(y_pred - y) * REAL_PM).numpy())
modelName = "nnModel"
model = tf.saved_model.load(modelName)
y_pred = model(X)
print("NN:")
print(tf.reduce_mean(tf.math.abs(y_pred - y) * REAL_PM).numpy())
```