迁移学习中进行医学影像分析,训练神经网络后accuracy保持不变。。。 10C

使用的是vgg16的finetune网络,网络权重从keras中导入的,最上层有三层的一个小训练器的权重是由训练习得的。训练集大约300个样本,验证集大约80个样本,但程序运行后,第一二个epoch之间loss、acc还有变化,之后就不再变化,而且验证集的准确度一直接近于零。。想请有关卷积神经网络和机器学习方面的大神帮忙看一下是哪里出了问题

import keras
from keras.models import Sequential
from keras.layers import Dense,Dropout,Activation,Flatten
from keras.layers import GlobalAveragePooling2D
import numpy as np
from keras.optimizers import RMSprop
from keras.utils import np_utils
import matplotlib.pyplot as plt
from keras import regularizers
from keras.applications.vgg16 import VGG16
from keras import optimizers
from keras.layers.core import Lambda
from keras import backend as K
from keras.models import Model

#写一个LossHistory类(回调函数),保存loss和acc,在keras下画图
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):#在每个batch的开始处(on_batch_begin):logs包含size,即当前batch的样本数
self.losses = {'batch':[], 'epoch':[]}
self.accuracy = {'batch':[], 'epoch':[]}
self.val_loss = {'batch':[], 'epoch':[]}
self.val_acc = {'batch':[], 'epoch':[]}

def on_batch_end(self, batch, logs={}):
    self.losses['batch'].append(logs.get('loss'))
    self.accuracy['batch'].append(logs.get('acc'))
    self.val_loss['batch'].append(logs.get('val_loss'))
    self.val_acc['batch'].append(logs.get('val_acc'))

def on_epoch_end(self, batch, logs={}):#每迭代完一次从log中取得数据
    self.losses['epoch'].append(logs.get('loss'))
    self.accuracy['epoch'].append(logs.get('acc'))
    self.val_loss['epoch'].append(logs.get('val_loss'))
    self.val_acc['epoch'].append(logs.get('val_acc'))

def loss_plot(self, loss_type):
    iters = range(len(self.losses[loss_type])) #绘图的横坐标?
    plt.figure() #建立一个空的画布
    if loss_type == 'epoch':
        plt.subplot(211)
        plt.plot(iters,self.accuracy[loss_type],'r',label='train acc')
        plt.plot(iters,self.val_acc[loss_type],'b',label='val acc')  # val_acc用蓝色线表示
        plt.grid(True)
        plt.xlabel(loss_type)
        plt.ylabel('accuracy')
        plt.show()
        plt.subplot(212)
        plt.plot(iters, self.losses[loss_type], 'r', label='train loss') # val_acc 用蓝色线表示
        plt.plot(iters, self.val_loss[loss_type], 'b', label='val loss')   # val_loss 用黑色线表示
        plt.xlabel(loss_type)
        plt.ylabel('loss')
        plt.legend(loc="upper right") #把多个axs的图例放在一张图上,loc表示位置
        plt.show()
    print(np.mean(self.val_acc[loss_type]))
    print(np.std(self.val_acc[loss_type]))

seed = 7

np.random.seed(seed)

#训练网络的几个参数
batch_size=32
num_classes=2
epochs=100
weight_decay=0.0005
learn_rate=0.0001
#读入训练、测试数据,改变大小,显示基本信息
X_train=np.load(open('/image_BRATS_240_240_3_normal.npy',mode='rb'))
Y_train=np.load(open('/label_BRATS_240_240_3_normal.npy',mode='rb'))
Y_train = keras.utils.to_categorical(Y_train, 2)

#搭建神经网络
model_vgg16=VGG16(include_top=False,weights='imagenet',input_shape=(240,240,3),classes=2)
model_vgg16.layers.pop()
model=Sequential()
model.add(model_vgg16)
model.add(Flatten(input_shape=X_train.shape[1:]))
model.add(Dense(436,activation='relu')) #return x*10的向量
model.add(Dense(2,activation='softmax'))
#model(inputs=model_vgg16.input,outputs=predictions)

for layer in model_vgg16.layers[:13]:
layer.trainable=False

model_vgg16.summary()

model.compile(optimizer=RMSprop(lr=learn_rate,decay=weight_decay),
loss='categorical_crossentropy',
metrics=['accuracy'])

model.summary()
history=LossHistory()
model.fit(X_train,Y_train,
batch_size=batch_size,epochs=epochs,
verbose=1,
shuffle=True,
validation_split=0.2,
callbacks=[history])

#模型评估
history.loss_plot('epoch')

比如:
实验运行结果:

3个回答

你既然是用fine_tune, 但是我在你的code里并没有看到fine_tune的过程。
其次,在这行代码中model.add(Dense(436,activation='relu')) #return x*10的向量,注释我认为有误,应当是return(,436)的向量。
同时,在最后一层dense的维度设置中,应当为4096或1024,256等,应当为2的次方数。
最后至于博客所出现的accuracy问题,可以以fine_tune的正确方式进行,即在fine_tune前,freeze住base_model(vgg16)中的模型层数,对后加入fc层进行warm up,训练轮数可以设置为50轮。WarmUp之后,即可进行微调,unfreeze basemodel的最后一层卷积层或最后两层
卷积层,达到fine_tune的目的。
以上,仅供参考.

模型出现了过拟合,可以尝试通过打印网络的输出来观察变化

mlxzhl
雲杉 想问下你的数据验证代码是怎么写的
4 个月之前 回复
Catherine_c1
Catherine_c1 谢谢回复!!!我尝试一下
2 年多之前 回复

我也遇到了同样的问题,源域的训练精度显示很高,目标域的我进行结构调整后,最后精度总是维持在0.47不变,请问最后找到解决方法了吗,是靠什么解决的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问