预测特斯拉股票时遇NumPy转Tensor错误,求数据适配方案
Hey there, let's break down why you're seeing that ValueError: Failed to convert a NumPy array to a Tensor and get your model up and running. The issue boils down to a critical typo in your preprocessing code, plus a few misaligned model settings for your classification task.
1. The Root Cause: Incorrect Data Collection in Preprocessing
Look at this line in your preproccesing function:
X.append(sequential_data)
You're appending the entire sequential_data list (which contains all sequences and targets) to X every time, instead of appending just the individual sequence seq. This creates a deeply nested NumPy array where each element is the full dataset—TensorFlow can't parse that into a valid input tensor.
Fix it by changing that line to:
X.append(seq)
2. Align Your Loss Function with the Task Type
You're doing a binary classification task (predicting 0 or 1), but you're using mse (mean squared error)—a loss function designed for regression problems. This will lead to poor performance and potential training issues.
Update your model compilation to use a classification-friendly loss:
Since your train_y are integer labels (0/1) and your output layer uses softmax with 2 units, use sparse_categorical_crossentropy (no need to one-hot encode your labels):
model.compile(loss="sparse_categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
3. Clean Up Redundant LSTM Input Shape Declarations
Only the first LSTM layer needs the input_shape parameter—subsequent LSTM layers automatically inherit the input shape from the previous layer's output. Remove the input_shape from the second and third LSTM layers to avoid confusion:
model.add(LSTM(128, input_shape=(train_x.shape[1:]), activation="relu", return_sequences=True)) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(LSTM(128, activation="relu", return_sequences=True)) # No input_shape needed here model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(LSTM(128, activation="relu", return_sequences=True)) # Or here model.add(Dropout(0.2)) model.add(BatchNormalization())
4. Verify Your Data Shapes (Post-Fix)
After making the above changes, print your input shapes to confirm they match LSTM requirements (samples, time steps, features):
print(train_x.shape) # Should be (number_of_samples, 100, 2)
This ensures TensorFlow can properly process your sequential data.
Full Corrected Preprocessing Function
Here's the fixed preproccesing function with the critical typo fixed:
def preproccesing(data): data = data.drop("future", 1) for col in data.columns: if col != "target": data[col] = data[col].pct_change() data.dropna(inplace=True) data[col] = preprocessing.scale(data[col].values) data.dropna(inplace = True) sequential_data = [] prev_days = deque(maxlen=Back_period_history) for i in data.values: prev_days.append([n for n in i[:-1]]) if len(prev_days) == Back_period_history: sequential_data.append([np.array(prev_days), i[-1]]) rd.shuffle(sequential_data) buys = [] sells = [] for seq, target in sequential_data: if target == 0: sells.append([seq, target]) elif target == 1: buys.append([seq,target]) rd.shuffle(buys) rd.shuffle(sells) lower = min(len(buys), len(sells)) buys = buys[:lower] sells = sells[:lower] sequential_data = buys+sells rd.shuffle(sequential_data) X = [] y = [] for seq, target in sequential_data: X.append(seq) # Fixed line! y.append(target) return np.array(X),y
Once you apply these fixes, your model should train without the tensor conversion error and perform better on your classification task.
内容的提问来源于stack exchange,提问作者manan goyal

