簡體   English   中英

Tensorflow:在另一個 model 中使用 model 作為層

[英]Tensorflow: Use model inside another model as layer

我想在另一個 model 中使用分類 model 作為層,因為我認為 keras 模型也可以用作層。 這是第一個model的代碼:

cencoder_inputs = keras.layers.Input(shape=[pad_len], dtype=np.int32)
ccondi_input = keras.layers.Input(shape=[1], dtype=np.int32)
ccondi_layer = tf.keras.layers.concatenate([cencoder_inputs, ccondi_input], axis=1)
cembeddings = keras.layers.Embedding(vocab_size, 4)
cencoder_embeddings = cembeddings(ccondi_layer)


clstm = keras.layers.LSTM(128)(cencoder_embeddings)
cout_layer = keras.layers.Dense(16, activation="softmax")(clstm)

classification_model = keras.Model(inputs=[cencoder_inputs, ccondi_input], outputs=[cout_layer])
classification_model.compile(optimizer="Nadam", loss="sparse_categorical_crossentropy", metrics=["accuracy"], experimental_run_tf_function=False)

我訓練這個 model,保存並重新加載它為class_model並設置 trainable trainable=False這是我的 model 的代碼,它應該使用上面的 model 作為層:

encoder_inputs = keras.layers.Input(shape=[pad_len], dtype=np.int32)
decoder_inputs = keras.layers.Input(shape=[pad_len], dtype=np.int32)
condi_input = keras.layers.Input(shape=[1], dtype=np.int32)

class_layer = class_model((encoder_inputs, condi_input))
#Thats how I use the class model. Compilation goes fine so far
class_pred_layer = keras.layers.Lambda(lambda x: tf.reshape(tf.cast(tf.keras.backend.argmax(x, axis=1), dtype=tf.int32),shape=(tf.shape(encoder_inputs)[0],1)))(class_layer)
# Lambda and reshape layer, so I get 1 prediction per batch as integer
condi_layer = tf.keras.layers.concatenate([encoder_inputs, condi_input, class_pred_layer], axis=1)

embeddings = keras.layers.Embedding(vocab_size, 2)
encoder_embeddings = embeddings(condi_layer)
decoder_embeddings = embeddings(decoder_inputs)

encoder_1 = keras.layers.LSTM(64, return_sequences=True, return_state=True)
encoder_lstm_bidirectional_1 = keras.layers.Bidirectional(encoder_1)

encoder_output, state_h1, state_c1, state_h2, state_c2 = encoder_lstm_bidirectional_1(encoder_embeddings)
encoder_state = [Concatenate()([state_h1, state_h2]), Concatenate()([state_c1, state_c2])]

decoder_lstm = keras.layers.LSTM(64*2, return_sequences=True, return_state=True, name="decoder_lstm")
print(encoder_output.shape)
decoder_outputs,decoder_fwd_state, decoder_back_state = decoder_lstm(decoder_embeddings,initial_state=encoder_state) 
print(decoder_outputs.shape)
attn_layer = AttentionLayer(name="attention_layer")
attn_out, attn_states = attn_layer([encoder_output, decoder_outputs])

decoder_concat_input = Concatenate(axis=-1, name="decoder_concat_layer")([decoder_outputs, attn_out])

decoder_dense_out = keras.layers.TimeDistributed(keras.layers.Dense(vocab_size, activation="softmax"))
decoder_outputs = decoder_dense_out(decoder_concat_input)

model = keras.Model(inputs=[encoder_inputs, decoder_inputs, condi_input], outputs=[decoder_outputs])

當我執行 model.fit() 時,我收到以下錯誤:

Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'input_21:0' shape=(None, 35) dtype=int32>]

我認為訓練有素的模型可以很容易地用作層,我做錯了什么? 我也已經查看了這篇文章,但它也沒有幫助我。 謝謝你的幫助!

好的,我會做兩件事:(1)我會給你一個例子,我必須在另一個 model 中調用 model,以及(2)試着給你一個提示,說明你的問題可能在這里(我不能真正理解代碼,但我過去有同樣的錯誤)

1. 這是使用另一個 model 作為隱藏層的 model 示例:

def model_test(input_shape, sub_model):
  inputs = Input(input_shape)
  eblock_1_1 = dense_convolve(inputs, n_filters=growth_rate)
  eblock_1_2 = dense_convolve(eblock_1_1, n_filters=growth_rate);
  dblock_1_1 = dense_convolve(eblock_1_2, n_filters=growth_rate);
  dblock_1_2 = dense_convolve(dblock_1_1, n_filters=growth_rate);
  final_convolution = Conv3D(2, (1, 1, 1), padding='same', activation='relu')(dblock_1_2)
  intermedio = sub_model(final_convolution)
  layer = LeakyReLU(alpha=0.3)(intermedio)
  model = Model(inputs=inputs, outputs=layer)
    
  return model

我這樣稱呼它:

with strategy.scope():
  sub_model = tf.keras.models.load_model('link_to_the_model')
  sub_model.trainable = False
  model = model_test(INPUT_SIZE, sub_model)
  model.compile(optimizer=Adam(lr=0.1),
                loss=tf.keras.losses.MeanSquaredError(),
                metrics=None)

我剛剛在 google colab 上用 keras 測試了這個。

  1. 前段時間我嘗試在 model 中調用 function 並急切執行時遇到了同樣的錯誤,這里的問題是訓練是在圖形模式下執行的(您可以在網上找到一些關於Z5E056C500A1C4B6A71105B 的信息) eager-execution-vs-graph-execution-which-is-better-38162ea4dbf6 )。

如果問題是 model 的調用可能會嘗試做我所做的,將 model 作為參數傳遞,並在內部使用層作為參數調用它並將其用作簡單層

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM