8
votes

I am trying to train a simple binary logistic regression classifier using Tensorflow (version 0.9.0) in a very similar way to the beginner's tutorial and am encountering the following error when fitting the model:

ValueError: Tensor("centered_bias_weight:0", shape=(1,), dtype=float32_ref) must be from the same graph as Tensor("linear_14/BiasAdd:0", shape=(?, 1), dtype=float32).

Here is my code:

import tempfile
import tensorflow as tf
import pandas as pd

# Customized training data parsing
train_data = read_train_data()
feature_names = get_feature_names(train_data)
labels = get_labels(train_data)

# Construct dataframe from training data features
x_train = pd.DataFrame(train_data , columns=feature_names)
x_train["label"] = labels

y_train = tf.constant(labels)

# Create SparseColumn for each feature (assume all feature values are integers and either 0 or 1)
feature_cols = [ tf.contrib.layers.sparse_column_with_integerized_feature(f,2) for f in feature_names ]

# Create SparseTensor for each feature based on data
categorical_cols = { f: tf.SparseTensor(indices=[[i,0] for i in range(x_train[f].size)],
               values=x_train[f].values,
               shape=[x_train[f].size,1]) for f in feature_names }

# Initialize logistic regression model
model_dir = tempfile.mkdtemp()
model = tf.contrib.learn.LinearClassifier(feature_columns=feature_cols, model_dir=model_dir)

def eval_input_fun():
    return categorical_cols, y_train

# Fit the model - similarly to the tutorial
model.fit(input_fn=eval_input_fun, steps=200)

I feel like I'm missing something critical... maybe something that was assumed in the tutorial but wasn't explicitly mentioned?

Also, I get the following warning every time I call fit():

WARNING:tensorflow:create_partitioned_variables is deprecated.  Use tf.get_variable with a partitioner set, or tf.get_partitioned_variable_list, instead.
1
You mention that you're using 0.9, but the tutorial you link to is from master. Is it possible there were changes? You can check the 0.9 version of the tutorial here: tensorflow.org/versions/r0.9/tutorials/wide/index.html - Shan Carter

1 Answers

7
votes

When you execute model.fit, the LinearClassifier is creating a separate tf.Graph based on the Ops contained in your eval_input_fun function. But, during the creation of this Graph, LinearClassifier doesn't have access to the definitions of categorical_cols and y_train you saved globally.

Solution: move all the Ops definitions (and their dependencies) inside eval_input_fun