UnimplementedError с нейронной сетью с использованием линейной регрессии и Tensorflow2

#python #tensorflow #neural-network #nlp #word-embedding

#python #tensorflow #нейронная сеть #nlp #встраивание слов

Вопрос:

Я просто работаю над своим собственным проектом в песочнице, желая попытаться внедрить NLP, но с линейной регрессией в качестве результата. В качестве ссылки в набор данных, с которым я работаю, входит Kaggle wine-reviews, в котором есть обзоры вин и соответствующая оценка от 1 до 100, поэтому я использую линейную регрессию вместо классификации.

Но я получаю сообщение об ошибке, и я не уверен, является ли это результатом проблемы с типом данных или размерностью, и я не подаю в суд, почему или как ее решить.

Я приведу приведенный ниже код и некоторые промежуточные результаты, отображающие размеры некоторых объектов, поскольку я предполагаю, что это может быть полезно при решении этой проблемы.

 df = pd.read_csv('winemag-data_first150k.csv', encoding='ISO-8859-1')
y = df['points'].astype(int)
X = df['description'].astype(str)

# split up the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

MAX_VOCAB_SIZE = 35000
tokenizer = Tokenizer(num_words=MAX_VOCAB_SIZE)
tokenizer.fit_on_texts(X_train)
sequences_train = tokenizer.texts_to_sequences(X_train)
sequences_test = tokenizer.texts_to_sequences(X_test)

word2idx = tokenizer.word_index
V = len(word2idx)
print('Found %s unique tokens.' % V)
   Found 33012 unique tokens.

data_train = pad_sequences(sequences_train)
print('Shape of data train tensor:', data_train.shape)

# get sequence length
T = data_train.shape[1]
   Shape of data train tensor: (101123, 136)

data_test = pad_sequences(sequences_test, maxlen=T)
print('Shape of data test tensor:', data_test.shape)
   Shape of data test tensor: (49807, 136)

# Create the model

# We get to choose embedding dimensionality
D = 20

# Hidden state dimensionality
M = 15



i = Input(shape=(T,))
x = Embedding(V   1, D)(i)
x = LSTM(M, return_sequences=True)(x)
x = GlobalMaxPooling1D()(x)
x = Dense(1)(x)

model = Model(i, x)

model.compile(optimizer='adam', loss='mse')


# learning rate scheduler
def schedule(epoch, lr):
  if epoch >= 50:
    return 0.0001
  return 0.001
 

scheduler = tf.keras.callbacks.LearningRateScheduler(schedule)


# Train the model
r = model.fit(X, y, epochs=200, callbacks=[scheduler])
 

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

 Epoch 1/200
WARNING:tensorflow:Model was constructed with shape (None, 136) for input Tensor("input_10:0", shape=(None, 136), dtype=float32), but it was called on an input with incompatible shape (None, 1).
WARNING:tensorflow:Model was constructed with shape (None, 136) for input Tensor("input_10:0", shape=(None, 136), dtype=float32), but it was called on an input with incompatible shape (None, 1).
---------------------------------------------------------------------------
UnimplementedError                        Traceback (most recent call last)
<ipython-input-121-0f68916ec23b> in <module>
     13 
     14 # Train the model
---> 15 r = model.fit(X, y, epochs=200, callbacks=[scheduler])

~anaconda3envsnewenvtlibsite-packagestensorflowpythonkerasenginetraining.py in _method_wrapper(self, *args, **kwargs)
    106   def _method_wrapper(self, *args, **kwargs):
    107     if not self._in_multi_worker_mode():  # pylint: disable=protected-access
--> 108       return method(self, *args, **kwargs)
    109 
    110     # Running inside `run_distribute_coordinator` already.

~anaconda3envsnewenvtlibsite-packagestensorflowpythonkerasenginetraining.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1096                 batch_size=batch_size):
   1097               callbacks.on_train_batch_begin(step)
-> 1098               tmp_logs = train_function(iterator)
   1099               if data_handler.should_sync:
   1100                 context.async_wait()

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerdef_function.py in __call__(self, *args, **kwds)
    778       else:
    779         compiler = "nonXla"
--> 780         result = self._call(*args, **kwds)
    781 
    782       new_tracing_count = self._get_tracing_count()

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerdef_function.py in _call(self, *args, **kwds)
    838         # Lifting succeeded, so variables are initialized and we can run the
    839         # stateless function.
--> 840         return self._stateless_fn(*args, **kwds)
    841     else:
    842       canon_args, canon_kwds = 

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerfunction.py in __call__(self, *args, **kwargs)
   2827     with self._lock:
   2828       graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
-> 2829     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   2830 
   2831   @property

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerfunction.py in _filtered_call(self, args, kwargs, cancellation_manager)
   1841       `args` and `kwargs`.
   1842     """
-> 1843     return self._call_flat(
   1844         [t for t in nest.flatten((args, kwargs), expand_composites=True)
   1845          if isinstance(t, (ops.Tensor,

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerfunction.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1921         and executing_eagerly):
   1922       # No tape is watching; skip to running the function.
-> 1923       return self._build_call_outputs(self._inference_function.call(
   1924           ctx, args, cancellation_manager=cancellation_manager))
   1925     forward_backward = self._select_forward_and_backward_functions(

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerfunction.py in call(self, ctx, args, cancellation_manager)
    543       with _InterpolateFunctionError(self):
    544         if cancellation_manager is None:
--> 545           outputs = execute.execute(
    546               str(self.signature.name),
    547               num_outputs=self._num_outputs,

~anaconda3envsnewenvtlibsite-packagestensorflowpythoneagerexecute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     57   try:
     58     ctx.ensure_initialized()
---> 59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
     60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:

UnimplementedError:  Cast string to float is not supported
     [[node functional_11/Cast (defined at <ipython-input-121-0f68916ec23b>:15) ]] [Op:__inference_train_function_17206]

Function call stack:
train_function

 

Я не совсем уверен, что нужно изменить, но любые предложения будут оценены.

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

1. Вы передаете X в model.fit, который буквально имеет строковые значения, нейронная сеть не может вводить строковые значения.

2. О боже, я не могу поверить, что я это сделал. Вы правы. Вы выиграли. Спасибо.

Ответ №1:

Из комментариев

Переход X к model.fit , который буквально имеет строковые значения, нейронная сеть не может вводить строковые значения (перефразировано из Dr. Snoopy)