【问题标题】:Model not training properly accuracy is constant while training a rgb image dataset训练 rgb 图像数据集时,模型未正确训练精度保持不变
【发布时间】:2019-05-15 04:41:29
【问题描述】:

我正在 kaggle 的 fruits360 数据集上训练一个模型。 我的 keras 模型中有 0 个密集层和 3 个卷积层。我的输入形状是 (60,60,3),因为图像以 rgb 格式加载。请帮我解决这个模型有什么问题,为什么它没有正确训练。我尝试过使用不同的层组合,但无论您如何更改,准确性和损失都保持不变。

以下是模型:

dense_layers = [0]
layer_sizes = [64]
conv_layers = [3]

for dense_layer in dense_layers:
for layer_size in layer_sizes:
    for conv_layer in conv_layers:
        NAME = "{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size, dense_layer, int(time.time()))
        print(NAME)

        model = Sequential()

        model.add(Conv2D(layer_size, (3, 3), input_shape=(60, 60, 3)))
        model.add(Activation('relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))

        for l in range(conv_layer-1):
            model.add(Conv2D(layer_size, (3, 3)))
            model.add(Activation('relu'))
            model.add(MaxPooling2D(pool_size=(2, 2)))

        model.add(Flatten())

        for _ in range(dense_layer):
            model.add(Dense(layer_size))
            model.add(Activation('relu'))

        model.add(Dense(1))
        model.add(Activation('sigmoid'))

        tensorboard = TensorBoard(log_dir="logs/")

        model.compile(loss='sparse_categorical_crossentropy',
                      optimizer='adam',
                      metrics=['accuracy'],
                      )

        model.fit(X_norm, y,
                  batch_size=32,
                  epochs=10,
                  validation_data=(X_norm_test,y_test),
                  callbacks=[tensorboard])

但精度保持不变,如下所示:

Epoch 1/10
42798/42798 [==============================] - 27s 641us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 2/10
42798/42798 [==============================] - 27s 638us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 3/10
42798/42798 [==============================] - 27s 637us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 4/10
42798/42798 [==============================] - 27s 635us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 5/10
42798/42798 [==============================] - 27s 635us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 6/10
42798/42798 [==============================] - 27s 631us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 7/10
42798/42798 [==============================] - 27s 631us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 8/10
42798/42798 [==============================] - 27s 631us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 9/10
42798/42798 [==============================] - 27s 635us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 10/10
42798/42798 [==============================] - 27s 626us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114

我能做些什么来正确训练这个模型。提高准确性。

【问题讨论】:

  • 你当然没有像你说的那样有 0 个密集层。不知道为什么要以如此令人困惑的方式构建模型-您真的在每次循环迭代中都初始化 model=Sequential() 吗?请添加到您的帖子中:1)model.summary() 结果 2)类的数量 3)数据集的链接
  • 你确定你有正确的缩进??请务必修复它!

标签: python tensorflow machine-learning keras google-cloud-ml


【解决方案1】:

错误在于最后一个密集层。它设置为一个(即一个类)。 Fruits-360 数据集(取决于版本)有超过 100 个类。 1% 的准确率也是另一个好处。训练集中的标签有 100 个不同的值。一个输出节点的密集层只能(随机)在 100 个中得到正确的 1 个——因此是 1%。

只要标签不是一次性编码的,“sparse_categorical_crossentropy”就可以了。如果是这样,您应该使用“categorical_crossentropy”。与 Adam 一起使用 Fruits-360 数据集时,往往不会在高学习率(如 0.1 和 0.01)下收敛,最好将学习率设置在 0.001 和 0.0001 之间。

【讨论】:

    【解决方案2】:

    我不确定sparse_categorical_crossentropy 对于只有 1 个单位的输出来说是适当的损失。

    注意你的损失是nan。这意味着您的模型/数据/丢失某处存在数学错误。很多时候这是由被零除、数字溢出等引起的。

    我想你应该使用'binary_crossentropy' 作为损失函数。

    请注意,由于“relu”激活,您仍然存在冻结损失的风险。如果发生这种情况,您可以在Activation('relu') 层之前添加BatchNormalization() 层。


    请考虑@desertnaut 的 cmets。您正在每个循环中创建一个新的 Sequential 模型。

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 2019-08-03
      • 2018-04-13
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多