【问题标题】:How do I put a Conv1D layer after an Embedding layer in Tensorflow 2?如何在 Tensorflow 2 中的嵌入层之后放置 Conv1D 层?
【发布时间】:2023-04-11 11:37:01
【问题描述】:

对于评估,我需要能够将卷积层应用于文本数据。所以我正在尝试对亚马逊评论进行情绪分析。但是,在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。收到的完整形状:[163, 16]

如何实现这一点,如果我错了,将Conv1D 层用于文本序列的正确方法是什么?

【问题讨论】:

    标签: python tensorflow keras conv-neural-network


    【解决方案1】:

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

    网络结构还可以

    【讨论】:

      【解决方案2】:

      到目前为止,你做得很好。应更改代码的最后一行。就这样。参数应该是 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])
      

      希望您修复错误。

      【讨论】:

      • 嗨。这个解决方案已经被建议了,除非我遗漏了什么。
      【解决方案3】:

      词嵌入层的 out_dim 应与 conv1D 输入过滤器大小匹配。尝试将 out_dim 改为 32。正确方法:https://machinelearningmastery.com/predict-sentiment-movie-reviews-using-deep-learning/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 2021-07-08
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 1970-01-01
        • 2021-03-19
        相关资源
        最近更新 更多