You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras圆拟合网络输入输出维度不兼容问题求解

解决Keras圆参数预测模型的形状不匹配问题

问题背景

输入是维度为(num_circles, num_points, 2)的数组,对应num_circles个圆,每个圆包含num_points个二维坐标点;输出是(num_circles, 3)的向量,存储每个圆的圆心坐标与半径。

原代码如下:

import numpy as np
import keras
from keras import layers


x_train = array_of_circles  
# Input vector of shape (100, 1000, 2) i.e., 100 circles of 1000 points each

y_train = np.concatenate((array_of_centers, array_of_radius.reshape(-1,1)), axis=1)   
# Output: [x_center, y_center, radius]

# Define the neural network model
model = keras.Sequential([
        layers.InputLayer(input_shape=(num_points, 2)),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(32, activation='relu'),
        layers.Dense(3)                                                               # Output layer with 3 units for x_center, y_center, and radius
])

# Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')

# Train the model
model.fit(x_train, y_train, epochs=10, batch_size=32)

运行后报错:

Incompatible shapes: [32,1000,3] vs. [32,3]
     [[{{node gradient_tape/mean_squared_error/BroadcastGradientArgs}}]] [Op:__inference_train_function_6137]

问题原因

原模型中直接使用Dense层处理(num_points, 2)的输入,每个Dense层会对每个点单独进行运算,导致最后一层Dense(3)输出的形状为(batch_size, num_points, 3),但标签y_train的形状是(batch_size, 3),两者形状无法匹配。

解决方案

需要在全连接层之后加入全局池化层,将每个圆的num_points个点的特征压缩为一个全局特征向量,再映射到3个输出参数。常用的全局池化层有GlobalAveragePooling1D或GlobalMaxPooling1D,前者对每个特征通道取均值,后者取最大值,都能有效压缩维度。

修改后的代码如下:

import numpy as np
import keras
from keras import layers

num_points = 1000
x_train = array_of_circles  # Shape (100, 1000, 2)
y_train = np.concatenate((array_of_centers, array_of_radius.reshape(-1,1)), axis=1)  # Shape (100, 3)

# 修正后的模型
model = keras.Sequential([
        layers.InputLayer(input_shape=(num_points, 2)),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(32, activation='relu'),
        # 加入全局平均池化层,将(None, 1000, 32)压缩为(None, 32)
        layers.GlobalAveragePooling1D(),
        layers.Dense(3)  # 输出(None, 3),与y_train形状匹配
])

model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(x_train, y_train, epochs=10, batch_size=32)

补充说明

  • 也可以用GlobalMaxPooling1D()替代GlobalAveragePooling1D(),两者都能实现维度压缩,具体效果可根据数据特点选择。
  • 如果不想用池化层,也可以用Flatten()将(num_points, 2)展平为(num_points*2,),再接入全连接层,但全局池化更适合处理这种“每个样本包含多个同类型子样本”的结构,避免参数过多。

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:17:32