文本向量化问题

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

我尝试在我的模型上使用 TextVectorization,但遇到相同的错误,我尝试创建一个显式输入层 1 但它不起作用。有什么建议吗?

vectorize_layer  = tf.keras.layers.TextVectorization(max_tokens = 30000,output_mode = 'tf_idf',ngrams = 2,)
vectorize_layer.adapt(X_train)
X_train_vec = vectorize_layer(X_train).numpy()
X_test_vec = vectorize_layer(X_test).numpy()
X_valid_vec = vectorize_layer(X_valid).numpy()

model = tf.keras.models.Sequential()
model.add(tf.keras.Input(shape=(1,), dtype=tf.string))
model.add(vectorize_layer)model.add(Dense(256,activation = 'relu', input_shape = (X_train_vec.shape[1],)))
model.add(Dropout(0.5))model.add(Dense(128,activation = 'relu'))
model.add(Dropout(0.5))model.add(Dense(4,activation = 'softmax'))

model.compile(optimizer = 'adamax', loss = 'categorical_crossentropy', metrics = ['accuracy'])

model.summary()

callbacks = [keras.callbacks.ModelCheckpoint("model.keras",save_best_only = True),]

model.fit(X_train_vec, y_train,epochs = 15,batch_size = 32,validation_data = (X_valid_vec, y_valid),callbacks = callbacks)

model = keras.models.load_model('model.keras')

我得到的错误:

When usingTextVectorizationto tokenize strings, the input rank must be 1 or the last shape dimension must be 1. Received: inputs.shape=(None, 18418) with rank=2

我尝试创建形状 1 的显式输入层,但我一直得到相同的结果。

tensorflow keras deep-learning
1个回答
0
投票

按照有关文本分类的 tensorflow 文档,我修改了您的代码并应用

TextVectorization
作为预处理步骤,其中矢量化文本与标签一起传递到模型。以下是使用您在评论中提供的数据子集的完整工作代码片段:

import pandas as pd
import tensorflow as tf
import keras
from tensorflow.keras.layers import Dense, Dropout

# generating some data
X_train = [
    ("Les faltan sucursales, han cerrado muchas, sobretodo en Providencia y eso complica la operativa diaria.", "Sugerencia"),
    ("La nueva ejecutiva que me asignaron, es pésima, no responde los correos y ni siquiera hace contacto cada cierto tiempo. Realmente cambiaron a un excelente ejecutivo que tenia por otro que realmente deja harto que desear.", "Problema"),
    ("Excelente ejecutivo, proactivo, muy preocupado.", "Comentario Positivo"),
    ("siempre buena disposicion","Comentario Positivo"),
    ("La ejecutiva siempre contesta, aunque sea por malas notcias para el cliente, pero siempre está.", "Problema"),
    ( "Atención personalizada y reservada, pocos tiempos de espera", "Comentario Positivo"),
    ("Personalmente bastante conforme, el problema es con el trato hacia mis esposa, obtuvimos las cuentas juntos, yo siendo su aval para tener los mismos productos. Y el servicio hacia ella, ha sido, cuando menos, deficiente, estuvo cerca de 6 meses sin ejecutivo asignado y la única vez que necesito ayuda del banco, se le indicó que al no contar con ejecutivo asignado, nadie era 100% responsable de su atención.", "Otros")
]

label_mapping = {
    "Otros": 0,
    "Problema": 1,
    "Comentario Positivo": 2,
    "Sugerencia": 3
}



train_df = pd.DataFrame(data=X_train, columns=['text', 'label'])
train_df['label'] = train_df['label'].map(label_mapping).astype(int)
# using the same data for the sake of simplicity
test_df = train_df.copy(deep=True)
valid_df = train_df.copy(deep=True)

# convert pandas dataframe to tensorflow dataset
raw_train_ds = tf.data.Dataset.from_tensor_slices(dict(train_df))
raw_test_ds = tf.data.Dataset.from_tensor_slices(dict(test_df))
raw_val_ds = tf.data.Dataset.from_tensor_slices(dict(valid_df))

# fit text vectorization
vectorize_layer  = tf.keras.layers.TextVectorization(
    max_tokens=30000,
    output_mode='tf_idf',
    ngrams=2,
    pad_to_max_tokens=True)
vectorize_layer.adapt(raw_train_ds.map(lambda x: x['text']))

cat_encoding = tf.keras.layers.CategoryEncoding(
        num_tokens=4, output_mode='one_hot', sparse=False
)


def vectorize_text(row):
    text = tf.expand_dims(row['text'], -1)
    encoded_label = cat_encoding(row['label'])
    return vectorize_layer(text), tf.reshape(encoded_label, (1,4))


# apply text vectorization
train_ds = raw_train_ds.map(vectorize_text)
test_ds = raw_test_ds.map(vectorize_text)
val_ds = raw_val_ds.map(vectorize_text)

# define model
model = tf.keras.models.Sequential()
model.add(tf.keras.Input(shape=(30000,)))
model.add(Dense(256,activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(128,activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(4,activation = 'softmax'))

model.compile(optimizer = 'adamax', loss = 'categorical_crossentropy', metrics = ['accuracy'])

model.summary()

callbacks = [keras.callbacks.ModelCheckpoint("model.keras",save_best_only = True),]

# fit
model.fit(train_ds,epochs = 15,batch_size = 32,validation_data=val_ds, callbacks = callbacks)

model = keras.models.load_model('model.keras')
© www.soinside.com 2019 - 2024. All rights reserved.