Search code examples
pythontensorflowtflearn

Tflearn model.predict Cannot feed value of shape (1, 1, 17)


I'm quite new to Tensorflow and tflearn So far I've studied a couple of tutorials and have been trying to apply tflearn titanic example to a zoo animals dataset ( http://archive.ics.uci.edu/ml/datasets/Zoo ). The training works great, but when I try using model.predict on the data I enter it gives me the following error

Cannot feed value of shape (1, 1, 17) for Tensor 'InputData/X:0', which has shape '(?, 16)'

Here's python code

from __future__ import print_function

import numpy as np
import tflearn

# Load CSV file, indicate that the first column represents labels
from tflearn.data_utils import load_csv
data, labels = load_csv('zoo.csv', target_column=-1,
                        categorical_labels=True, n_classes=8)


# Preprocessing function
def preprocess(data, columns_to_ignore):
    # Sort by descending id and delete columns
    for id in sorted(columns_to_ignore, reverse=True):
        [r.pop(id) for r in data]
    return np.array(data, dtype=np.float32)

# Ignore 'name' and 'ticket' columns (id 1 & 6 of data array)
to_ignore=[0]

# Preprocess data
data = preprocess(data, to_ignore)

# Build neural network
net = tflearn.input_data(shape=[None,16])
net = tflearn.fully_connected(net, 128)
net = tflearn.dropout(net, 1)
net = tflearn.fully_connected(net, 128)
net = tflearn.dropout(net, 1)
net = tflearn.fully_connected(net, 8, activation='softmax')
net = tflearn.regression(net)


# Define model
model = tflearn.DNN(net)
# Start training (apply gradient descent algorithm)
model.fit(data, labels, n_epoch=1, validation_set=0.1, shuffle=True, batch_size=17, show_metric=True)

ant = ['ant', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 8, 0, 0, 0]
# Preprocess data
ant = preprocess([ant], to_ignore)
# Predict surviving chances (class 1 results)
pred = model.predict([ant])
print("Ant is:", pred[0])

I've tried using reshape, it didn't quite work. THe similiar problems I've found using search have this error appearing at the training stage, not prediction.


Solution

  • Turns out I didn't look careful enough at the number of columns in the dataset... Here is working code if somebody else encounters similar issue or using this example for practicing machine learning.

    from __future__ import print_function
    
    import numpy as np
    import tflearn
    
    # Load CSV file, indicate that the first column represents labels
    from tflearn.data_utils import load_csv
    data, labels = load_csv('zoo.csv', target_column=-1,
                            categorical_labels=True, n_classes=8)
    
    
    # Preprocessing function
    def preprocess(data, columns_to_ignore):
        # Sort by descending id and delete columns
        for id in sorted(columns_to_ignore, reverse=True):
            [r.pop(id) for r in data]
        return np.array(data, dtype=np.float32)
    
    # Ignore 'name' and 'ticket' columns (id 1 & 6 of data array)
    to_ignore=[0]
    
    # Preprocess data
    data = preprocess(data, to_ignore)
    
    # Build neural network
    net = tflearn.input_data(shape=[None,16])
    net = tflearn.fully_connected(net, 128)
    net = tflearn.dropout(net, 1)
    net = tflearn.fully_connected(net, 128)
    net = tflearn.dropout(net, 1)
    net = tflearn.fully_connected(net, 8, activation='softmax')
    net = tflearn.regression(net)
    
    
    # Define model
    model = tflearn.DNN(net)
    # Start training (apply gradient descent algorithm)
    model.fit(data, labels, n_epoch=30, validation_set=0.1, shuffle=True, batch_size=20, show_metric=True)
    
    ant = [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 8, 0, 0, 0]
    # Preprocess data
    # ant = preprocess([ant], to_ignore)
    # ant = np.reshape(ant, (1,16))
    # Predict surviving chances (class 1 results)
    pred = model.predict_label([ant])
    print("Ant is:", pred[0])