Использование входных данных Pandas / Numpy для слоя концентратора тензорного потока, который принимает одномерный ввод - PullRequest
1 голос
/ 26 марта 2020

Добрый день. Я пытаюсь повторно использовать слой NNLM из концентратора тензорного потока, чтобы выполнить обучение переносу для задачи НЛП.

Я пытаюсь начать это с использованием набора данных IMDB.

Проблема, с которой я сталкиваюсь, заключается в том, что многие слои NNLM концентратора тензорных потоков имеют следующее предостережение: модуль принимает пакет предложений в одноместном тензоре строк в качестве входных данных. В большинстве примеров, которые я вижу, используются предварительно загруженные наборы данных, но подавляющее большинство данных, с которыми я работаю, хранятся в pandas или Numpy, поэтому я пытаюсь заставить входные данные работать с этот формат.

Слой, который я пытаюсь использовать, можно найти здесь: https://tfhub.dev/google/Wiki-words-500/2

До сих пор я безуспешно пробовал следующее.

Подход 1: Преобразование массива pandas или массива numpy в объект набора данных тензорного потока.

from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Embedding, Flatten
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import tensorflow_hub as hub
import pandas as pd
import numpy as n
from tensorflow import string
import tensorflow as tf

hub_layer = hub.KerasLayer("https://tfhub.dev/google/Wiki-words-500/2",
                       input_shape=[], dtype=string)
mod2 = Sequential([
  hub_layer,
  Dense(20, activation='relu'),
  Dense(1, activation='sigmoid')
])

mod2.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

А затем я пытаюсь преобразовать данные обучения следующим образом :

train_data = tf.data.Dataset.from_tensor_slices((train_sequences, y_train.values))

train_sequences - это набор отзывов, которые были токенизированы и хранятся в виде (35000, 150) -образного numpy массива.

Затем я вызываю:

mod2.fit(train_data.batch(32).prefetch(1), epoch=2)

Что дает следующую ошибку:

ValueError: Error when checking input: expected keras_layer_input to have 1 dimensions, but got array with shape (None, 150)

Я получаю это сообщение об ошибке независимо от значения, переданного в batch() или prefetch(), и независимо от того, использую ли я steps_per_epoch аргумент, когда я звоню fit.

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

Подход 2: Создать итератор из массива numpy.

Я думаю, что если я превращу массив numpy в итератор, я мог бы вызвать next() для этого и постепенно передавать каждую строку в слой из keras hub.

Это мой код:

train_iter = iter(train_sequences)
y_iter     = iter(y.values)

a = next(train_iter)
b = next(y_iter)

Затем я звоню:

mod2.fit(a, b, epochs=2, steps_per_epoch=1)

и получаю следующее сообщение об ошибке:

ValueError: Failed to find data adapter that can handle input: <class 'numpy.ndarray'>, <class 'numpy.int64'>

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

Спасибо за помощь.

1 Ответ

1 голос
/ 06 мая 2020

Упоминание ответа в этом разделе (Ответ), даже если он уже присутствует в разделе комментариев, в интересах сообщества.

Передача Raw Text Values вместо Tokens (созданный с помощью Tokenizer) решил проблему.

Пример кода показан ниже:

import tensorflow_hub as hub

embed = hub.load("https://tfhub.dev/google/Wiki-words-500/2")
embeddings = embed(["cat is on the mat", "dog is in the fog"])

Для получения дополнительной информации Пожалуйста, обратитесь эту ссылку для получения дополнительной информации.

...