【问题标题】:Feeding integer CSV data to a Keras Dense first layer in sequential model将整数 CSV 数据馈送到顺序模型中的 Keras Dense 第一层
【发布时间】:2020-08-19 18:57:33
【问题描述】:

CSV Datasets 的文档没有展示如何将 CSV 数据集用于任何实际操作,例如使用数据训练神经网络。谁能提供一个简单的示例来演示如何做到这一点,至少要清楚地说明数据形状和类型问题,并且最好考虑批处理、改组、在 epoch 上重复?

例如,我有一个包含M 行的 CSV 文件,每行是一个整数类标签,后跟 N 整数,我希望使用旧式 3 层神经网络预测类标签H隐藏神经元:

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

对于我的数据,M > 50000N > 200。我尝试使用以下方法创建我的数据集:

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

但是...这会导致数据集和模型之间的兼容性问题...但尚不清楚这些兼容性问题在哪里 - 它们是在输入形状、整数(非浮点)数据中,还是在其他地方?

【问题讨论】:

  • 添加数据集的前几行。
  • 第一行:"Label,X1,X2,X3,X4,....,X205" 后续行:",,,,. .." 其中 0 是任意(随机)int,标签后面有 205 个。
  • 请不要使用语义,将实际文件内容以文本形式发布在帖子中。
  • 数据具有商业敏感性;问题并非特定于数据。选择 205 个随机整数。你知道你能做到:-)

标签: tensorflow keras tensorflow-datasets


【解决方案1】:

This question 可能会提供一些帮助...尽管答案大多与 Tensorflow V1.x 相关

此任务可能不需要 CSV 数据集。您指出的数据大小可能适合内存,tf.data.Dataset 可能会将您的数据包装得比有价值的功能更复杂。只要您的所有数据都是整数,您就可以在没有数据集的情况下执行此操作(如下所示)。

如果您坚持使用 CSV 数据集方法,请了解 CSV 有多种使用方式,以及加载它们的不同方法(例如,请参阅 herehere)。因为 CSV 可以有多种列类型(数值、布尔值、文本、分类等),所以第一步通常是以 面向列的 格式加载 CSV 数据。这提供了通过它们的标签访问列 - 对于预处理很有用。但是,您可能希望向模型提供数据行,因此从列转换为行可能是造成混淆的原因之一。在某些时候,您可能需要将整数数据转换为浮点数,但这可能是某些预处理的副作用。

只要您的 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 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-07-31
    • 2021-05-09
    相关资源
    最近更新 更多