Home > Software engineering >  Getting `ValueError: `logits` and `labels` must have the same shape, received ((None, 1) vs ())` err
Getting `ValueError: `logits` and `labels` must have the same shape, received ((None, 1) vs ())` err

Time:02-24

I'm trying to train my model and receiving this error when I call the fit() method. Any ideas on why is this failing to run?

import pandas as pd
import tensorflow as tf

df = pd.read_csv('labeled_tweets_processed.csv')
labels = df.pop('class')
dataset = tf.data.Dataset.from_tensor_slices((df, labels))

for x, y in dataset.take(1):
  print(x, y)

import numpy as np

import tensorflow_datasets as tfds
import tensorflow as tf

tfds.disable_progress_bar()

import matplotlib.pyplot as plt

train_dataset = dataset.take(10000)
test_dataset = dataset.skip(10000)

BUFFER_SIZE = 10000
BATCH_SIZE = 32

train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
test_dataset = test_dataset.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)

VOCAB_SIZE = 1000
encoder = tf.keras.layers.TextVectorization(
    max_tokens=VOCAB_SIZE)
encoder.adapt(train_dataset.map(lambda text, label: text))

vocab = np.array(encoder.get_vocabulary()).flatten()
vocab[:20]

model = tf.keras.Sequential([
    encoder,
    tf.keras.layers.Embedding(
        input_dim=len(encoder.get_vocabulary()),
        output_dim=64,
        # Use masking to handle the variable sequence lengths
        mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              optimizer=tf.keras.optimizers.Adam(1e-4),
              metrics=['accuracy'])

history = model.fit(train_dataset, validation_data=test_dataset, epochs=10)

On the last command I receive the following error: ValueError: logits and labels must have the same shape ((None, 1) vs ())

Any ideas why is this happening?

Thank you very much in advance!

CodePudding user response:

Maybe try something like this:

import pandas as pd
import tensorflow as tf

df = pd.DataFrame(data = {'texts': ['Some text', 'Some text', 'Some text', 'Some text', 'Some text'],
                          'class': [0, 0, 1, 1, 1]})

labels = df.pop('class')
dataset = tf.data.Dataset.from_tensor_slices((df, labels))

VOCAB_SIZE = 1000
encoder = tf.keras.layers.TextVectorization(
    max_tokens=VOCAB_SIZE)
encoder.adapt(dataset.map(lambda text, label: text))

BUFFER_SIZE = 2
BATCH_SIZE = 2

train_dataset = dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)

model = tf.keras.Sequential([
    encoder,
    tf.keras.layers.Embedding(
        input_dim=len(encoder.get_vocabulary()),
        output_dim=64,
        # Use masking to handle the variable sequence lengths
        mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              optimizer=tf.keras.optimizers.Adam(1e-4),
              metrics=['accuracy'])

history = model.fit(train_dataset, epochs=10)
  • Related