Feature cannot have rank 0 - TensorFlow

Viewed 37

Music.csv - image Error: ValueError: Feature (key: gender) cannot have rank 0. Given: Tensor("IteratorGetNext:0", shape=(), dtype=int64, device=/device:CPU:0) Can you help ? Thank you! I was learning from freecodecamp. CSV file: https://www.youtube.com/watch?v=7eh4d6sabA0&t=1795s - in description

import pandas as pd
import tensorflow as tf


def main():
    dataframe = pd.read_csv("music.csv")
    print(dataframe.columns)
    learn = dataframe
    y_label = dataframe.pop("age")

    CATEGORIZED_DATA = ["genre"]
    NUMERICAL_DATA = ["gender"]

    features_columns = []

    for feature_column in CATEGORIZED_DATA:
        vocabulary = dataframe[feature_column].unique()
        features_columns.append(tf.feature_column.categorical_column_with_vocabulary_list(feature_column, vocabulary))

    for feature_column in NUMERICAL_DATA:
        features_columns.append(tf.feature_column.numeric_column(feature_column))

    def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
        def input_function():
            ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
            ds.batch(10)
            if shuffle:
                ds.shuffle(1000)
            ds.batch(batch_size).repeat(num_epochs)
            return ds
        return input_function

    print(features_columns)

    data_totrain_fn = make_input_fn(learn, y_label)
    normal = make_input_fn(data_df=learn, label_df=y_label, batch_size=1, num_epochs=1, shuffle=False)
    linear_est = tf.estimator.LinearClassifier(feature_columns=features_columns)
    linear_est.train(data_totrain_fn)
    # result = linear_est.evaluate(normal)
    # print(result['accuracy'])




if __name__ == "__main__":
    main()
1 Answers

The reason you got "rank 0" error message is because the syntax error in the input_function():

def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
    def input_function():
        ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
        if shuffle:
            ds = ds.shuffle(1000) #fix: need to assign back to ds = ....
        ds = ds.batch(batch_size).repeat(num_epochs) #fix: need to assign back to ds = ....
        return ds
    return input_function

After fixed the input_function(), you will encounter the next error message:

(0) INVALID_ARGUMENT: assertion failed: [Labels must be <= n_classes - 1] 

This is because you want to use a smaller features to predict a larger labels (that is, the number of "age" have bigger range of variation than the features (gender, genre) your dataset provided) thus the training failed. To "fix" (may not be what you want but just to make it run) the problem, change the prediction to "gender" and make feature (age, genre) as shown in the code below:

import pandas as pd
import tensorflow as tf

def main():
    dataframe = pd.read_csv("music.csv")
    print(dataframe.columns)
    learn = dataframe
    y_label = dataframe.pop("gender")
    print(y_label)

    CATEGORIZED_DATA = ["genre"]
    NUMERICAL_DATA = ["age"]
    
    features_columns = []
    
    for feature_column in CATEGORIZED_DATA:
        vocabulary = dataframe[feature_column].unique()
        features_columns.append(tf.feature_column.categorical_column_with_vocabulary_list(feature_column, vocabulary))
    
    for feature_column in NUMERICAL_DATA:
        features_columns.append(tf.feature_column.numeric_column(feature_column))

    def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
      def input_function():
        ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
        if shuffle:
          ds = ds.shuffle(1000)
        ds = ds.batch(batch_size).repeat(num_epochs)
        return ds
      return input_function

    data_totrain_fn = make_input_fn(dataframe, y_label, batch_size=10)
    normal = make_input_fn(data_df=learn, label_df=y_label, batch_size=1, num_epochs=1, shuffle=False)
  
    linear_est = tf.estimator.LinearClassifier(feature_columns=features_columns)
    linear_est.train(data_totrain_fn)
    result = linear_est.evaluate(normal)
    print(result['accuracy'])


if __name__ == "__main__":
    main()

Output:

0.8333333
Related