我正在尝试完成张量流的基本文本分类练习,当我尝试使用堆栈溢出数据集运行 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
如果其他人了解此 TensorFlow 练习,则问题出在
model.compile
部分。我也因此陷入困境。我的问题是我根本没有改变之前的示例。
在上面的代码中,它应该是
metrics=['accuracy']
,而不是 metrics=[tf.metrics.Accuracy()]
。