【问题标题】:Why does my Keras CNN always guess one number? Why is my Loss so high?为什么我的 Keras CNN 总是猜一个数字?为什么我的Loss这么高?
【发布时间】:2020-05-24 22:55:40
【问题描述】:

我一直在为这个 CNN 工作。在 Test() 函数中,它总是说它是 1 个给定的数字。 (例如。总是输出 8 即使它甚至没有关闭)。我尝试更多地训练模型,看看模型是否不够好。这是我的代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Dense, Conv2D, Dropout, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.utils import to_categorical
from matplotlib import pyplot as plt
(Train_Data, Train_Labels), (Test_Data, Test_Labels) = tf.keras.datasets.mnist.load_data()


Train_Data = Train_Data.reshape(60000,28,28,1)
Test_Data = Test_Data.reshape(10000,28,28,1)
Train_Data = Train_Data / 255 - 0.5
Test_Data = Test_Data / 255 - 0.5

def load(name):
    net = keras.models.load_model(name)
    return net
def save(name):
    model.save(name)
    print("""

###:::SAVING MODEL:::###

    """)
def makeCNN():
    model = keras.Sequential()
    model.add(Conv2D(32, kernel_size=3, activation='relu'))
    model.add(MaxPooling2D(pool_size=(3,3)))
    model.add(keras.layers.Flatten())
    model.add(Dense(9, activation='relu'))
    model.add(Dense(10, activation='softmax'))

    model.compile(optimzer='adam', loss="mse", metrics=['accuracy'])
    return model
def train(epochs):
    for i in range(epochs):
        print(i+1)
        model.fit(Train_Data, Train_Labels)
        save('CNN.h5')




def test():
    validCorrect = 0
    validTotal = 0
    print(Test_Data.shape)
    for i in range(1000):
        data = Test_Data[i]
        data = data.reshape(1,28,28,1)
        prediction = model.predict(data)
        validTotal +=1

        if np.argmax(prediction) == Test_Labels[i]:
            validCorrect+=1

            print(f"""
            TOTAL:{validTotal}
            ACCURACY:{(validCorrect/validTotal)*100}
            CORRECT:{validCorrect}
            """)
        print(f"GUESS:{np.argmax(prediction)}
        REALITY{Test_Labels[i]}")







model = makeCNN()

train(80)
test()

感谢任何帮助。谢谢!我对机器学习很陌生(尤其是 CNN)

【问题讨论】:

    标签: python keras neural-network conv-neural-network


    【解决方案1】:

    首先,您应该使用categorical_crossentropy 作为您的损失。使用 MSE 很诱人,毕竟我们是在处理数字,但由于这是一项分类任务,模型不知道不同数字的假定序数。它只是将它们称为“十种不同的图像类别”。例如,7 是否更类似于 2 或 8?就序数而言,它更接近于 8。但数字看起来更像是 2,不是吗?

    另外,我猜您的模型可能会严重欠拟合,因为不够深。您可以尝试在网络中添加更多卷积层。您可以从 Keras 文档(也在 MNIST 数据集上)中的这个示例中汲取灵感,这里是 https://keras.io/examples/mnist_cnn/,他们在这个问题上只用了几个额外的卷积层,以及一些减少过拟合的技术,例如 dropout .

    【讨论】:

    • 如果没有进一步的信息就不可能说。也许尝试从文档示例中复制和粘贴代码并从那里进行修改。
    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2018-01-04
    • 2020-10-11
    • 2014-01-10
    • 1970-01-01
    • 2017-09-21
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多