<jupyter_start><jupyter_text>공유 레이어함수형 API의 또 다른 유용한 사용처는 공유 레이어를 사용하는 모델입니다. 공유 레이어에 대해서 알아봅시다.트윗 데이터셋을 고려해 봅시다. 두 개의 다른 트윗을 두고 동일한 사람이 작성했는지 여부를 가려내는 모델을 만들고자 합니다 (이는, 예를 들어 트윗의 유사성을 기준으로 사용자를 비교할 수 있도록 합니다).이를 구현하는 방법의 하나는 두 개의 트윗을 두 벡터로 인코딩하고 그 두 벡터를 연결한 후 로지스틱 회귀를 더하는 모델을 만드는 것입니다; 이는 두 트윗이 동일한 저자를 공유할 확률을 출력합니다. 그에 따라 모델은 양성 트윗 쌍과 음성 트윗 쌍에 대해서 학습됩니다.문제가 대칭적이므로, 첫 번째 트윗을 인코딩하는 메커니즘을 (가중치 등을 포함해) 전부 재사용하여 두 번째 트윗을 인코딩해야 합니다. 이 예시에서는 공유된 장단기 메모리 레이어를 사용해 트윗을 인코딩 합니다.함수형 API로 이 모델을 만들어 봅시다. (280, 256) 형태의 이진 행렬, 다시 말해 256 크기의 벡터 280개로 이루어진 시퀀스를 트윗에 대한 인풋으로 받습니다 (여기서 256 차원 벡터의 각 차원은 가장 빈번한 256 부호의 자모 중 해당 부호의 유/무를 인코딩합니다).import keras<jupyter_code>import keras
from keras.layers import Input, LSTM, Dense
from keras.models import Model
tweet_a = Input(shape=(280, 256))
tweet_b = Input(shape=(280, 256))
# 이 레이어는 행렬을 인풋으로 전달받고
# 64 크기의 벡터를 반환합니다
shared_lstm = LSTM(64)
# 동일한 레이어 인스턴스를
# 여러 번 재사용하는 경우, 레이어의
# 가중치 또한 재사용됩니다
# (그렇기에 이는 실질적으로 *동일한* 레이어입니다)
encoded_a = shared_lstm(tweet_a)
encoded_b = shared_lstm(tweet_b)
# 이제 두 벡터를 연결할 수 있습니다:
merged_vector = keras.layers.concatenate([encoded_a, encoded_b], axis=-1)
# 그리고 로지스틱 회귀를 상층에 추가합니다
predctions = Dense(1, activation='sigmoid')(merged_vector)
# 트윗 인풋을 예측에 연결하는
# 학습 가능한 모델을 정의합니다
model = Model(inputs=[tweet_a, tweet_b], outputs=predctions)
model.compile(optimizer='rmsprop', loss='binary_crossentropy',
             metrics=['accuracy'])
model.fit([data_a, data_b], labels, epochs=10)
a = Input(shape=(280, 256))
lstm = LSTM(32)
encoded_a = lstm(a)

lstm.output
encoded_a
b = Input(shape=(280,256))
encoded_b = lstm(b)
lstm.output
lstm.get_output_at(0)
lstm.get_output_at(1)
from keras.layers import Conv2D

c = Input(shape=(32, 32, 3))
d = Input(shape=(64, 64, 3))

conv = Conv2D(16, (3, 3), padding='same')
conved_c = conv(c)
conved_d = conv(d)
conv.get_input_shape_at(0)
conv.get_input_shape_at(1)
conv.get_output_shape_at(0)
conv.get_output_shape_at(1)<jupyter_output><empty_output><jupyter_text>inception 모듈<jupyter_code>from keras.layers import Conv2D, MaxPooling2D, Input

input_img = Input(shape=(256, 256, 3))

tower_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img)
tower_1 = Conv2D(64, (3, 3), padding='same', activation='relu')(tower_1)

tower_2 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img)
tower_2 = Conv2D(64, (5, 5), padding='same', activation='relu')(tower_2)

tower_3 = MaxPooling2D((3, 3), strides=(1, 1), padding='same')(input_img)
tower_3 = Conv2D(64, (1, 1), padding='same', activation='relu')(tower_3)

output = keras.layers.concatenate([tower_1, tower_2, tower_3], axis=1)
output.shape
tower_1
tower_2
tower_3<jupyter_output><empty_output><jupyter_text>컨볼루션 레이어에 대한 잔여 연결<jupyter_code>from keras.layers import Conv2D, Input
x = Input(shape=(256, 256,3))
y = Conv2D(3, (3, 3), padding='same')(x)
z = keras.layers.add([x, y])
x
y
z<jupyter_output><empty_output><jupyter_text>시각 공유 모델<jupyter_code>from keras.layers import Conv2D, MaxPooling2D, Input, Dense, Flatten
from keras.models import Model

digit_input = Input(shape=(27, 27, 1))
x = Conv2D(64, (3, 3))(digit_input)
x = Conv2D(64, (3, 3))(x)
x = MaxPooling2D((2, 2))(x)
out = Flatten()(x)

vision_model = Model(digit_input, out)
digit_a = Input(shape=(27, 27, 1))
digit_b = Input(shape=(27, 27, 1))

out_a = vision_model(digit_a)
out_b = vision_model(digit_b)

concatenated = keras.layers.concatenate([out_a, out_b])
out = Dense(1, activation='sigmoid')(concatenated)

classification_model = Model([digit_a, digit_b], out)
digit_input
x
out
vision_model
digit_a
digit_b
out_a
out_b
concatenated
out
classification_model<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13280175969205388, 'fraction_numerical': 0.04729172394830904, 'mean_word_length': 5.851224105461394, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '543544', 'license': 'MIT', 'n_tokens_mistral': 2198, 'n_tokens_neox': 2350, 'n_words': 415, 'path': '2020-03/2020-03-19-keras.io-3.ipynb', 'repo_name': 'kimwooglae/keraspp', 'size': '3637'}