Tensorflow 基本文本分类练习

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

我正在尝试完成张量流的基本文本分类练习,当我尝试使用堆栈溢出数据集运行 model.fit 时,出现以下错误。我已严格按照练习说明进行操作,并且我认为我理解了该练习,但我只是不明白为什么会发生错误。我唯一能想到的是向量的长度以某种方式不同?

ValueError: Shapes (None, 4) and (None, 1) are incompatible

我的代码如下,错误发生在显示的最后一行:

import matplotlib.pyplot as plt
import os
import re
import shutil
import string
import sys
import pathlib

import tensorflow as tf

from tensorflow.keras import layers
from tensorflow.keras import losses
from tensorflow.keras import preprocessing
from tensorflow.keras.layers.experimental.preprocessing import TextVectorization
from tensorflow.keras import utils

from pathlib import Path

print(tf.__version__)

url = "http://storage.googleapis.com/download.tensorflow.org/data"

dataset = tf.keras.utils.get_file("stack_overflow_16k.tar.gz", url,
                                    untar=True, cache_dir='stack_overflow_16k',
                                    cache_subdir='')

dataset_dir = os.path.join(os.path.dirname(dataset))

train_dir = os.path.join(dataset_dir, 'train')
os.listdir(train_dir)
batch_size = 32
seed = 42

raw_train_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'train', 
    batch_size=batch_size, 
    validation_split=0.2, 
    subset='training', 
    seed=seed)

raw_val_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'train', 
    batch_size=batch_size, 
    validation_split=0.2, 
    subset='validation', 
    seed=seed)

raw_test_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'test', 
    batch_size=batch_size)

def custom_standardization(input_data):
  lowercase = tf.strings.lower(input_data)
  stripped_html = tf.strings.regex_replace(lowercase, '<br />', ' ')
  return tf.strings.regex_replace(stripped_html,
                                  '[%s]' % re.escape(string.punctuation),
                                  '')

max_features = 10000
sequence_length = 250

vectorize_layer = TextVectorization(
    standardize=custom_standardization,
    max_tokens=max_features,
    output_mode='int',
    output_sequence_length=sequence_length)

train_text = raw_train_ds.map(lambda x, y: x)
vectorize_layer.adapt(train_text)

def vectorize_text(text, label):
  text = tf.expand_dims(text, -1)
  return vectorize_layer(text), label

train_ds = raw_train_ds.map(vectorize_text)
val_ds = raw_val_ds.map(vectorize_text)
test_ds = raw_test_ds.map(vectorize_text)

AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)
embedding_dim = 16

model = tf.keras.Sequential([
  layers.Embedding(max_features + 1, embedding_dim),
  layers.Dropout(0.2),
  layers.GlobalAveragePooling1D(),
  layers.Dropout(0.2),
  layers.Dense(4)])

model.summary()

model.compile(loss=losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer='adam',
              metrics=[tf.metrics.Accuracy()])

epochs = 10
history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=epochs)

提前感谢您的所有帮助,值得注意的是我是一个完全的初学者:p

python keras text-classification
1个回答
0
投票

如果其他人了解此 TensorFlow 练习,则问题出在

model.compile
部分。我也因此陷入困境。我的问题是我根本没有改变之前的示例。

在上面的代码中,它应该是

metrics=['accuracy']
,而不是
metrics=[tf.metrics.Accuracy()]

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