Подача целочисленных данных CSV на первый уровень Keras Dense в последовательной модели - PullRequest
0 голосов
/ 05 мая 2020

В документации для наборов данных CSV не хватает демонстрации того, как использовать набор данных CSV для чего-то практического, например, использования данных для обучения нейронной сети. Может ли кто-нибудь предоставить простой пример, демонстрирующий, как это сделать, с ясностью как минимум в отношении формы данных и проблем с типом и, желательно, с учетом пакетной обработки, перетасовки, повторения по эпохам?

Например, у меня есть CSV-файл из M строк, каждая строка представляет собой целочисленную метку класса, за которой следуют N целые числа, из которых я надеюсь предсказать метку класса, используя трехслойную нейронную сеть старого стиля с H скрытыми нейронами:

model = Sequential()
model.add(Dense(H, activation='relu', input_dim=N))
...
model.fit(train_ds, ...)

По моим данным, M > 50000 и N > 200. Я попытался создать свой набор данных, используя:

train_ds = tf.data.experimental.make_csv_dataset('mydata.csv`, batch_size=B)

Однако ... это приводит к проблемам совместимости между набором данных и моделью ... но неясно, где эти проблемы совместимости l ie - они во входной форме, в целочисленных (не с плавающей запятой) данных или где-то еще?

1 Ответ

0 голосов
/ 07 мая 2020

Этот вопрос может немного помочь ... хотя ответы в основном относятся к Tensorflow V1.x

Возможно, наборы данных CSV не требуются для этой задачи. Указанный вами размер данных, вероятно, уместится в памяти, а tf.data.Dataset может обернуть ваши данные более сложными, чем ценные функции. Вы можете сделать это без наборов данных (как показано ниже), если ВСЕ ваши данные являются целыми числами.

Если вы продолжаете использовать подход набора данных CSV, поймите, что есть много способов использования CSV и разные подходы к загрузке их (например, см. здесь и здесь ). Поскольку CSV-файлы могут иметь различные типы столбцов (числовые, логические, текстовые, категориальные и т. Д.), Первым шагом обычно является загрузка данных CSV в формате столбцов . Это обеспечивает доступ к столбцам через их метки - полезно для предварительной обработки. Однако вы, вероятно, захотите предоставить в модель строки данных, поэтому перевод столбцов в строки может быть источником путаницы. В какой-то момент вам, вероятно, потребуется преобразовать ваши целочисленные данные в float, но это может произойти как побочный эффект определенной предварительной обработки.

Пока ваши CSV-файлы содержат только целые числа, без пропущенных данных, и со строкой заголовка, вы можете сделать это без tf.data.Dataset, шаг за шагом следующим образом:

import numpy as np
from numpy import genfromtxt
import tensorflow as tf

train_data = genfromtxt('train set.csv', delimiter=',')
test_data = genfromtxt('test set.csv', delimiter=',')
train_data = np.delete(train_data, (0), axis=0)    # delete header row
test_data = np.delete(test_data, (0), axis=0)      # delete header row
train_labels = train_data[:,[0]]
test_labels = test_data[:,[0]]
train_labels = tf.keras.utils.to_categorical(train_labels)
# count labels used in training set; categorise test set on same basis
# even if test set only uses subset of categories learning in training
K = len(train_labels[ 0 ])
test_labels = tf.keras.utils.to_categorical(test_labels, K)
train_data = np.delete(train_data, (0), axis=1)    # delete label column
test_data = np.delete(test_data, (0), axis=1)      # delete label column
# Data will have been read in as float... but you may want scaling/normalization...
scale = lambda x: x/1000.0 - 500.0                 # change to suit
scale(train_data)
scale(test_data)

N_train = len(train_data[0])        # columns in training set
N_test = len(test_data[0])          # columns in test set
if N_train != N_test:
  print("Datasets have incompatible column counts: %d vs %d" % (N_train, N_test))
  exit()
M_train = len(train_data)           # rows in training set
M_test = len(test_data)             # rows in test set

print("Training data size: %d rows x %d columns" % (M_train, N_train))
print("Test set data size: %d rows x %d columns" % (M_test, N_test))
print("Training to predict %d classes" % (K))

model = Sequential()
model.add(Dense(H, activation='relu', input_dim=N_train))     # H not yet defined...
...
model.compile(...)
model.fit( train_data, train_labels, ... )    # see docs for shuffle, batch, etc
model.evaluate( test_data, test_labels )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...