如何从文件中将EMNIST字母导入Keras

时间:2019-07-15 20:35:52

标签: python tensorflow machine-learning keras mnist

我正在尝试将 EMNIST字母数据集导入到我创建的人工智能程序中(用python编写),但似乎无法正确执行。我应该如何将其导入以下程序?

...
# Import Statements
...


emnist = spio.loadmat("EMNIST/emnist-letters.mat")
...

# The problems appear to originate below--I am trying to set these variables to the corresponding parts of the EMNIST dataset and cannot succeed

x_train = emnist["dataset"][0][0][0][0][0][0]
x_train = x_train.astype(np.float32)

y_train = emnist["dataset"][0][0][0][0][0][1]

x_test = emnist["dataset"][0][0][1][0][0][0]
x_test = x_test.astype(np.float32)

y_test = emnist["dataset"][0][0][1][0][0][1]

train_labels = y_train
test_labels = y_test

x_train /= 255
x_test /= 255

x_train = x_train.reshape(x_train.shape[0], 1, 28, 28, order="A")
x_test = x_test.reshape(x_test.shape[0], 1, 28, 28, order="A")

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# Does not work:
plt.imshow(x_train[54000][0], cmap='gray')
plt.show()

# Compilation and Fitting
...

我完全没有收到错误消息,但是收到了:

Traceback (most recent call last):
  File "OCIR_EMNIST.py", line 61, in <module>
    y_train = keras.utils.to_categorical(y_train, 10)
  File "/home/user/.local/lib/python3.7/site-packages/keras/utils/np_utils.py", line 34, in to_categorical
    categorical[np.arange(n), y] = 1
IndexError: index 23 is out of bounds for axis 1 with size 10
  

修正:MNIST数据集不包含此手写字母,因此不适合该项目。它只包含手写数字。

3 个答案:

答案 0 :(得分:0)

我对EMNIST数据集不熟悉,但是经过一番研究,我发现它与MNIST数据集直接匹配,发现at this link。由于它是相同的数据集,所以我建议仅使用MNIST,尽管我不知道您是否出于特定原因需要此数据集。对于keras,使用MNIST数据集很简单:

mnist = keras.datasets.mnist #loads in the data set
(x_train, y_train), (x_test, y_test) = mnist.load_data() #separates data for training/validation
x_train = x_train / 255.0
x_test = x_test  / 255.0

在通过您希望使用的任何机器学习方法发送数据点之前将其标准化。请注意,y_train和y_test只是标签。

希望这会有所帮助,您应该以更短/更轻松的方式获取相同的数据集。

编辑:由于您正在寻找要执行的字母数据库,而不仅仅是数字,因此,我建议您从this link获取数据集。 letter-recognition.data文件应该是可以使用的文件。它包含字母以及描述每个字母的16个特征向量。然后,您可以将其加载到一个csv文件中,并对数据进行分区以进行训练/验证,然后对其执行某种类型的ML(我已经使用此数据集完成了ANN)。请注意,您可能需要将下载的数据文件中的字母更改为符合您的基本情况的数值(A = 0,B = 1,...,Z = 25)。

答案 1 :(得分:0)

MNIST是学习机器学习和数据挖掘的经典案例。这是当我比较CNN,SVR和决策树的性能时用于加载MNIST的代码。

def load_mnist(path, kind='train'):
import os
import gzip
import numpy as np


"""Load MNIST data from `path`"""
labels_path = os.path.join(path,
                           '%s-labels-idx1-ubyte.gz'
                           % kind)
images_path = os.path.join(path,
                           '%s-images-idx3-ubyte.gz'
                           % kind)

with gzip.open(labels_path, 'rb') as lbpath:
    labels = np.frombuffer(lbpath.read(), dtype=np.uint8,
                           offset=8)

with gzip.open(images_path, 'rb') as imgpath:
    images = np.frombuffer(imgpath.read(), dtype=np.uint8,
                           offset=16).reshape(len(labels), 784)

return images, labels

请注意,请注意第一行的缩进,该缩进应向后四个空格。使用此数据集读取器,您可以仅使用“ load_mnist”函数来加载数据集,并使代码更简洁。

或者您可以仅使用keras数据集进行加载。有关详细信息,请参阅Keras文档。

from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

我希望这会有所帮助。

答案 2 :(得分:0)

也许您应该看看:https://github.com/christianversloot/extra_keras_datasets

这不是一个流行的库(在撰写本文时),并且我还没有尝试过,但是,它似乎易于使用并且有据可查。

要向其加载EMNIST数据集,就可以像对 Keras 进行操作一样:

from extra_keras_datasets import emnist
(input_train, target_train), (input_test, target_test) = emnist.load_data(type='balanced')