[!Important]+ Goals
- 기초 알고리즘의 개요
- 기본적인 구현방법
- 튜닝 방법
[!info]+ Subject
- 기계학습 프로젝트에 관련된 모든 분
- DL 구현을 시작하고 싶으신 분
[!abstract]+ Curriculum
1. 심층학습 실전
2. 심층학습 튜닝
- 첨삭문제
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.layers import Dense, Activation, Dropout
from tensorflow.keras.datasets import mnist
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = tf.keras.utils.to_categorical(y_train)[:6000]
y_test = tf.keras.utils.to_categorical(y_test)[:1000]
model = tf.keras.Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=['accuracy'])
# epochs数は5を指定
history = model.fit(X_train, y_train, batch_size=500, epochs=5, verbose=1, validation_data=(X_test, y_test))
#acc, val_accのプロット
plt.plot(history.history['accuracy'], label="acc", ls="-", marker="o")
plt.plot(history.history["val_accuracy"], label="val_acc", ls="-", marker="x")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()
>>> Epoch 1/5
>>> 1/12 [=>............................] - ETA: 0s - loss: 2.6069 - accuracy: 0.0940
>>> 6/12 [==============>...............] - ETA: 0s - loss: 2.5584 - accuracy: 0.1030
>>> 12/12 [==============================] - 0s 24ms/step - loss: 2.5531 - accuracy: 0.1067 - val_loss: 2.2820 - val_accuracy: 0.1570
>>>
>>> Epoch 2/5
>>> 1/12 [=>............................] - ETA: 0s - loss: 2.5821 - accuracy: 0.0940
>>> 7/12 [================>.............] - ETA: 0s - loss: 2.5061 - accuracy: 0.1097
>>> 12/12 [==============================] - 0s 11ms/step - loss: 2.4921 - accuracy: 0.1135 - val_loss: 2.2371 - val_accuracy: 0.2120
>>>
>>> Epoch 3/5
>>> 1/12 [=>............................] - ETA: 0s - loss: 2.3880 - accuracy: 0.1360
>>> 5/12 [===========>..................] - ETA: 0s - loss: 2.4374 - accuracy: 0.1336
>>> 10/12 [========================>.....] - ETA: 0s - loss: 2.4399 - accuracy: 0.1282
>>> 12/12 [==============================] - 0s 14ms/step - loss: 2.4374 - accuracy: 0.1278 - val_loss: 2.2023 - val_accuracy: 0.2840
>>>
>>> Epoch 4/5 1/12 [=>............................] - ETA: 0s - loss: 2.3907 - accuracy: 0.1520
>>> 5/12 [===========>..................] - ETA: 0s - loss: 2.4087 - accuracy: 0.1304
>>> 12/12 [==============================] - ETA: 0s - loss: 2.4008 - accuracy: 0.1392
>>> 12/12 [==============================] - 0s 14ms/step - loss: 2.4008 - accuracy: 0.1392 - val_loss: 2.1724 - val_accuracy: 0.3470
>>>
>>> Epoch 5/5 1/12 [=>............................] - ETA: 0s - loss: 2.3424 - accuracy: 0.1400
>>> 7/12 [================>.............] - ETA: 0s - loss: 2.3600 - accuracy: 0.1491
>>> 12/12 [==============================] - 0s 11ms/step - loss: 2.3578 - accuracy: 0.1483 - val_loss: 2.1435 - val_accuracy: 0.3870
딥러닝의 프로그래밍을 보다 간결하고 직감적으로 만드는 라이브러리
TensorFlow : 구현 부분에 자주 사용
- Keras : TensorFlow 안의 고수준 API, tf.keras
PyTorch : 연구 분야에 자주 사용
from tensorflow.keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 次の一行を変更してください
print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
#tf/keras/layers/activation #tf/keras/layers/dense
#history #tf/keras/fit
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.utils import plot_model
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
tf.random.set_seed(32) # 乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# (◯, 28, 28)のデータを(◯, 784)に次元削減します。(簡単のためデータ数を減らします)
shapes = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], shapes)[:6000]
X_test = X_test.reshape(X_test.shape[0], shapes)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
# 入力ユニット数は784, 1つ目の全結合層の出力ユニット数は256
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
# 2つ目の全結合層の出力ユニット数は128。活性化関数はrelu。
model.add(Dense(128))
model.add(Activation("relu"))
# 3つ目の全結合層(出力層)の出力ユニット数は10
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
#---------------------------
# ここに書いて下さい
history = model.fit(X_train, y_train, verbose=1, epochs=3)
#---------------------------
#acc, val_accのプロット
plt.plot(history.history["accuracy"], label="accuracy", ls="-", marker="o")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()
#tf/keras/evaluate
#tf/keras/predict
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
model.fit(X_train, y_train, verbose=1)
score = model.evaluate(X_test, y_test, verbose=0)
print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score))
# 検証データの最初の10枚を表示します
for i in range(10):
plt.subplot(1, 10, i+1)
plt.imshow(X_test[i].reshape((28,28)), "gray")
plt.show()
# X_testの最初の10枚の予測されたラベルを表示しましょう
#---------------------------
# ここに書いて下さい
pred = np.argmax(model.predict(X_test[0:10]), axis=1)
print("予測値 :" + str(pred))
#---------------------------
>>> 1/188 [..............................] - ETA: 0s - loss: 2.3778 - accuracy: 0.0625
>>> 21/188 [==>...........................] - ETA: 0s - loss: 2.3032 - accuracy: 0.1622
>>> 46/188 [======>.......................] - ETA: 0s - loss: 2.2571 - accuracy: 0.1984
>>> 71/188 [==========>...................] - ETA: 0s - loss: 2.2220 - accuracy: 0.2447
>>> 96/188 [==============>...............] - ETA: 0s - loss: 2.1858 - accuracy: 0.3070
>>> 118/188 [=================>............] - ETA: 0s - loss: 2.1537 - accuracy: 0.3435 143/188 [=====================>........] - ETA: 0s - loss: 2.1214 - accuracy: 0.3800
>>> 162/188 [========================>.....] - ETA: 0s - loss: 2.0981 - accuracy: 0.4057
>>> 186/188 [============================>.] - ETA: 0s - loss: 2.0693 - accuracy: 0.4325
>>> 188/188 [==============================] - 0s 2ms/step - loss: 2.0670 - accuracy: 0.4352
>>> evaluate loss: 1.8662300109863281
>>> evaluate acc: 0.597000002861023
>>> 予測値 :[7 6 1 0 4 1 4 7 1 4]
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras import optimizers
from tensorflow.keras.utils import to_categorical
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
model.add(Dense(256, input_dim=784))
# ハイパーパラメータ:活性化関数
model.add(Activation("sigmoid"))
# ハイパーパラメータ:隠れ層の数、隠れ層のユニット数
model.add(Dense(128))
model.add(Activation("sigmoid"))
# ハイパーパラメータ:ドロップアウトする割合(rate)
model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))
# ハイパーパラメータ:学習率(lr)
sgd = optimizers.SGD(lr=0.01)
# ハイパーパラメータ:最適化関数(optimizer)
# ハイパーパラメータ:誤差関数(loss)
model.compile(optimizer=sgd, loss="categorical_crossentropy", metrics=["accuracy"])
# ハイパーパラメータ:バッチサイズ(batch_size)
# ハイパーパラメータ:エポック数(epochs)
model.fit(X_train, y_train, batch_size=32, epochs=10, verbose=1)
score = model.evaluate(X_test, y_test, verbose=0)
print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score))
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras import optimizers
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
def funcA():
model.add(Dense(128))
model.add(Activation("sigmoid"))
def funcB():
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
def funcC():
model.add(Dense(1568))
model.add(Activation("sigmoid"))
# A、B、Cのモデルの中から1つを選び、残りの2つはコメントアウトしてください。
#---------------------------
#funcA()
#funcB()
#funcC()
#---------------------------
model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
model.fit(X_train, y_train, batch_size=32, epochs=3, verbose=1)
score = model.evaluate(X_test, y_test, verbose=0)
print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score))
#tf/keras/layers/dropout
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras import optimizers
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
#- --------------------------
# ここを書いて下さい
model.add(Dropout(rate=0.5))
# ここまで書いて下さい
# ---------------------------
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
history = model.fit(X_train, y_train, batch_size=32, epochs=5, verbose=1, validation_data=(X_test, y_test))
#acc, val_accのプロット
plt.plot(history.history["accuracy"], label="acc", ls="-", marker="o")
plt.plot(history.history["val_accuracy"], label="val_acc", ls="-", marker="x")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()
#tf/keras/layers/activation
#MSE
#cross_entropy_loss
#optimizer
#learning_rate
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras import optimizers
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))
def funcA():
global lr
lr = 0.01
def funcB():
global lr
lr = 0.1
def funcC():
global lr
lr = 1.0
# 3つのうち1つを選び、他の2行をコメントアウトして学習率を決めます。
#---------------------------
#funcA()
#funcB()
#funcC()
#---------------------------
sgd = optimizers.SGD(lr=lr)
model.compile(optimizer=sgd, loss="categorical_crossentropy", metrics=["accuracy"])
model.fit(X_train, y_train, batch_size=32, epochs=3, verbose=1)
score = model.evaluate(X_test, y_test, verbose=0)
print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score))
#minibatch
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras import optimizers
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
def funcA():
global batch_size
batch_size = 16
def funcB():
global batch_size
batch_size = 32
def funcC():
global batch_size
batch_size = 64
# 3つのうち1つを選び、他の2行をコメントアウトしてbatch_sizeを決めてください。
#---------------------------
funcA()
#funcB()
#funcC()
#---------------------------
model.fit(X_train, y_train, batch_size=batch_size, epochs=3, verbose=1)
score = model.evaluate(X_test, y_test, verbose=0)
print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score))
#epoch
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras import optimizers
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(32) #乱数を固定
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784)[:1000]
X_test = X_test.reshape(X_test.shape[0], 784)[:6000]
y_train = to_categorical(y_train)[:1000]
y_test = to_categorical(y_test)[:6000]
model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
# 今回はDropoutを使いません。
#model.add(Dropout(rate=0.5))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
def funcA():
global epochs
epochs = 5
def funcB():
global epochs
epochs = 10
def funcC():
global epochs
epochs = 50
# 3つのうち1つを選び、他の2行をコメントアウトしてエポック数を決めてください。
#---------------------------
funcA()
funcB()
funcC()
#---------------------------
history = model.fit(X_train, y_train, batch_size=32, epochs=epochs, verbose=1, validation_data=(X_test, y_test))
#acc, val_accのプロット
plt.plot(history.history["accuracy"], label="acc", ls="-", marker="o")
plt.plot(history.history["val_accuracy"], label="val_acc", ls="-", marker="x")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()
score = model.evaluate(X_test, y_test, verbose=0)
print("evaluate loss: {0[0]}\nevaluate acc: {0[1]}".format(score))
import numpy as np
import tensorflow as tf
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Activation, Dense, Dropout, Input, BatchNormalization
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing
import matplotlib.pyplot as plt
# 出力結果の固定
tf.random.set_seed(0)
%matplotlib inline
# sklearnからデータセットを読み込みます
california_housing = fetch_california_housing()
X = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
Y = pd.Series(california_housing.target)
# 説明変数のデータから緯度・経度(Latitude・Longitude)のデータを削除します
X=X.drop(columns=['Latitude','Longitude'])
# テストデータとトレーニングデータに分割します
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=42)
model = Sequential()
model.add(Dense(32, input_dim=6))
model.add(Activation('relu'))
#上にならって、ユニット数128の中間層をmodel.addで追加してください。
model.add(Dense(128))
#上にならって、活性化関数reluをmodel.addで追加してください。
model.add(Activation("relu"))
model.add(Dense(1))
# 損失関数にmse、最適化関数にadamを採用
model.compile(loss='mse', optimizer='adam')
# モデルを学習させます
history = model.fit(X_train, y_train,
epochs=30, # エポック数
batch_size=16, # バッチサイズ
verbose=1,
validation_data=(X_test, y_test) )
# 予測値を出力します
y_pred = model.predict(X_test)# model.predictにX_testのデータを入れて予測値を出力させてください
# 二乗誤差を出力します
mse= mean_squared_error(y_test, y_pred)
print("REG RMSE : %.2f" % (mse** 0.5))
# epoch毎の予測値の正解データとの誤差を表しています
# バリデーションデータのみ誤差が大きい場合、過学習を起こしています
train_loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=len(train_loss)
plt.plot(range(epochs), train_loss, marker = '.', label = 'train_loss')
plt.plot(range(epochs), val_loss, marker = '.', label = 'val_loss')
plt.legend(loc = 'best')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()