restore a model trained with variable input length in tensorflow results in InvalidArgumentError

Viewed 476

I am rather new to tensorflow and am currently experimenting with models of varying complexity. I have a problem with the save and restore functionality of the package. As far as I did understand the tutorials, I should be able to restore a trained graph and run it with some new input at some later point. However, I get the following error when I try to do just that.:

InvalidArgumentError (see above for traceback): Shape [-1,10] has negative dimensions [[Node: Placeholder = Placeholderdtype=DT_FLOAT, shape=[?,10], _device="/job:localhost/replica:0/task:0/cpu:0"]]

My understanding of the message is that the restored graph does not like one dimension to be left arbitrary, which in turn is necessary for practical cases where I don't know beforehand how large my input will be. A code snippet as a minimal example, producing the error above, can be found below. I know how to restore each tensor individually but this gets impractical pretty quickly when the models grow in complexity. I am thankful for any help I get and apologize in case my question is stupid.

import numpy as np
import tensorflow as tf

def generate_random_input():
    alist = []
    for _ in range(10):
        alist.append(np.random.uniform(-1, 1, 100))
    return np.array(alist).T
def generate_random_target():
    return np.random.uniform(-1, 1, 100)

x = tf.placeholder('float', [None, 10])
y = tf.placeholder('float')

# the model 
w1 = tf.get_variable('w1', [10, 1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1))
b1 = tf.get_variable('b1', [1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1))

result = tf.add(tf.matmul(x, w1), b1, name='result')

loss = tf.reduce_mean(tf.losses.mean_squared_error(predictions=result, labels=y))
optimizer = tf.train.AdamOptimizer(0.03).minimize(loss)
saver = tf.train.Saver()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run([optimizer, loss], feed_dict={x: generate_random_input(), y: generate_random_target()})
    saver.save(sess, 'file_name')

# now load the model in another session:
sess2 = tf.Session()
saver = tf.train.import_meta_graph('file_name.meta')
saver.restore(sess2, tf.train.latest_checkpoint('./'))
graph = tf.get_default_graph()
pred = graph.get_operation_by_name('result')
test_result = sess2.run(pred, feed_dict={x: generate_random_input()})
2 Answers
Related