Hands-on ML Ch 10: Neural Network
15730 ワード
乗算、演算を実行する人工ニューロンの出現.
Perceptron
転送経路は、各層が前の層の出力を計算し、次の層に転送する.Backpropの中間計算値を保存します. BackPropagationは、最終予測値に対する各出力接続の誤差寄与を計算する.各重みの誤差勾配を測定する過程. 最後に勾配降下法により重みを調整する、この誤差 を低減する.
Step関数をsigmoid関数に変更して勾配を計算します.
skip接続の形式
keras.シーケンスインスタンスではなくクラスインスタンスとして作成することもできます.Hyperparameter Tuning
下層は低層構造モデリング である.中間層はより低いレベルの構造を接続し、中レベルの構造モデリング である.の最上位の非表示レイヤと出力レイヤは、高度な構造モデリング のために中間レイヤを接続する.
新しいニューラルネットワークでは,最初の層の重みと偏向値をtransfer learningの原理に初期化するのではなく,最初の層の重みと偏向値を整数に初期化した.
この方法はほとんどの画像における低レベル構造を学習する必要はない.
Perceptron
入力と出力は数値で、各入力接続はウェイトに関連しています.
重み付け和を計算しstep関数を適用して結果を出力します.
hw(x)=step(z),z=XTwh_w(x) = step(z), z = X^Twhw(x)=step(z),z=XTw
各TLU(しきい値論理ユニット)が全ての入力層に接続されている場合、全接続層と称される.(またはレスポンス層)
1つのサンプリングポイントが1つのサンプリングポイントに一度に注入されると、各サンプリングポイントに対して予測が生成され、入力に関連する重み値が増強され、すべての予測エラーの出力ニューロンを正確に予測する.
Multi-layer Perceptron
Input Layer-Hidden Layer-Output Layerの構造.すべてのフロアが次の階と完全につながっています.
Step関数をsigmoid関数に変更して勾配を計算します.
from tensorflow import keras
import tensorflow as tf
model = keras.models.Sequential()
# 입력 이미지를 1d array 로 변환. 모델의 첫번째 층에 해당함.
model.add(kears.layers.Flatten(input_shape = [28, 28]))
# 뉴런 300개 짜리 hidden layer
model.add(keras.layers.Dense(300, activation = "relu"))
model.add(keras.layers.Dense(100, activation = "relu"))
# 뉴런 10개 짜리 hidden layer. Independent class 결과를 위해 softmax 함수 사용
model.add(keras.layers.Dense(10, activation = "softmax"))
# 만약에 one-hot vector 일 경우에는 그냥 "categorical_crossentropy"를 사용
model.compile(loss = "sparse_categorical_crossentropy",
optimizer = "sgd",
metrics = ["accuracy"])
Wide and Deep Model
skip接続の形式
keras.シーケンスインスタンスではなくクラスインスタンスとして作成することもできます.
class WideandDeepModel(keras.Model):
def __init__(self, units = 30, activation = "relu", **kwargs):
super().__init__(**kwargs)
self.hidden1 = keras.layers.Dense(units, activation = activation)
self.hidden2 = keras.layers.Dense(units, activation = activation)
self.main_output = keras.layers.Dense(1)
self.aux_output = keras.layers.Dense(1)
def call(self, inputs):
input_A, input_B = inputs
hidden1 = self.hidden1(input_B)
hidden2 = self.hidden2(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
main_output = self.main_output(concat)
aux_output = self.aux_output(hidden2)
return main_output, aux_output
model = WideandDeepModel()
Hyperparameter Tuning
たとえば、回帰モデルを作成するときにscikit-learningが提供するランダム検索方法を使用してnum of layersやlearning rateなどを検索できます.# 먼저 model 을 구성하는 함수를 정의
def build_model(n_hidden = 1, n_neurons = 30, lr = 3e-3, input_shape = [8]):
model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape = input_shape)
for layer in range(n_hidden):
model.add(keras.layers.Dense(n_neurons, activation = "relu")
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(lr = lr)
model.compile(loss = "mse", optimizer = optimizer)
return model
# regression model 생성
keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
# Random Search 진행하기
from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV
params = {
"n_hiddens": [0, 1, 2, 3],
"lr" = reciprocal(3e-4, 3e-2)
}
randomsrch = RandomizedSearchCV(keras_reg, prams, n_iter = 10, cv = 3)
randomsrch.fit(X_train, y_train, epochs = 100,
validation_data = (X_valid, y_valid), # cv 에는 사용하지 않으나 patience 측정에 사용
callbacks = [keras.callbacks.EarlyStopping(patience = 30)]
)
print(randomsrch.best_params_)
final_model = randomsrch.best_estimator_.model
Transfer Learning
一般的に、隠層学習は次のようになります.
# 먼저 model 을 구성하는 함수를 정의
def build_model(n_hidden = 1, n_neurons = 30, lr = 3e-3, input_shape = [8]):
model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape = input_shape)
for layer in range(n_hidden):
model.add(keras.layers.Dense(n_neurons, activation = "relu")
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(lr = lr)
model.compile(loss = "mse", optimizer = optimizer)
return model
# regression model 생성
keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
# Random Search 진행하기
from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV
params = {
"n_hiddens": [0, 1, 2, 3],
"lr" = reciprocal(3e-4, 3e-2)
}
randomsrch = RandomizedSearchCV(keras_reg, prams, n_iter = 10, cv = 3)
randomsrch.fit(X_train, y_train, epochs = 100,
validation_data = (X_valid, y_valid), # cv 에는 사용하지 않으나 patience 측정에 사용
callbacks = [keras.callbacks.EarlyStopping(patience = 30)]
)
print(randomsrch.best_params_)
final_model = randomsrch.best_estimator_.model
新しいニューラルネットワークでは,最初の層の重みと偏向値をtransfer learningの原理に初期化するのではなく,最初の層の重みと偏向値を整数に初期化した.
この方法はほとんどの画像における低レベル構造を学習する必要はない.
Reference
この問題について(Hands-on ML Ch 10: Neural Network), 我々は、より多くの情報をここで見つけました https://velog.io/@tedlim23/Hands-on-ML-Ch-10-Neural-Networkテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol