tensorflow读取csv文件并生成数据集

# 利用fetch_california_housing生成CSV文件,并用tensorflow读取csv文件
# 第一步,生成CSCV文件
import tensorflow as tf
import keras
from sklearn.datasets import fetch_california_housing
import pandas as pd
import numpy as np
import os
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 生成CSV文件
housing = fetch_california_housing()
x_train_valid, x_test, y_train_valid, y_test = train_test_split(housing.data, housing.target, random_state=7)
x_train, x_valid, y_train, y_valid = train_test_split(x_train_valid, y_train_valid)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_valid = scaler.transform(x_valid)
x_test = scaler.transform(x_test)
print(x_train.shape)
print(x_valid.shape)
print(x_test.shape)

output_dir = './csv_data'
if not os.path.exists(output_dir):
    os.mkdir(output_dir)


def build_csv_file(output_dir, data, num_classes, pre_name, header=None):
    file_names = []
    path_format = os.path.join(output_dir, '{}_{:02d}.csv')
    for i, row_index in enumerate(np.array_split(
            np.arange(len(data)), num_classes)):
        file_name = path_format.format(pre_name, i)
        file_names.append(file_name)
        with open(file_name, 'w', encoding='utf-8') as f:
            if header:
                f.write(header + '\n')
            for row in row_index:
                f.write(','.join([str(col) for col in data[row]]))
                f.write('\n')
    return file_names


train_data = np.c_[x_train, y_train]
valid_data = np.c_[x_valid, y_valid]
test_data = np.c_[x_test, y_test]
header = housing.feature_names + ['price']
header = ','.join(header)
train_file_names = build_csv_file(output_dir, train_data, 10, 'train', header)
valid_file_names = build_csv_file(output_dir, valid_data, 10, 'valid', header)
test_file_names = build_csv_file(output_dir, test_data, 10, 'test', header)
print(train_file_names)
print(valid_file_names)
print(test_file_names)
# tensorflow读取CSV文件,
# 第一步,通过tf.data.Dataset.list_files创建文件名file_dataset
# 第二步,file_dataset.interleave()读取文件内容, tf.data.TextLineDataset
# 第三步,对文件内容进行解析 tf.io.decode_csv
import tensorflow as tf
import pandas as pd
import numpy as np
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense, Conv2D, MaxPool2D, Flatten, BatchNormalization, AlphaDropout

# 读取CSV文件
train_file_names = ['./csv_data\\train_00.csv', './csv_data\\train_01.csv', './csv_data\\train_02.csv',
                    './csv_data\\train_03.csv', './csv_data\\train_04.csv', './csv_data\\train_05.csv',
                    './csv_data\\train_06.csv', './csv_data\\train_07.csv', './csv_data\\train_08.csv',
                    './csv_data\\train_09.csv']
valid_file_names = ['./csv_data\\valid_00.csv', './csv_data\\valid_01.csv', './csv_data\\valid_02.csv',
                    './csv_data\\valid_03.csv', './csv_data\\valid_04.csv', './csv_data\\valid_05.csv',
                    './csv_data\\valid_06.csv', './csv_data\\valid_07.csv', './csv_data\\valid_08.csv',
                    './csv_data\\valid_09.csv']
test_file_names = ['./csv_data\\test_00.csv', './csv_data\\test_01.csv', './csv_data\\test_02.csv',
                   './csv_data\\test_03.csv', './csv_data\\test_04.csv', './csv_data\\test_05.csv',
                   './csv_data\\test_06.csv', './csv_data\\test_07.csv', './csv_data\\test_08.csv',
                   './csv_data\\test_09.csv']

# # 第一步,生成列表文件名dataset
# train_file_dataset = tf.data.Dataset.list_files(train_file_names)
# valid_file_dataset = tf.data.Dataset.list_files(valid_file_names)
# test_file_dataset = tf.data.Dataset.list_files(test_file_names)
#
# # 第二步,利用列表文件名dataset对每一个文件内容进行读取
# train_dataset = train_file_dataset.interleave(
#     lambda file_name: tf.data.TextLineDataset(file_name).skip(1),
#     cycle_length=5
# )
# valid_dataset = train_file_dataset.interleave(
#     lambda file_name: tf.data.TextLineDataset(file_name).skip(1),
#     cycle_length=5
# )
# test_dataset = test_file_dataset.interleave(
#     lambda file_name: tf.data.TextLineDataset(file_name).skip(1),
#     cycle_length=5
# )


# 第三步,对读取的文件内容进行解析
def parse_csv_line(line, n_fields=9):
    record = [tf.constant(np.nan)] * n_fields
    new_line = tf.io.decode_csv(line, record_defaults=record)
    x = new_line[: -1]
    y = new_line[-1:]
    return tf.stack(x, axis=0), tf.stack(y, axis=0)


# 第四步,对上述操作进行整合
def csv_dataset_reader(file_names, n_fields=9, epochs=20, shuffle=True):
    file_dataset = tf.data.Dataset.list_files(file_names)
    dataset = file_dataset.interleave(
        lambda file_name: tf.data.TextLineDataset(file_name).skip(1),
        cycle_length=5
    )
    if shuffle:
        dataset = dataset.shuffle(10000)
    dataset = dataset.repeat(epochs)
    dataset = dataset.map(parse_csv_line, num_parallel_calls=5)
    dataset = dataset.batch(batch_size=32).prefetch(32)
    return dataset


train_dataset = csv_dataset_reader(train_file_names)
valid_dataset = csv_dataset_reader(valid_file_names)
test_dataset = csv_dataset_reader(test_file_names)
x, y = next(iter(train_dataset))
print(x.shape)
print(y.shape)


def build_cnn_net():
    input_layer = keras.layers.Input(shape=(8, ), dtype=tf.float32)
    x = Dense(32, activation='relu')(input_layer)
    # x = Dense(128, activation='relu')(x)
    # x = Dense(32, activation='relu')(x)
    x = Dense(1)(x)
    model = tf.keras.models.Model(inputs=input_layer, outputs=x)
    return model


def draw_curve(history):
    pd.DataFrame(history.history).plot()
    plt.gca().set_ylim(0, 1)
    plt.grid(True)
    plt.show()


model = build_cnn_net()
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
history = model.fit(train_dataset, steps_per_epoch=11610 // 32, validation_data=valid_dataset, validation_steps=3870 // 32, epochs=10)
draw_curve(history)
model.evaluate(test_dataset, steps=5160 // 32)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TensorFlow中的数据生成器通常使用`tf.data.Dataset` API来实现。这个API可以接受多种输入数据格式,例如numpy数组、Pandas数据帧、CSV文件等,并支持数据变换和批处理等操作。 下面是一个简单的示例,演示如何使用`tf.data.Dataset` API创建一个从numpy数组生成数据生成器: ```python import tensorflow as tf import numpy as np # 创建一个numpy数组 data = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) # 使用from_tensor_slices方法创建数据集 dataset = tf.data.Dataset.from_tensor_slices(data) # 对数据集进行批处理 batch_size = 2 dataset = dataset.batch(batch_size) # 创建一个迭代器并获取数据 iterator = dataset.make_one_shot_iterator() next_element = iterator.get_next() with tf.Session() as sess: try: while True: batch_data = sess.run(next_element) print(batch_data) except tf.errors.OutOfRangeError: print("End of dataset") ``` 该示例创建了一个包含4个样本的numpy数组,并使用`tf.data.Dataset.from_tensor_slices()`方法将其转换为数据集。然后,它使用`batch()`方法对数据集进行批处理,以便读取一批数据。最后,它创建了一个迭代器并使用`get_next()`方法获取下一个元素。在会话中,它迭代数据集并打印每个批次的数据。 ### 回答2: TensorFlow数据生成器是一种用于生成训练和测试数据的工具,它可以帮助我们有效地加载和处理大型数据集。通过使用TensorFlow数据生成器,我们可以在训练期间动态地生成数据,从而减少内存的使用并提高数据处理的效率。 TensorFlow数据生成器可以处理多种数据类型,包括图像、文本、语音等,因此在各种机器学习任务中都非常有用。它对于大规模数据是特别适用的,因为它可以将数据切分成小批次,并且可以异步地读取和处理数据,从而提高训练速度。 使用TensorFlow数据生成器的步骤如下: 1. 准备数据集:将数据集准备好,可以是图片文件、文本文件或其他形式的数据。 2. 定义数据生成器:使用TensorFlow的数据生成器API来定义自己的数据生成器函数,该函数负责从数据集中读取和处理数据,并将它们转换成TensorFlow可以处理的格式。 3. 构建数据管道:使用TensorFlow的数据生成器API来构建数据管道,该管道负责将生成数据提供给模型进行训练或测试。可以通过设置参数来控制数据的批次大小、并行性等。 4. 迭代训练数据:使用TensorFlow的迭代器API来迭代数据生成生成数据,并将其提供给模型进行训练。在每一次迭代中,都会从数据生成器中获取一个数据批次,然后进行训练。 总而言之,TensorFlow数据生成器是一个强大且灵活的工具,可以帮助我们高效地处理大型数据集,并在训练过程中动态地生成数据。它能够提高训练效率,并减少内存的使用,使我们能够更好地应对各种机器学习任务。 ### 回答3: TensorFlow数据生成器是一种用于生成数据集的方法,它可以在训练模型时动态地产生数据数据生成器常用于处理大规模数据集或无限数据流的情况下。 数据生成器通常由一个函数或一个类实现,它可以按需生成数据并返回给模型。它可以在每个训练步骤中生成新的批次数据,以支持训练过程中的数据随机性和变化性。 生成器函数通常使用yield关键字,它可以暂停函数的执行并返回一个生成数据批次。在下一次调用生成器函数时,它会从上一次的暂停点继续执行,从而生成下一个批次的数据。 在TensorFlow中使用生成器可以使用tf.data.Dataset.from_generator函数,该函数接受一个生成器函数作为参数,并返回一个可以迭代的数据集。通过将生成器函数传递给from_generator,我们可以方便地生成包含指定数量或无限数量训练样本的数据集。 使用生成器可以大大节省内存和计算资源,尤其对于大规模数据集或需要动态生成数据的情况下。此外,生成器还可以通过使用多线程或异步操作来提高数据生成的效率。 总之,TensorFlow数据生成器是一种方便、高效的数据处理方法,它可以根据需要生成数据并提供给模型进行训练,同时还可以节省内存和计算资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值