Tensorflow Keras CNN模型中的训练和损失不变

Tensorflow Keras CNN模型中的训练和损失不变,tensorflow,deep-learning,keras,conv-neural-network,Tensorflow,Deep Learning,Keras,Conv Neural Network,我正在运行一个CNN的左右鞋印分类。我有190000张训练图像,其中10%用于验证。我的模型设置如下所示。我得到所有图像的路径,读入它们并调整它们的大小。我规范化了图像,然后将其适配到模型中。我的问题是,我的训练准确率一直停留在62.5%左右,损失大约0.6615-0.6619。我做错什么了吗?我怎样才能阻止这种事情发生 请注意以下几点: 我首先在10张图片上测试了这一点,我遇到了同样的问题,但将优化器更改为adam,将批处理大小更改为4起作用 然后,我对越来越多的图像进行了测试,但每次我都需

我正在运行一个CNN的左右鞋印分类。我有190000张训练图像,其中10%用于验证。我的模型设置如下所示。我得到所有图像的路径,读入它们并调整它们的大小。我规范化了图像,然后将其适配到模型中。我的问题是,我的训练准确率一直停留在62.5%左右,损失大约0.6615-0.6619。我做错什么了吗?我怎样才能阻止这种事情发生

请注意以下几点:

  • 我首先在10张图片上测试了这一点,我遇到了同样的问题,但将优化器更改为adam,将批处理大小更改为4起作用

  • 然后,我对越来越多的图像进行了测试,但每次我都需要改变批量大小,以提高准确性和损失。对于10000张图片,我必须使用500的批量大小和优化器rmsprop。然而,准确度和损失只是在第10纪元之后才真正开始改变

  • 我现在正在训练190000张图片,我不能增加批量大小,因为我的GPU是最大的

  • imageWidth=50
    图像高度=150
    def get_文件路径(目录):
    文件路径=[]
    对于文件中的文件名:
    filepath=os.path.join(根目录,文件名)
    文件路径。追加(文件路径)#将其添加到列表中。
    返回文件路径
    def清除路径(完整文件路径):
    cleanPaths=[]
    对于fullfilepath中的f:
    如果f.endswith(“.png”):
    cleanPaths.append(f)
    返回路径
    def getTrainData(路径):
    列车数据=[]
    对于X范围内的i(1190000,2):
    im=image.imread(路径[i])
    im=image.imresize(im,(150,50))
    im=(im-255)/浮动(255)
    列车数据附加(im)
    列车数据=np.asarray(列车数据)
    右=np.零(47500)
    左=np.一(47500)
    列车标签=np.连接((左、右))
    trainLabels=np_utils.to_Category(列车标签)
    返回(列车数据、列车标签)
    #创建convnet
    模型=顺序()
    model.add(Conv2D(32,(3,3),activation='relu',input_uShape=(imageWidth,imageHeight,1),Strates=1))\32
    添加(Conv2D(32,(3,3),activation='relu'))
    add(MaxPooling2D(池大小=(2,2)))
    模型。添加(辍学率(0.25))
    添加(Conv2D(64,(3,3),activation='relu',strips=1))
    添加(Conv2D(64,(3,3),activation='relu'))
    add(MaxPooling2D(池大小=(2,2)))
    模型。添加(辍学率(0.25))
    添加(Conv2D(64,(3,3),activation='relu'))
    add(MaxPooling2D(池大小=(1,3)))
    模型。添加(辍学率(0.25))
    model.add(Conv2D(64,(1,2),activation='relu'))
    add(MaxPooling2D(池大小=(2,1)))
    模型。添加(辍学率(0.25))
    model.add(展平())
    model.add(密集(256,activation='relu'))
    模型。添加(辍学率(0.5))
    model.add(密集(2,activation='softmax'))
    新加坡元=新加坡元(lr=0.01)
    compile(loss='classifical_crossentropy',optimizer='rmsprop',metrics=['accurity'])
    #准备培训数据*/
    列车路径=获取文件路径(“更好1/列车”)
    列车路径=清洁道路(列车路径)
    (列车数据,列车标签)=获取列车数据(列车路径)
    trainData=np.重塑(trainData,(95000,imageWidth,imageHeight,1)).aType('float32'))
    列车数据=(列车数据-255)/浮动(255)
    #训练convnet***
    模型拟合(列车数据、列车标签、批次尺寸=500、历元=50、验证分割=0.2)
    #/保存模型和权重*/
    model.save('myConvnet_model5.h5');
    模型。保存权重(“myConvnet\u权重5.h5”);
    
    我会尝试几种方法。较低的学习率应有助于获得更多的数据。通常,调整优化器会有所帮助。此外,您的网络看起来非常小,您可能希望通过添加层或增加层中过滤器的数量来增加模型的容量


    关于如何在实践中应用深度学习,本文给出了一个更好的描述。

    我已经多次遇到过这个问题,因此我想对它做一个简要的回顾,以及可能的解决方案等,以帮助未来的人们

    问题:模型预测它所看到的所有数据的2个(或更多)可能类别中的一个*

    正在发生确认问题:方法1:训练时模型的准确度保持在0.5左右(或1/n,其中n为班级数量)。方法2:获取预测中每个类的计数,并确认它预测了所有一个类

    修复/检查(以某种顺序):

    • 仔细检查模型架构:使用
      Model.summary()
      ,检查模型
    • 检查数据标签:确保列车数据的标签在预处理等过程中没有混淆(这种情况经常发生!)
    • 检查列车数据馈送是否随机:确保您没有一次将列车数据馈送到模型一类。例如,如果使用
      ImageDataGenerator().flow\u from\u directory(PATH)
      ,请检查param
      shuffle=True
      ,并且
      batch\u size
      大于1
    • 检查预训练层是否不可训练:**如果使用预训练模型,请确保使用预训练权重的任何层最初都不可训练。对于第一个时代,只有新添加的(随机初始化的)层才可以训练<代码>用于预训练_模型中的层。层:layer.trainable=False应该在代码中的某个位置
    • 降低学习率:继续将学习率降低10倍,然后重试。注意:每次尝试新的学习速率时,您必须完全重新初始化您尝试训练的层。(例如,我有一个问题,只有当我深入到
      lr=1e-6
      时才得到解决,所以请继续!)
    如果你们中有人