keras手写数字识别--入门

电玩女神 2022-05-25 05:10 354阅读 0赞

程序

由于mnist数据集直接使用

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

这种加载方式,有时候由于网络原因,很难加载成功。为此,可以直接通过地址其地址下载下来。然后使用numpy加载一下数据就行。

  1. # -*- coding: utf-8 -*-
  2. import keras
  3. # from keras.datasets import mnist
  4. from keras.models import Sequential
  5. from keras.layers import Dense, Dropout
  6. from keras.optimizers import RMSprop
  7. import matplotlib.pyplot as plt
  8. import numpy as np
  9. batch_size = 128
  10. num_classes = 10
  11. epochs = 20
  12. #由于使用程序下载很困难,这里手动下载导入数据
  13. # the data, shuffled and split between train and test sets
  14. # (x_train, y_train), (x_test, y_test) = mnist.load_data()
  15. path='F:/program_work/python_work/KerasTest/data/mnist.npz'
  16. f = np.load(path)
  17. x_train, y_train = f['x_train'], f['y_train']
  18. x_test, y_test = f['x_test'], f['y_test']
  19. f.close()
  20. x_train = x_train.reshape(60000, 784).astype('float32')
  21. x_test = x_test.reshape(10000, 784).astype('float32')
  22. x_train /= 255
  23. x_test /= 255
  24. print(x_train.shape[0], 'train samples')
  25. print(x_test.shape[0], 'test samples')
  26. # convert class vectors to binary class matrices
  27. # label为0~9共10个类别,keras要求格式为binary class matrices
  28. y_train = keras.utils.to_categorical(y_train, num_classes)
  29. y_test = keras.utils.to_categorical(y_test, num_classes)
  30. # 全连接模型
  31. model = Sequential()
  32. model.add(Dense(512, activation='relu', input_shape=(784,)))
  33. model.add(Dropout(0.2))
  34. model.add(Dense(512, activation='relu'))
  35. model.add(Dropout(0.2))
  36. model.add(Dense(num_classes, activation='softmax'))
  37. model.summary()
  38. #损失函数使用交叉熵
  39. model.compile(loss='categorical_crossentropy',
  40. optimizer=RMSprop(),
  41. metrics=['accuracy'])
  42. #模型估计
  43. model.fit(x_train, y_train,
  44. batch_size=batch_size,
  45. epochs=epochs,
  46. verbose=1,
  47. validation_data=(x_test, y_test))
  48. score = model.evaluate(x_test, y_test, verbose=0)
  49. print('Total loss on Test Set:', score[0])
  50. print('Accuracy of Testing Set:', score[1])
  51. #预测
  52. result = model.predict_classes(x_test)
  53. correct_indices = np.nonzero(result == y_test)[0]
  54. incorrect_indices = np.nonzero(result != y_test)[0]
  55. plt.figure()
  56. for i, correct in enumerate(correct_indices[:9]):
  57. plt.subplot(3,3,i+1)
  58. plt.imshow(x_test[correct].reshape(28,28), cmap='gray', interpolation='none')
  59. plt.title("Predicted {}, Class {}".format(result[correct], y_test[correct]))
  60. plt.figure()
  61. for i, incorrect in enumerate(incorrect_indices[:9]):
  62. plt.subplot(3,3,i+1)
  63. plt.imshow(x_test[incorrect].reshape(28,28), cmap='gray', interpolation='none')
  64. plt.title("Predicted {}, Class {}".format(result[incorrect], y_test[incorrect]))
  65. plt.show()

上面程序中,我们可以查看一些训练集的例子。如下图所示:

![这里写图片描述][Image 1]

训练结果为:

![这里写图片描述][Image 1]

关于全连接的理解,可以参考李宏毅的ppt。

![这里写图片描述][Image 1]

损失函数通常使用的有以下两种。

![这里写图片描述][Image 1]

对应的程序为:

  1. model.compile(loss='mse',
  2. optimizer=RMSprop(),
  3. metrics=['accuracy'])
  4. model.compile(loss='categorical_crossentropy',
  5. optimizer=RMSprop(),
  6. metrics=['accuracy'])

同时,模型的激活函数也有其他的,如ReLU,sigmoid等。对应的程序调整为:

  1. model.add(Dense(num_classes, activation='relu'))
  2. model.add(Dense(num_classes, activation='sigmoid'))

优化方式也可以调整为其他的,如Adam()或者SGD()等,对应的程序可以调整为:

  1. model.compile(loss='categorical_crossentropy',
  2. optimizer=Adam(),
  3. metrics=['accuracy'])
  4. model.compile(loss='categorical_crossentropy',
  5. optimizer=SGD(lr=0.1),
  6. metrics=['accuracy'])

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,354人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数字识别

    前面的博客介绍过[神经网络结构][Link 1]以及相关的[损失函数][Link 2],在这里我们通过一个简单的神经网络实现一个机器学习问题:识别手写数字图像。 和求解机器