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

Keras液滴图像边缘检测模型损失无改善且输出黑图求助

问题分析与修复方案

从你的代码和描述来看,模型训练无进展、输出全黑图的问题主要集中在标签赋值错误、激活函数选型完全不符合任务需求、学习率设置过高这几个核心点上,下面逐一拆解并给出修复方案:

1. 致命低级错误:标签被错误替换为输入

你在处理标签数据时犯了一个严重的逻辑错误:

tr_out_sel_flat=tr_in_sel.reshape([np.prod(pl),b_sha])

这里你把输入图像tr_in_sel当成了训练标签,相当于让模型学习"复制输入",再加上后续激活函数的错误,直接导致训练完全偏离了"学习图像边缘标记"的预期目标。

修正:把tr_in_sel换成正确的标签数据tr_out_sel:

tr_out_sel_flat=tr_out_sel.reshape([np.prod(pl),b_sha])

2. 激活函数与图像回归任务完全不匹配

你的模型多次使用softmax激活函数,但softmax是专门用于分类任务的——它会将输出归一化到0-1区间且所有输出总和为1,这和图像像素(每个通道独立的0-1连续值)的特性完全冲突。最后一层用softmax会强制让模型输出的像素值总和为1,最终呈现全黑图。

修正方案:

  • 中间隐藏层保留relu激活即可,绝对不要用softmax
  • 输出层对于归一化后的图像像素,使用sigmoid激活(让每个像素独立归一化到0-1区间),或者直接不使用激活函数(因为输入已经归一化到0-1,MSE损失下直接输出连续值更合适)

3. 学习率过高导致训练彻底不稳定

你给Adam优化器设置了lr=0.1,但Adam的默认学习率是0.001,0.1的学习率太大了,会导致模型参数更新幅度过大,根本无法收敛到有效解,甚至可能出现损失震荡或NaN的情况。

修正:降低学习率到合理范围,比如0.001:

model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error', metrics=['accuracy'])

(注:Keras新版本中adam(lr=...)已被弃用,建议改用Adam(learning_rate=...),需要先导入from keras.optimizers import Adam)

额外建议:全连接层不适合图像分割任务

虽然你指定要用Dense层,但从任务本质来说,图像是具有空间相关性的数据,全连接层会完全丢失空间信息,训练效果会远不如卷积神经网络(CNN)。如果后续想提升效果,建议改用U-Net这类专门针对图像分割的CNN结构。

修正后的完整代码片段

#################### IMPORT AND SPLIT
from cam_img_split import cam_img_split
import cv2
import numpy as np  # 补上缺失的numpy导入
img_tr_in=cv2.imread('frame 1.png')
img_tr_out=cv2.imread('frame 1 so far.png')
seg_shape=[32,32]
tr_in=cam_img_split(img_tr_in,seg_shape)
tr_out=cam_img_split(img_tr_out,seg_shape)
pl=[4,20] #images selected for training
##################### NEURAL NETWORK
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam

b_sha=np.prod(tr_in.shape[2:5]) #batch shape
model = Sequential()
# 中间层仅用relu激活
model.add(Dense(b_sha, activation='relu'))
model.add(Dense(3072, activation='relu'))
model.add(Dense(3072, activation='relu'))
model.add(Dense(3072, activation='relu'))
# 输出层用sigmoid匹配归一化后的像素值
model.add(Dense(np.prod(tr_out.shape[2:5]), activation='sigmoid'))
# 调整学习率到合理值
model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error', metrics=['accuracy'])

tr_in_sel=tr_in[0:pl[0],0:pl[1],:,:,:]
tr_out_sel=tr_out[0:pl[0],0:pl[1],:,:,:]
tr_in_sel_flat=tr_in_sel.reshape([np.prod(pl),b_sha]) #Flattening
# 修正标签赋值
tr_out_sel_flat=tr_out_sel.reshape([np.prod(pl),b_sha])
tr_in_sel_flat_norm=tr_in_sel_flat/255
tr_out_sel_flat_norm=tr_out_sel_flat/255

model.fit(tr_in_sel_flat_norm, tr_out_sel_flat_norm, epochs=10, batch_size=pl[0])

额外训练提示

如果修正后损失下降仍然缓慢,可以尝试:

  • 增加训练轮数(比如epochs=50)
  • 调整隐藏层神经元数量(比如减少3072的数值,避免过拟合)
  • 增加训练样本数量(你目前仅用了80个样本,数量太少)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:55:51