gpt4 book ai didi

tensorflow - Keras CNN 模型中的训练和损失没有改变

转载 作者:行者123 更新时间:2023-12-04 05:06:05 25 4
gpt4 key购买 nike

我正在运行一个用于左右鞋印分类的 CNN。我有 190,000 张训练图像,我将其中的 10% 用于验证。我的模型设置如下所示。我获取所有图像的路径,读取它们并调整它们的大小。我对图像进行标准化,然后将其拟合到模型中。我的问题是我一直坚持 62.5% 的训练准确率和大约 0.6615-0.6619 的损失。我做错了什么吗?我怎样才能阻止这种情况发生?
只是一些有趣的点需要注意:

  • 我首先在 10 个图像上进行了测试,我遇到了同样的问题,但将优化器更改为 adam 并将批量大小更改为 4 有效。
  • 然后我对越来越多的图像进行了测试,但每次我都需要更改批量大小以提高准确性和损失。对于 10,000 张图像,我不得不使用 500 的批量大小和优化器 rmsprop。然而,准确率和损失直到 epoch 10 之后才真正开始发生变化。
  • 我现在正在训练 190,000 张图像,我无法增加批量大小,因为我的 GPU 处于最大值。

  •     imageWidth = 50
    imageHeight = 150

    def get_filepaths(directory):
    file_paths = []
    for filename in files:
    filepath = os.path.join(root, filename)
    file_paths.append(filepath) # Add it to the list.
    return file_paths

    def cleanUpPaths(fullFilePaths):
    cleanPaths = []
    for f in fullFilePaths:
    if f.endswith(".png"):
    cleanPaths.append(f)
    return cleanPaths

    def getTrainData(paths):
    trainData = []
    for i in xrange(1,190000,2):
    im = image.imread(paths[i])
    im = image.imresize(im, (150,50))
    im = (im-255)/float(255)
    trainData.append(im)
    trainData = np.asarray(trainData)
    right = np.zeros(47500)
    left = np.ones(47500)
    trainLabels = np.concatenate((left, right))
    trainLabels = np_utils.to_categorical(trainLabels)
    return (trainData, trainLabels)

    #create the convnet
    model = Sequential()

    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(imageWidth,imageHeight,1),strides=1))#32
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), activation='relu',strides=1))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(1, 3)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (1, 2), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 1)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(2, activation='softmax'))

    sgd = SGD(lr=0.01)
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=['accuracy'])

    #prepare the training data*/

    trainPaths = get_filepaths("better1/train")
    trainPaths = cleanUpPaths(trainPaths)
    (trainData, trainLabels) = getTrainData(trainPaths)
    trainData = np.reshape(trainData,(95000,imageWidth,imageHeight,1)).astype('float32')
    trainData = (trainData-255)/float(255)

    #train the convnet***
    model.fit(trainData, trainLabels, batch_size=500, epochs=50, validation_split=0.2)

    #/save the model and weights*/
    model.save('myConvnet_model5.h5');
    model.save_weights('myConvnet_weights5.h5');

    最佳答案

    我现在已经多次遇到这个问题,所以想稍微回顾一下它和可能的解决方案等,以帮助将来的人们。

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

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

    修复/检查 (有点顺序):

  • 双重检查模型架构 :使用 model.summary() , 检查模型。
  • 检查数据标签 : 确保你的火车数据的标签没有在预处理等的某个地方混淆(它发生了!)
  • 检查列车数据馈送是否随机 :确保您没有将您的训练数据一次一次提供给模型。例如,如果使用 ImageDataGenerator().flow_from_directory(PATH) , 检查参数 shuffle=True还有那个batch_size大于 1。
  • 检查预训练层不可训练 :** 如果使用预训练模型,请确保任何使用预训练权重的层最初都是不可训练的。对于第一个时期,只有新添加的(随机初始化的)层应该是可训练的; for layer in pretrained_model.layers: layer.trainable = False应该在您的代码中的某个地方。
  • 降低学习率 :继续将学习率降低 10 倍并重试。请注意,每次尝试新的学习率时,您都必须完全重新初始化您尝试训练的层。 (例如,我遇到的这个问题只有在我下到 lr=1e-6 后才能解决,所以继续!)

  • 如果你们中有人知道更多的修复/检查可以正确地进行模型训练,那么请做出贡献,我会尝试更新列表。

    **请注意,一旦新层最初训练“足够”,使更多的预训练模型可训练是很常见的

    *该问题的其他名称可帮助搜索到达这里...
    keras tensorflow theano CNN 卷积神经网络 糟糕的训练卡住了 固定的 非静态 坏掉的 bug 被卡住了 训练优化 优化 只有 0.5 准确度不会改变 只预测一个单一的类不会训练模型卡在类模型上 在 epochs 之间重置自身 keras CNN 相同的输出

    关于tensorflow - Keras CNN 模型中的训练和损失没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43674411/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com