TensorFlow报错:'function' object is not subscriptable 问题求助
Hey there, let's break down this error and fix it step by step. I've run into similar issues when working with RFHO's mode switching, so I know exactly where to look.
First, let's recap your scenario: you modified the RFHO MNIST starting example to use forward mode instead of reverse mode, and hit a TypeError: 'function' object is not subscriptable in TensorFlow. The code snippet you shared is the setup, but the error is almost certainly coming from the part where you implemented the forward mode switch (the code you didn't include here).
Why This Error Happens
This error pops up when you try to use square brackets [] (indexing) on a function or class object, which doesn't support that operation. For example, if you wrote something like rf.ForwardMode[my_model] instead of calling it properly, that would trigger this exact error. RFHO's forward/reverse mode APIs are classes or functions that need to be invoked with parentheses (), not indexed.
Step-by-Step Fixes
Check your forward mode initialization code
Compare your modified code to the original reverse mode code. The original probably looked like this:optimizer = rf.ReverseMode(tf.train.GradientDescentOptimizer(0.1), model_graph)When switching to forward mode, you might have mistakenly written:
# Wrong! This uses indexing on a class/function optimizer = rf.ForwardMode[my_model]The correct syntax is:
# Correct: call the ForwardMode class with parentheses optimizer = rf.ForwardMode(tf.train.GradientDescentOptimizer(0.1), model_graph)Verify gradient handling code
If you're accessing gradients from the forward mode, make sure you're not trying to index a gradient function directly. Some forward mode gradient utilities return a function that needs to be called first to get the actual tensor values. For example:# Wrong: indexing a function grads = optimizer.gradients[0] # Correct: call the function to get gradients grads = optimizer.gradients()Full Working Example (Including Your Setup)
Here's a complete, corrected version of your code that uses forward mode properly:import tensorflow as tf import rfho as rf from rfho.datasets import load_mnist mnist = load_mnist(partitions=(.05, .01)) # Define a simple model (matches typical RFHO examples) x = tf.placeholder(tf.float32, shape=[None, 784]) y_true = tf.placeholder(tf.int64, shape=[None]) dense1 = tf.layers.dense(x, 128, activation=tf.nn.relu) dense2 = tf.layers.dense(dense1, 64, activation=tf.nn.relu) logits = tf.layers.dense(dense2, 10) loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true, logits=logits)) # Initialize model graph and forward mode optimizer model = rf.ModelGraph([x], logits, loss=loss) optimizer = rf.ForwardMode(tf.train.GradientDescentOptimizer(learning_rate=0.1), model) # Training loop with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(5): for batch_x, batch_y in mnist.train: sess.run(optimizer.train_op, feed_dict={x: batch_x, y_true: batch_y}) # Validate val_loss = sess.run(loss, feed_dict={x: mnist.validation[0], y_true: mnist.validation[1]}) print(f"Epoch {epoch+1}, Validation Loss: {val_loss:.4f}")
Key Takeaway
Double-check every part of your code where you switched from reverse to forward mode. Any place you used [] instead of () when interacting with RFHO's forward mode APIs is the likely culprit. Fixing that indexing mistake should resolve the error immediately.
内容的提问来源于stack exchange,提问作者emely_pi

