하나의 단일 출력을 예측하기 위해 다중 입력 (실제로 3 개)이있는 Keras 분류 모델을 구성하고 있습니다. 특히 내 3 가지 입력 은 다음과 같습니다.
산출:
Python 코드 (다중 입력 케라 생성)
def kera_multy_classification_model():
sentenceLength_actors = 15
vocab_size_frequent_words_actors = 20001
sentenceLength_plot = 23
vocab_size_frequent_words_plot = 17501
sentenceLength_features = 69
vocab_size_frequent_words_features = 20001
model = keras.Sequential(name='Multy-Input Keras Classification model')
actors = keras.Input(shape=(sentenceLength_actors,), name='actors_input')
plot = keras.Input(shape=(sentenceLength_plot,), name='plot_input')
features = keras.Input(shape=(sentenceLength_features,), name='features_input')
emb1 = layers.Embedding(input_dim = vocab_size_frequent_words_actors + 1,
# based on keras documentation input_dim: int > 0. Size of the vocabulary, i.e. maximum integer index + 1.
output_dim = Keras_Configurations_model1.EMB_DIMENSIONS,
# int >= 0. Dimension of the dense embedding
embeddings_initializer = 'uniform',
# Initializer for the embeddings matrix.
mask_zero = False,
input_length = sentenceLength_actors,
name="actors_embedding_layer")(actors)
encoded_layer1 = layers.LSTM(100)(emb1)
emb2 = layers.Embedding(input_dim = vocab_size_frequent_words_plot + 1,
output_dim = Keras_Configurations_model2.EMB_DIMENSIONS,
embeddings_initializer = 'uniform',
mask_zero = False,
input_length = sentenceLength_plot,
name="plot_embedding_layer")(plot)
encoded_layer2 = layers.LSTM(100)(emb2)
emb3 = layers.Embedding(input_dim = vocab_size_frequent_words_features + 1,
output_dim = Keras_Configurations_model3.EMB_DIMENSIONS,
embeddings_initializer = 'uniform',
mask_zero = False,
input_length = sentenceLength_features,
name="features_embedding_layer")(features)
encoded_layer3 = layers.LSTM(100)(emb3)
merged = layers.concatenate([encoded_layer1, encoded_layer2, encoded_layer3])
layer_1 = layers.Dense(Keras_Configurations_model1.BATCH_SIZE, activation='relu')(merged)
output_layer = layers.Dense(Keras_Configurations_model1.TARGET_LABELS, activation='softmax')(layer_1)
model = keras.Model(inputs=[actors, plot, features], outputs=output_layer)
print(model.output_shape)
print(model.summary())
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['sparse_categorical_accuracy'])
모델의 구조
내 문제:
일부 학습 데이터에서 모델을 성공적으로 피팅하고 학습 한 후 나중에 사용하기 위해이 모델의 임베딩을 추출하고 싶습니다. 다중 입력 keras 모델을 사용하기 전의 주요 접근 방식은 3 개의 서로 다른 keras 모델을 훈련하고 모양 100의 3 개의 서로 다른 임베딩 레이어를 추출하는 것이 었습니다. 이제 다중 입력 keras 모델 이 있으므로 출력 모양이 있는 연결된 임베딩 레이어를 추출하고 싶습니다 ( 없음, 300).
이 파이썬 명령을 사용하려고 할 때 :
embeddings = model_4.layers[9].get_weights()
print(embeddings)
또는
embeddings = model_4.layers[9].get_weights()[0]
print(embeddings)
빈 목록 (첫 번째 코드 샘플) 또는 IndenError : list index out of range (두 번째 코드 샘플)를 얻습니다 .
이 문제에 대한 조언이나 도움에 미리 감사드립니다. 이 질문을 더 완벽하게 만들기 위해 내가 놓친 추가 정보가 있으면 의견에 자유롭게 물어보십시오.
Concatenate 레이어에는 가중치가 없으므로 (모델 요약에서 볼 수 있듯이 학습 가능한 매개 변수가 없음) get_weights()
출력이 비어 있습니다. 연결은 작업입니다.
귀하의 경우 훈련 후 개별 임베딩 레이어의 가중치를 얻을 수 있습니다.
model.layers[3].get_weights() # similarly for layer 4 and 5
또는 임베딩을 (None, 300)에 저장하려면 numpy를 사용하여 가중치를 연결할 수 있습니다.
out_concat = np.concatenate([mdoel.layers[3].get_weights()[0], mdoel.layers[4].get_weights()[0], mdoel.layers[5].get_weights()[0]], axis=-1)
연결 레이어의 출력 텐서를 얻을 수 있지만 :
out_tensor = model.layers[9].output
# <tf.Tensor 'concatenate_3_1/concat:0' shape=(?, 300) dtype=float32>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다