需要一点帮助了解如何在 Keras 中构建模型

数据挖掘 喀拉斯 美国有线电视新闻网 极简主义
2022-02-28 17:14:33

我正在尝试在 Keras 中制作 CNN,为了测试我的模型的有效性,我试图让它在 MNIST 数据集上进行训练,所以我确信一切正常,但不幸的是模型几乎没有训练,我怀疑没有更新。我的模型是:

model=Sequential()

#conv1_1
model.add(Conv2D(128,kernel_size=3, strides=1,
                 padding='SAME', use_bias=False, 
                 activation='relu',name='conv1_1',input_shape=(28,28,1)))
#conv1_2
model.add(Conv2D(128, kernel_size=3, strides=1,
                 padding='SAME', use_bias=False, 
                 activation='relu',name='conv1_2'))
model.add(MaxPooling2D(pool_size=2,strides=2))

#conv2_1
model.add(Conv2D(64, kernel_size=3, strides=1,
                 padding='SAME', use_bias=False, 
                 activation='relu',name="conv2_1"))

#conv2_2
model.add(Conv2D(64, kernel_size=3, strides=1,
                 padding='SAME', use_bias=False, 
                 activation='relu',name='conv2_2'))
model.add(MaxPooling2D(pool_size=2,strides=2))

model.add(Flatten())
model.add(Dense(1024, activation='relu',name='Dense1'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu',name='Dense2'))
model.add(Dense(10, activation='softmax',name='output'))

编译:

model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])

model.fit(X_train,y_train,batch_size=10,validation_split=0.2,epochs=10)

我的 X_train 和 y_train 看起来像:

plt.imshow(X_train[0].reshape(28,28))
plt.show()

y_train[0]
array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.])

以下是前 3 个 epoch 的结果:

Epoch 1/10
48000/48000 [==============================] - 45s 927us/step - loss: 14.2813 - acc: 0.1140 - val_loss: 14.4096 - val_acc: 0.1060
Epoch 2/10
48000/48000 [==============================] - 44s 915us/step - loss: 14.2813 - acc: 0.1140 - val_loss: 14.4096 - val_acc: 0.1060
Epoch 3/10
48000/48000 [==============================] - 44s 924us/step - loss: 14.2813 - acc: 0.1140 - val_loss: 14.4096 - val_acc: 0.1060
Epoch 4/10
48000/48000 [==============================] - 45s 930us/step - loss: 14.2813 - acc: 0.1140 - val_loss: 14.4096 - val_acc: 0.1060

这是我的第一个 Keras 模型,我认为我在这里遗漏了一些重要的东西。

2个回答

我惊讶地实现了你的模型,有一个很难注意到的非常小的错误。

通过将优化器更改为“SGD”或“ADAM”,我能够获得更好的准确性。

正如您所使用的“ADADELTA”,它是“ADAGRAD”优化器的扩展。在“ADAGRAD”中,在稀疏数据和训练大规模神经网络时表现良好。它的单调学习率通常被证明过于激进,过早停止学习。

请参阅此链接以了解优化器

我可以怀疑两件事。首先,最后一层的辍学率似乎很高。在每个 CNN 层之后最好有一个较低的 dropout 率。其次,您应该在 CNN 层中使用偏差。


试试这个代码作为起点,然后你可以从这里开始调整你的模型。

加载数据

from keras.datasets import mnist
import numpy as np

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.


print('Training data shape: ', x_train.shape)
print('Testing data shape : ', x_test.shape)

导入 Keras 的东西

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.callbacks import ModelCheckpoint
from keras.models import model_from_json
from keras import backend as K

现在我们重塑数据,使其适合 tensorflow 后端。这要求通道是最后一个维度。我们还将设置我们的 one-hot 编码输出

# The known number of output classes.
num_classes = 10

# Input image dimensions
img_rows, img_cols = 28, 28

# Channels go last for TensorFlow backend
x_train_reshaped = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test_reshaped = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)

# Convert class vectors to binary class matrices. This uses 1 hot encoding.
y_train_binary = keras.utils.to_categorical(y_train, num_classes)
y_test_binary = keras.utils.to_categorical(y_test, num_classes)

定义模型

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

训练模型

epochs = 10
batch_size = 128
# Fit the model weights.
model.fit(x_train_reshaped, y_train_binary,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test_reshaped, y_test_binary))

评估模型

score = model.evaluate(x_test_reshaped, y_test_binary, verbose=0)
print('Model accuracy:')
print('Test loss:', score[0])
print('Test accuracy:', score[1])