TensorFlow中2D数据拆分、运算后求和的实现咨询
Hey there! Let's work through this TensorFlow problem you're stuck on. It looks like you want to apply the same tensor operation to each 1D slice of your 2D dataset, then sum all the results up—let's break down how to do that properly.
First, Clarify the Goal
Your input tensor x has a shape of [None, 10, 10] (where None represents your batch size). You need to split this tensor along the second dimension (axis=1) into 10 individual tensors of shape [None, 10], apply your defined neural network operation to each, then add all those outputs together to get your final y.
Two Effective Approaches
There are two main ways to achieve this, with the second being more efficient for TensorFlow's computation graph:
Approach 1: Unstack + Loop + Sum
You can explicitly split the tensor using tf.unstack, apply your operation to each slice, then sum the results with tf.add_n:
# Split x along axis 1 into 10 tensors of shape [None, 10] x_splits = tf.unstack(x, axis=1) # Apply your operation to each split tensor y_parts = [] for x_part in x_splits: l1 = tf.nn.relu(tf.matmul(x_part, W1) + b1) y_sub = tf.matmul(l1, Wf) + bf y_parts.append(y_sub) # Sum all the individual results y = tf.add_n(y_parts)
This is straightforward and matches the list comprehension logic you described in your example. tf.add_n is ideal here because it adds together multiple tensors of the same shape efficiently.
Approach 2: Vectorized Batch Operations (Recommended)
TensorFlow excels at vectorized operations, so we can avoid explicit loops entirely by leveraging batch matrix multiplication and reduction. This is faster and cleaner, especially for larger datasets:
# Perform batch matrix multiplication: x (batch,10,10) @ W1 (10,10) → (batch,10,10) # b1 is automatically broadcast to match the batch shape l1_batch = tf.nn.relu(tf.matmul(x, W1) + b1) # Multiply by Wf (10,1) → (batch,10,1), then add bf (broadcasted) y_batch = tf.matmul(l1_batch, Wf) + bf # Sum along axis 1 to collapse the 10 slices into a single result per batch item y = tf.reduce_sum(y_batch, axis=1)
This approach works because TensorFlow handles broadcasting and batch operations natively. The result is identical to Approach 1, but it's optimized for TensorFlow's computation graph and runs faster.
Full Updated Code
Here's how your complete code would look with the recommended vectorized approach:
import tensorflow as tf def weight_variable(shape): return tf.Variable(tf.truncated_normal(shape, stddev=0.1)) def bias_variable(shape): return tf.Variable(tf.constant(0.1, shape=shape)) # Input placeholders x = tf.placeholder(tf.float32, [None, 10, 10]) y_ = tf.placeholder(tf.float32, [None, 1]) # Model parameters W1 = weight_variable([10, 10]) b1 = bias_variable([10]) Wf = weight_variable([10, 1]) bf = bias_variable([1]) # Vectorized operation to compute y l1_batch = tf.nn.relu(tf.matmul(x, W1) + b1) y_batch = tf.matmul(l1_batch, Wf) + bf y = tf.reduce_sum(y_batch, axis=1) # Loss function cross_entropy = tf.reduce_mean(tf.losses.mean_squared_error(y_, y))
Key Notes
- You don't need the
x_subplaceholder anymore—we're directly operating on the fullxtensor. - Both approaches will produce the same output, but the vectorized method is preferred for performance.
内容的提问来源于stack exchange,提问作者Phillip Martin

