繁体   English   中英

如何将该数据集加载到Keras或TF?

[英]How can I load this dataset to Keras or TF?

我是KerasTF新手。 我需要加载此数据集: https : //archive.ics.uci.edu/ml/machine-learning-databases/letter-recognition/letter-recognition.data

但是我见过的每个教程都使用内置方法从MNIST数据集中加载。 我想出了将letter(label)更改为int(like a->1,b->2,c->3 etc.)但是如何将其分成2组(x-in,y-out)?

您需要自己解析文件。

为此,您可以执行以下操作:

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的原因,所以我们最终得到y值。

现在,您只需要从中制作numpy数组。

但是我看过的每个教程都使用内置方法。

如果您以前没有尝试过,我建议您使用熊猫。

  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属性检索的输入,该属性返回一个numpy数组。

    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. 现在,由于y是numpy个字符数组,我们需要将其映射到索引。

     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数据集存储的格式。 此外,您可以根据需要标准化数据。

对于小型数据集(如您的情况),我只是从文件中解析并使用迭代器。 这是您的数据的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM