#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)