[英]How can I load this dataset to Keras or TF?
我是Keras
和TF
新手。 我需要加载此数据集: 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数组。
但是我看过的每个教程都使用内置方法。
如果您以前没有尝试过,我建议您使用熊猫。
每个csv文件都需要标头,因为默认情况下该文件没有标头,因此您可以手动添加。 通过在文件顶部插入alphabet, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
。 注意:您应该使用实际的功能名称替换数字,以提高可读性。
import pandas as pd
读取文件:
dataframe = pd.read_csv("example.csv")
由于您说的第一列是标签,因此可以将其从数据框中删除。
y = dataframe["alphabet"]
剩余的列是您可以使用values
属性检索的输入,该属性返回一个numpy数组。
x = dataframe.drop("alphabet", 1).values
#沿着列下降
现在,您可以使用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)
现在,由于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])
现在终于转换为一种热门格式:
from keras.utils import to_categorical y = to_categorical(y, len(mapping))
对于小型数据集(如您的情况),我只是从文件中解析并使用迭代器。 这是您的数据的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.