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

基于自编码器的单类红细胞图像异常检测模型调优咨询

单类红细胞图像异常检测模型优化方案

问题描述

基于单类红细胞图像训练了一个单类异常检测深度学习模型,已计算出区分正常与异常图像的阈值,但识别出的异常图像数量未达预期。期望模型对正常样本具备低重构误差,对异常样本具备高重构误差,寻求提升模型性能的方法。

模型代码

import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, BatchNormalization, LayerNormalization
from tensorflow.keras.models import Model
from tensorflow.keras.regularizers import l1

from tensorflow.keras.optimizers import Adam

optimizer = Adam(learning_rate=0.0001)

input_shape = (SIZE, SIZE, 3)

# Encoder
inputs = Input(shape=input_shape)
x = Conv2D(64, (3, 3), activation='relu', padding='same', activity_regularizer=l1(1e-6))(inputs)
x = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same', activity_regularizer=l1(1e-6))(x)
x = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(16, (3, 3), activation='relu', padding='same', activity_regularizer=l1(1e-6))(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# Decoder
x = Conv2D(16, (3, 3), activation='relu', padding='same', activity_regularizer=l1(1e-6))(encoded)
x = UpSampling2D((2, 2))(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same', activity_regularizer=l1(1e-6))(x)
x = UpSampling2D((2, 2))(x)

x = Conv2D(64, (3, 3), activation='relu', padding='same', activity_regularizer=l1(1e-6))(x)
x = UpSampling2D((2, 2))(x)

decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

# Define the autoencoder model
autoencoder = Model(inputs, decoded)

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

# Print the model summary
autoencoder.summary()

#Fit the model. 
history = autoencoder.fit(
        train_generator,
        steps_per_epoch= 250 // batch_size,
        epochs=1000,
        validation_data=validation_generator,
        validation_steps= 250 // batch_size,
        shuffle = True)

#plot the training and validation loss at each epoch
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'y', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

训练损失快照

Epoch 1/1000
7/7 [==============================] - 31s 4s/step - loss: 0.1420 - val_loss: 0.1355
Epoch 2/1000
7/7 [==============================] - 30s 4s/step - loss: 0.1302 - val_loss: 0.1266
Epoch 3/1000
7/7 [==============================] - 30s 4s/step - loss: 0.1228 - val_loss: 0.1201
Epoch 4/1000
7/7 [==============================] - 30s 4s/step - loss: 0.1152 - val_loss: 0.1111
Epoch 5/1000
7/7 [==============================] - 31s 5s/step - loss: 0.1028 - val_loss: 0.0920
Epoch 6/1000
7/7 [==============================] - 30s 4s/step - loss: 0.0785 - val_loss: 0.0630
Epoch 7/1000
7/7 [==============================] - 30s 4s/step - loss: 0.0571 - val_loss: 0.0507
Epoch 8/1000
7/7 [==============================] - 30s 4s/step - loss: 0.0470 - val_loss: 0.0430
Epoch 9/1000
7/7 [==============================] - 30s 4s/step - loss: 0.0412 - val_loss: 0.0392
Epoch 10/1000
7/7 [==============================] - 30s 4s/step - loss: 0.0381 - val_loss: 0.0366
Epoch 11/1000
7/7 [==============================] - 30s 5s/step - loss: 0.0361 - val_loss: 0.0347
Epoch 12/1000
7/7 [==============================] - 30s 4s/step - loss: 0.0341 - val_loss: 0.0333
Epoch 13/1000
7/7 [==============================] - 31s 5s/step - loss: 0.0330 - val_loss: 0.0320

优化方法

一、超参数调整

  • 正则化强度:当前使用l1(1e-6)的activity正则化,可尝试增大强度(如1e-5或1e-4),强化对正常样本特征的约束,避免模型拟合噪声,拉大异常样本的重构误差;也可替换为l2或l1_l2正则化,对比效果。
  • 学习率动态调整:当前Adam学习率固定为0.0001,可加入ReduceLROnPlateau回调,当验证损失连续多轮无下降时自动降低学习率;也可初始设置稍高学习率(如0.001)再逐步衰减,加快模型收敛到有效特征空间。
  • 批次大小优化:当前steps_per_epoch=250//batch_size,若批次过小会导致训练不稳定,过大则梯度更新不及时。可尝试调整batch_size(如16、32),观察损失波动,找到适配的规模。
  • 训练轮次控制:从损失快照看,13轮后损失下降已放缓,加入**早停(EarlyStopping)**回调,当验证损失连续5-10轮无下降时停止训练,避免过拟合,节省训练时间。

二、模型结构与训练策略优化

  • 调整模型容量:当前编码器/解码器的卷积通道数为64→32→16,可尝试增加通道数(如128→64→32)或新增1-2层Conv2D+MaxPooling,提升模型对正常红细胞特征的提取能力。
  • 更换激活函数:当前全用ReLU,可在解码器中替换为LeakyReLU,避免神经元死亡,增强对异常样本的重构误差敏感性;若输入是0-255的RGB图像,需先归一化到[-1,1],再将最后一层激活函数换成tanh,适配数据分布。
  • 更换损失函数:当前用MSE,可尝试MAE(平均绝对误差),MAE对异常值更敏感,能拉大正常与异常样本的重构误差差距;也可使用MSE+MAE的组合损失,兼顾细节拟合与异常敏感性。
  • 加入归一化层:代码中导入了BatchNormalization和LayerNormalization但未使用,可在卷积层后加入BatchNormalization(适配批量训练),稳定训练过程、加快收敛;小批量场景下可选用LayerNormalization。
  • 阈值重新校准:当前阈值可能非最优,基于验证集的正常/异常样本重构误差分布,用F1分数、Precision-Recall曲线确定最优阈值,平衡召回率与精确率,确保更多异常被识别。
  • 正常样本数据增强:对正常红细胞样本做旋转、翻转、轻微缩放、亮度调整等增强,让模型学习到更泛化的正常特征,提升对异常样本的区分度(仅增强正常样本,勿增强异常样本)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:07:11