Toy Neural Network
##Import the libraries
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.optimizers import Adam
## Creating the model
model = Sequential()
model.add(Dense(4,activation='relu')) ##<----- You don't have to specify input size.Just define the hidden layers
model.add(Dense(4,activation='relu'))
model.add(Dense(1))
## defining the optimiser and loss function
model.compile(optimizer='adam',loss='mse')
## training the model
model.fit(x=X_train,y=y_train,
validation_data=(X_test,y_test),
batch_size=128,epochs=400)
이 코드는 자동으로 Input의 크기가 자동으로 인식되고, 다른 레이어를 추가하거나 제거하기가 어렵다. Sequential API는 모델 생성이 쉽지만 자유롭지 못하다는 것이 단점이다.
##Import the libraries
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input,Dense
## Creating the layers
input_layer = Input(shape=(3,))
Layer_1 = Dense(4, activation="relu")(input_layer)
Layer_2 = Dense(4, activation="relu")(Layer_1)
output_layer= Dense(1, activation="linear")(Layer_2)
##Defining the model by specifying the input and output layers
model = Model(inputs=input_layer, outputs=output_layer)
## defining the optimiser and loss function
model.compile(optimizer='adam',
loss='mse')
## training the model
model.fit(X_train, y_train,epochs=400, batch_size=128,validation_data=(X_test,y_test))
이렇게 되면 다른 추가 적인 히든 레이어를 붙일 수 있게 된다.
이 사진에서 알 수 있듯이 두 번째 숨겨진 레이어 다음에 하나의 레이어가 더 추가될 수 있다. 두 번째 히든 레이어의 출력은 'y1'을 예측하는 데 사용되며 동시에 두 번째 출력 'y2'를 예측하는 하나 이상의 레이어(분기된 은닉 레이어)로 가게 된다.
두 번째 출력을 예측하기 위해 더 많은 레이어와 뉴런을 추가할 수 있다. 이것이 Functional API가 제공하는 유연성 때문에 Sequential API보다 우위에 있는 부분이다. 이를 사용하여 동시에 여러 출력을 예측할 수 있는데, 순차 API를 사용하여 출력 y1 및 y2를 예측하기 위해 2개의 다른 신경망을 구축했지만 Functional API를 사용하면 단일 네트워크에서 두 개의 출력을 예측할 수 있게 된다.
##define input layer
input_layer = Input(shape=(3,),name='input_layer')
##Defining 2 hidden layers
Layer_1 = Dense(10, activation="relu",name='Layer_1')(input_layer)
Layer_2 = Dense(10, activation="relu",name='Layer_2')(Layer_1)
##Defining output layer y1
y1_output= Dense(1, activation="linear",name='y1_output')(Layer_2)
##Defining Branched layer
Branched_layer=Dense(10, activation="relu",name='Branched_layer')(Layer_2)
##Defining 2nd output layer y2
y2_output= Dense(1, activation="linear",name='y2_output')(Branched_layer)
##Defining the model by specifying the input and output layers
model = Model(inputs=input_layer,outputs=[y1_output,y2_output])
이렇게 y2로 가는 Branched Hidden Layer를 만들 수 있다.
from tensorflow.keras.layers import Layer, Input
from tensorflow.keras.models import Model
import tensorflow as tf
class CustomDense(tf.keras.layers.Layer):
# CustomDense 객체 생성시 입력되는 초기화 parameter 처리
def __init__(self, units=32):
super(CustomDense, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(
shape=(input_shape[-1], self.units),
initializer="random_normal",
trainable=True,
)
self.b = self.add_weight(
shape=(self.units,), initializer="random_normal", trainable=True
)
# CustomDense 객체에 callable로 입력된 입력 데이터 처리.
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
# input 값을 4개의 원소를 가지는 1차원으로 생성.
inputs = Input((4,))
# 10개의 unit을 가지는 CustomDense 객체를 생성 후 callable로 inputs값 입력
outputs = CustomDense(10)(inputs)
# inputs와 outputs로 model 생성.
model = Model(inputs, outputs)
model.summary()
https://www.analyticsvidhya.com/blog/2021/07/understanding-sequential-vs-functional-api-in-keras/