Добрый день. Я пытаюсь повторно использовать слой 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 заключается в том, что мне нужно настроить мои входные данные, так что это правильная форма для слоя, но как это сделать ускользает от меня в данный момент.
Спасибо за помощь.