如何在Tensorflow 2中把Conv1D层放在Embedding层之后?

问题描述 投票:0回答:1

对于一个评估,我需要能够对文本数据应用卷积层。所以我试图对亚马逊的评论进行情感分析。在 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.图层conv1d_25的输入0与图层不兼容:预期ndim=3,发现ndim=2。图层conv1d_25的输入0与图层不兼容:预期ndim=3,发现ndim=2。收到完整的形状。[163, 16]

如何才能实现,如果我说的不对,正确的使用方法是什么?Conv1D 层到文本序列?

python tensorflow keras conv-neural-network
1个回答
0
投票

conv(next(iter(train_dataset))[0]) 而不是 conv(next(iter(train_data))[0])

网络结构正常


0
投票

你已经做了这么多,所以很好。代码的最后一行应该被改变。就是这样。参数应该是 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])

希望你能解决这个错误。


-1
投票

词嵌入层的out_dim应该和conv1D输入滤波器的大小一致。试试把out_dim改成32。正确的方法。https:/machinelearningmastery.comredict-sentiment-movie-reviews-using-deep-learning。

© www.soinside.com 2019 - 2024. All rights reserved.