Keras Cnn 模型不会提高准确性

时间:2021-01-12 19:50:55

标签: python tensorflow keras

我正在尝试在 Sklearn 数据集上使用 Keras 实现一个 Cnn,用于手写数字识别 (load_digits)。我已经让模型运行,但它并没有提高每个“时代”周期的准确性,我猜是因为我的标签不正确,我尝试使用“to_categorical”对我的 Y 值进行编码,但它显示以下错误:

    C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\backend.py:4979 binary_crossentropy
        return nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output)
    C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\util\dispatch.py:201 wrapper
        return target(*args, **kwargs)
    C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\ops\nn_impl.py:173 sigmoid_cross_entropy_with_logits
        raise ValueError("logits and labels must have the same shape (%s vs %s)" %

    ValueError: logits and labels must have the same shape ((None, 1) vs (None, 10))

当我运行我的代码而不尝试对 Y 值进行编码时,它似乎通过了 Cnn 模型,但是它不准确并且不会增加,这是我的代码:

import tensorflow as tf
from sklearn import datasets
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D

#from keras.utils.np_utils import to_categorical

X,y = datasets.load_digits(return_X_y = True)
X = X/16
#X = X.reshape(1797,8,8,1)

train_x, test_x, train_y, test_y = train_test_split(X, y)

train_x = train_x.reshape(1347,8,8,1)
#test_x = test_x.reshape()

#train_y = to_categorical(train_y, num_classes = 10)

model = Sequential()

model.add(Conv2D(32, (2, 2), input_shape=( 8, 8, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors

model.add(Dense(64))

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

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

model.fit(train_x, train_y, batch_size=32, epochs=6, validation_split=0.3)

print(train_x[0])

这给了我以下输出:

Epoch 1/6

 1/30 [>.............................] - ETA: 13s - loss: 1.1026 - accuracy: 0.0938
 6/30 [=====>........................] - ETA: 0s - loss: 0.2949 - accuracy: 0.0652 
30/30 [==============================] - 1s 33ms/step - loss: -5.4832 - accuracy: 0.0893 - val_loss: -49.9462 - val_accuracy: 0.1012
Epoch 2/6

 1/30 [>.............................] - ETA: 0s - loss: -52.2145 - accuracy: 0.0625
30/30 [==============================] - 0s 3ms/step - loss: -120.6972 - accuracy: 0.0961 - val_loss: -513.0211 - val_accuracy: 0.1012
Epoch 3/6

 1/30 [>.............................] - ETA: 0s - loss: -638.2873 - accuracy: 0.1250
30/30 [==============================] - 0s 3ms/step - loss: -968.3621 - accuracy: 0.1006 - val_loss: -2804.1062 - val_accuracy: 0.1012
Epoch 4/6

 1/30 [>.............................] - ETA: 0s - loss: -3427.3135 - accuracy: 0.0000e+00
30/30 [==============================] - 0s 3ms/step - loss: -4571.7894 - accuracy: 0.0934 - val_loss: -10332.9727 - val_accuracy: 0.1012
Epoch 5/6

 1/30 [>.............................] - ETA: 0s - loss: -12963.2559 - accuracy: 0.0625
30/30 [==============================] - 0s 3ms/step - loss: -15268.3010 - accuracy: 0.0887 - val_loss: -29262.1191 - val_accuracy: 0.1012
Epoch 6/6

 1/30 [>.............................] - ETA: 0s - loss: -30990.6758 - accuracy: 0.1562
30/30 [==============================] - 0s 3ms/step - loss: -40321.9540 - accuracy: 0.0960 - val_loss: -68548.6094 - val_accuracy: 0.1012

非常感谢任何指导,谢谢!

1 个答案:

答案 0 :(得分:0)

当您拥有 CNN 时,您希望最后一层具有与标签一样多的节点。因此,如果您有 10 个数字,您希望最后一层的输出大小为 10。它通常具有激活函数“softmax”,它使每个值都变为 0,但值为 1 的值除外。

model.add(Dense(10))
model.add(Activation('softmax'))