Как мне поместить слой Conv1D после слоя встраивания в Tensorflow 2? - PullRequest
0 голосов
/ 06 мая 2020

Для оценки мне нужно уметь применять сверточный слой к текстовым данным. Итак, я пытаюсь провести анализ настроений в отзывах на Amazon. Однако после слоя Embedding слой Conv1D не получит требуемую форму.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
print(f'Tensorflow version {tf.__version__}')
from tensorflow import keras
from tensorflow.keras.layers import Dense, Conv1D, GlobalAveragePooling1D, Embedding
import tensorflow_datasets as tfds
from tensorflow.keras.models import Model

(train_data, test_data), info = tfds.load('imdb_reviews/subwords8k',
                                          split=[tfds.Split.TRAIN, tfds.Split.TEST],
                                          as_supervised=True, with_info=True)

padded_shapes = ([None], ())

train_dataset = train_data.shuffle(25000).padded_batch(padded_shapes=padded_shapes, batch_size=16)
test_dataset = test_data.shuffle(25000).padded_batch(padded_shapes=padded_shapes, batch_size=16)

n_words = info.features['text'].encoder.vocab_size


class ConvModel(Model):
    def __init__(self):
        super(ConvModel, self).__init__()
        self.embe = Embedding(n_words, output_dim=16)
        self.conv = Conv1D(32, kernel_size=6, activation='elu')
        self.glob = GlobalAveragePooling1D()
        self.dens = Dense(2)

    def call(self, x, training=None, mask=None):
        x = self.embe(x)
        x = self.conv(x)
        x = self.glob(x)
        x = self.dens(x)
        return x

conv = ConvModel()

conv(next(iter(train_data))[0])

ValueError: вход 0 слоя conv1d_25 несовместим со слоем: ожидается ndim = 3 , найдено ndim = 2. Получена полная форма: [163, 16]

Как можно этого добиться, и если я ошибаюсь, как правильно использовать слой Conv1D для текстовых последовательностей?

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

это conv(next(iter(train_dataset))[0]) а не conv(next(iter(train_data))[0])

структура сети в порядке

0 голосов
/ 08 мая 2020

вы сделали это так хорошо. Последнюю строку кода следует изменить. Вот и все. Параметр должен быть train_data, а не train_dataset.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
print(f'Tensorflow version {tf.__version__}')
from tensorflow import keras
from tensorflow.keras.layers import Dense, Conv1D, GlobalAveragePooling1D, Embedding
import tensorflow_datasets as tfds
from tensorflow.keras.models import Model

(train_data, test_data), info = tfds.load('imdb_reviews/subwords8k',
                                          split=[tfds.Split.TRAIN, tfds.Split.TEST],
                                          as_supervised=True, with_info=True)

padded_shapes = ([None], ())

train_dataset = train_data.shuffle(25000).padded_batch(padded_shapes=padded_shapes, batch_size=16)
test_dataset = test_data.shuffle(25000).padded_batch(padded_shapes=padded_shapes, batch_size=16)

n_words = info.features['text'].encoder.vocab_size


class ConvModel(Model):
    def __init__(self):
        super(ConvModel, self).__init__()
        self.embe = Embedding(n_words, output_dim=16)
        self.conv = Conv1D(32, kernel_size=6, activation='elu')
        self.glob = GlobalAveragePooling1D()
        self.dens = Dense(2)

    def call(self, x, training=None, mask=None):
        x = self.embe(x)
        x = self.conv(x)
        x = self.glob(x)
        x = self.dens(x)
        return x

conv = ConvModel()

conv(next(iter(train_data))[0])

Надеюсь, вы исправите ошибку.

0 голосов
/ 06 мая 2020

Размер out_dim слоя внедрения слов должен совпадать с размером входного фильтра conv1D. Попробуйте изменить out_dim на 32. Правильный способ: https://machinelearningmastery.com/predict-sentiment-movie-reviews-using-deep-learning/

...