# 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 ![](https://i.imgur.com/nbUS8Ax.png) ### 進入虛擬環境 ``` 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()) ```