Как я могу загрузить этот набор данных в Keras или TF? - PullRequest
0 голосов
/ 14 января 2019

Я новичок в Keras и TF. Мне нужно загрузить этот набор данных: https://archive.ics.uci.edu/ml/machine-learning-databases/letter-recognition/letter-recognition.data

Но в каждом уроке, который я видел, используются встроенные методы с загрузкой из набора данных MNIST. Я придумал сменить букву (ярлык) на int(like a->1,b->2,c->3 etc.) Но как разделить это на 2 набора (x-in, y-out)?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Но в каждом уроке, который я видел, используются встроенные методы.

Я бы порекомендовал использовать панд, если вы раньше не пробовали.

  1. Сначала скопируйте данные и сохраните их в виде файла csv (example.csv).
  2. Каждый CSV-файл требует заголовка, так как этот файл по умолчанию не может быть добавлен вручную. Вставив alphabet, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 в верхней части файла. Примечание. Для большей удобочитаемости номера следует заменить реальными именами элементов.

  3. import pandas as pd

  4. Прочитать файл:

    dataframe = pd.read_csv("example.csv")

  5. Так как вы сказали, что первый столбец - это метка, которую вы можете удалить из фрейма данных.

    y = dataframe["alphabet"]

  6. Остальные столбцы - это входные данные, которые вы можете получить с помощью атрибута values, который возвращает пустой массив.

    x = dataframe.drop("alphabet", 1).values # Вставить вдоль столбца

  7. Теперь вы можете разделить набор данных с помощью train_test_split в sklearn.model_selection или использовать индексы Python.

    test_size = 0.1
    train_samples = int(X_train.shape[0]*(1 - test_size))
    X_train, X_test, Y_train, Y_test = x[:train_samples],x[train_samples: ], y[:train_samples], y[train_samples: ]
    

    или

    from sklearn.model_selection import train_test_split
    X_train, X_test, Y_train, Y_test = train_test_split(x, y,
     test_size=test_size)
    
  8. Теперь, поскольку у - массив символов, нам нужно сопоставить его с индексами.

    mapping = {}
    classes = set(y)
    for c in classes:
        if c not in mapping:
            mapping[c] = len(mapping)
    y = np.array([mapping[i] for i in y])
    
  9. Теперь, наконец, конвертируем в один горячий формат:

    from keras.utils import to_categorical
    y = to_categorical(y, len(mapping))
    
  10. Обычно это формат набора данных MNIST, который хранится в большинстве библиотек. В дальнейшем вы можете нормализовать данные в соответствии с вашими потребностями.
0 голосов
/ 14 января 2019

Для небольших наборов данных (как в вашем случае) я бы просто проанализировал файл и использовал итератор. Вот пример TensorFlow для ваших данных:

import tensorflow as tf
import numpy as np
from sklearn import preprocessing
from sklearn.model_selection import train_test_split

with open('data') as fo:
    labels_and_data = [x.split(',') for x in fo.read().split('\n')]

labels = [d[0] for d in labels_and_data]
data = np.asarray([np.asarray(d[1:], dtype=np.float) for d in labels_and_data])

# string labels to integers
encoder = preprocessing.LabelEncoder()
encoder.fit(labels)
encoded_labels = encoder.transform(labels)

# split data and create iterators
x_train, x_test, y_train, y_test = train_test_split(data, encoded_labels, test_size=0.2)
train_data = tf.data.Dataset.from_tensor_slices({'x': x_train, 'y': y_train}).batch(10)
test_data = tf.data.Dataset.from_tensor_slices({'x': x_test, 'y': y_test}).batch(10)
train_iter = train_data.make_initializable_iterator()
test_iter = test_data.make_initializable_iterator()

# define your model here
X = tf.placeholder(shape=(), dtype=tf.float32)
y = tf.placeholder(shape=(), dtype=tf.int32)
n_epochs = 2

# train
with tf.Session() as sess:
    # sess.run(tf.global_variables_initializer())
    sess.run([train_iter.initializer, test_iter.initializer])
    next_train_batch = train_iter.get_next()
    next_test_batch = test_iter.get_next()
    for epoch in range(n_epochs):
        while True:
            try:
                batch = sess.run(next_train_batch)
                print(batch['x'])
                print(batch['y'])
                # feed_dict = {X: batch['x'], y: batch['y']}
                # evaluated_ops = sess.run(your ops here...,
                #                          feed_dict=feed_dict)
            except tf.errors.OutOfRangeError:
                sess.run(train_iter.initializer)
                break
0 голосов
/ 14 января 2019

Вам нужно разобрать файл самостоятельно.

Для этого вы делаете что-то вроде этого:

x_t = []
y_t = []
char_to_int = {}
int_to_char = {}
for i in x.split("\n"):
    print(i)
    y_t.append(i[0])
    x_t.append(i.split(",")[1:])

for i,j in enumerate(sorted(set(y_t))):
    char_to_int[j]=i 
for i,j in enumerate(sorted(set(y_t))):
    int_to_char[i]=j 
y_t = [char_to_int[i] for i in y_t]

По сути, вы перебираете файл и сохраняете целые числа как значения x. Для значений у вы сначала берете букву. Но нейронная сеть не поймет этого, поэтому вам нужно создать словарь с отображением целых чисел в буквы. Поэтому в конце мы снова анализируем y, чтобы в итоге получить значения y.

Теперь вам нужно только сделать из этого пустые массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...