使用keras进行Mnist识别

Cre*_*nus 12 python machine-learning mnist deep-learning keras

如何训练模型识别一张图片中的五个数字.代码如下:

from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dropout, Dense, Input
from keras.models import Model, Sequential

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
             activation='relu',
             input_shape=(28, 140, 1)))
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(Dropout(0.5))
Run Code Online (Sandbox Code Playgroud)

这里应该是一个用于识别图片中每个数字的循环,但我不知道如何实现它.

model.add(Dense(11, activation='softmax'))

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

model.fit(X_train, y_train,
      batch_size=1000,
      epochs=8,
      verbose=1,
      validation_data=(X_valid, y_valid))
Run Code Online (Sandbox Code Playgroud)

组合mnist编号的图片如下:

一张图片中的组合数字

Dan*_*ler 1

由于您已经拥有一个表现良好的图像,因此您所要做的就是扩展模型中的类数量。

您可以使用 5 个 11 个类,而不是仅使用 11 个类。

前 11 类标识第一个数字,后面的 11 类标识第二个数字,依此类推。总共 55 个类,图像中每个位置 11 个类。

所以,简而言之:

  • X_training 将是整个图像,如链接中所示,形状为(28,140)、 或(140,28),具体取决于您用于加载图像的方法。
  • Y_training 将是一个 55 元素向量,形状(55,),告诉每个象限中有哪些数字。

示例:对于第一个图像,使用 9,7,5,4,10,您将创建Y_training包含值 1 的以下位置:

  • Y_training[9] = 1
  • Y_training[18] = 1 #(18=7+11)
  • Y_training[27] = 1 #(27=5+22)
  • Y_training[37] = 1 #(37=4+33)
  • Y_training[54] = 1 #(54=10+44)

按照您想要的方式创建模型层,与常规 MNIST 模型几乎相同,这意味着:无需尝试循环或类似的事情。

但它可能需要比以前大一点。

您将无法categorical_crossentropy再使用,因为每个图像将有 5 个正确的类,而不是只有 1 个。如果您最后使用“sigmoid”激活,binary_crossentropy应该是一个很好的替代品。

确保最后一层适合 55 元素向量,例如Dense(55)