Концентратор Keras TensorFlow: Начало работы с простой сетью ELMO

#python #tensorflow #keras #tensorflow-hub #elmo

Вопрос:

Я пытаюсь заставить простую модель ELMO работать с концентратором TensorFlow, но это оказывается непростой задачей.

Когда я запускаю свой код, я получаю ошибку: «Входы в функцию выполнения не могут быть символьными тензорами Keras, но найдены [lt;tf.Tensor ‘input_69:0’ форма=(Нет, 10) dtype=строкаgt;]»

Я думаю, что я путаю аргументы длины последовательности или входные данные. Кто-нибудь может мне помочь, пожалуйста?

 import tensorflow as tf import tensorflow_hub as hub import re  from tensorflow import keras import tensorflow.keras from tensorflow.keras.layers import Input, Dense,Flatten import numpy as np import keras.callbacks import io from sklearn.model_selection import train_test_split  i = 0 max_cells = 51 #countLines() x_data = np.zeros((max_cells, 10, 1), dtype='object') y_data = np.zeros((max_cells, 3), dtype='float32') seqs = np.zeros((max_cells), dtype='int32')  with io.open('./data/names-sample.txt', encoding='utf-8') as f:  content = f.readlines()  for line in content:   line = re.sub("[n]", " ", line)   tokens = line.split()   for t in range(0, min(10,len(tokens))):   tkn = tokens[t]   x_data[i,t] = tkn    seqs[i] = len(tokens)  y_data[i,0] = 1    i = i 1  def build_model():   tokens = Input(shape=[10,], dtype=tf.string)  seq_lens = Input(shape=[], dtype=tf.int32)    elmo = hub.KerasLayer(  "https://tfhub.dev/google/elmo/3",  trainable=False,  output_key="elmo",  signature="tokens",  )  out = elmo({"tokens": tokens, "sequence_len": seqs})    model = keras.Model(inputs=[tokens, seq_lens], outputs=out)  model.compile("adam", loss="sparse_categorical_crossentropy")  model.summary()   return model  x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.70, shuffle=True)  model = build_model() model.fit(x_train, y_train,validation_data=(x_test, y_test),epochs=1,batch_size=32)  

Полная Ошибка:

Ошибка типа: Операция вне кода построения функции передается тензору «Графика». Возможно, что тензоры графиков просочатся из контекста построения функций, включив tf.init_scope в код построения функций. Например, произойдет сбой следующей функции: @tf.function def has_init_scope(): my_constant = tf.константа(1.) с tf.init_scope(): добавлено = my_constant * 2 Тензор графика имеет имя: input_69:0

Во время обработки вышеуказанного исключения произошло еще одно исключение:

Обратная связь (последний последний звонок):

File «C:tempSimonTempElmoNames.py», line 66, in model = build_model()

File «C:tempSimonTempElmoNames.py», line 56, in build_model out = elmo({«tokens»: tokens, «sequence_len»: seqs})

File «C:ProgramDataAnaconda3libsite-packagestensorflow_corepythonkerasenginebase_layer.py», line 891, in call outputs = self.call(cast_inputs, *args, **kwargs)

File «C:ProgramDataAnaconda3libsite-packagestensorflow_hubkeras_layer.py», line 229, in call result = f()

File «C:ProgramDataAnaconda3libsite-packagestensorflow_corepythoneagerfunction.py», line 1081, in call return self._call_impl(args, kwargs)

File «C:ProgramDataAnaconda3libsite-packagestensorflow_corepythoneagerfunction.py», line 1121, in _call_impl return self._call_flat(args, self.captured_inputs, cancellation_manager)

File «C:ProgramDataAnaconda3libsite-packagestensorflow_corepythoneagerfunction.py», line 1224, in _call_flat ctx, args, cancellation_manager=cancellation_manager)

File «C:ProgramDataAnaconda3libsite-packagestensorflow_corepythoneagerfunction.py», line 511, in call ctx=ctx)

File «C:ProgramDataAnaconda3libsite-packagestensorflow_corepythoneagerexecute.py», line 75, in quick_execute «tensors, but found {}».format(keras_symbolic_tensors))

_SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [lt;tf.Tensor ‘input_69:0’ shape=(None, 10) dtype=stringgt;]

Вот версии, с которыми я работаю: Keras: 2.3.1 TF: 2.0.0 TH-концентратор: 0.12.0

ОБНОВЛЕНИЕ 1: Я обновил Keras (2.6.0) TF (2.6.0) и TF Hub(0.12.0) и изменил метод build_model в отношении того, как передаются seq и seq_lens.

 def build_model():   tokens = Input(shape=[10,], dtype=tf.string)  seq_lens = Input(shape=[], dtype=tf.int32)    elmo = hub.KerasLayer(  "https://tfhub.dev/google/elmo/3",  trainable=False,  output_key="elmo",  signature="tokens",  )  out = elmo({"tokens": tokens, "sequence_len": seq_lens})    model = keras.Model(inputs=[tokens, seqs], outputs=out)  model.compile("adam", loss="sparse_categorical_crossentropy")  model.summary()   return model  

Теперь я получаю ошибку:

Ошибка значения: Входные тензоры для функционала должны исходить от tf.keras.Input . Получено: [3 3 2 2 3 3 3 5 3 3 3 2 7 2 2 2 3 2 2 3 3 3 3 3 3 2 3 2 3 2 3 3 2 3 3 2 3 2 2 2 2 3 2 2 3 3 5 3 3 3 0] (отсутствуют метаданные предыдущего слоя).

Ответ №1:

Я не верю, что это ошибка, скорее, это дает нам свободу в выборе каждого метода. Хотя мы можем смешать подкласс слоев с функциональным api keras, я думаю, что мы не можем заставить подкласс модели работать с api модели keras. Вот где, на мой взгляд, различие между активным выполнением и графическим режимом keras вступает в конфликт, порождая это «Символическое исключение».

Предварительное информирование TF о том, в каком режиме он должен выполняться, решает эту проблему.

Комментарии:

1. Привет, Фейсал, не могли бы вы поделиться более подробной информацией? Какой режим я должен использовать и как это указать?

Ответ №2:

Ладно, наконец-то все заработало. В первый раз я сделал это обновленным:

 Keras: 2.2.4 TF: 1.15.0 TF: 0.12.0  

Затем я изменил свой код, чтобы использовать правильную версию модели ELMO:

 import tensorflow_hub as hub import tensorflow as tf  elmo = hub.Module("https://tfhub.dev/google/elmo/3", trainable=False)  from tensorflow.keras.layers import Input, Lambda, Bidirectional, Dense, Dropout, Flatten, LSTM from tensorflow.keras.models import Model  def ELMoEmbedding(input_text):  return elmo(tf.reshape(tf.cast(input_text, tf.string), [-1]), signature="default", as_dict=True)["elmo"]  def build_model():  input_layer = Input(shape=(1,), dtype="string", name="Input_layer")   embedding_layer = Lambda(ELMoEmbedding, output_shape=(1024, ), name="Elmo_Embedding")(input_layer)  BiLSTM = Bidirectional(LSTM(128, return_sequences= False, recurrent_dropout=0.2, dropout=0.2), name="BiLSTM")(embedding_layer)  Dense_layer_1 = Dense(64, activation='relu')(BiLSTM)  Dropout_layer_1 = Dropout(0.5)(Dense_layer_1)  Dense_layer_2 = Dense(32, activation='relu')(Dropout_layer_1)  Dropout_layer_2 = Dropout(0.5)(Dense_layer_2)  output_layer = Dense(3, activation='sigmoid')(Dropout_layer_2)  model = Model(inputs=[input_layer], outputs=output_layer, name="BiLSTM with ELMo Embeddings")  model.summary()  model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])  return model elmo_BiDirectional_model = build_model()  import numpy as np import io import re from tensorflow import keras   i = 0 max_cells = 300 x_data = np.zeros((max_cells, 1), dtype='object') y_data = np.zeros((max_cells, 3), dtype='float32')  with tf.Session() as session:  session.run(tf.global_variables_initializer())   session.run(tf.tables_initializer())  model_elmo = elmo_BiDirectional_model.fit(x_data, y_data, epochs=100, batch_size=5)  train_prediction = elmo_BiDirectional_model.predict(x_data)