PyTable 表拆分
Posted
技术标签:
【中文标题】PyTable 表拆分【英文标题】:PyTable table split 【发布时间】:2021-12-29 00:22:23 【问题描述】:我有一个如下格式的 PyTable 表:
/neg/data.cols (Cols), 5 columns
data (Column(8909, 256, 256), ('<f4', (256, 256)))
filename (Column(8909,), |S100)
id (Column(8909,), uint32)
label (Column(8909,), uint8)
offset (Column(8909,), float64)
表格中有8909条数据和对应的标签。我想将此表拆分为机器学习的训练测试。假设将 80% 的行作为训练数据,20% 作为测试。
有什么实用功能可以帮助我做到这一点吗?
【问题讨论】:
【参考方案1】:将表拆分为训练数据集和测试数据集后,您想要的数据对象是什么?每组 1 个 NumPy 数组?还是 4 个数组:train_data、train_labels、test_data、test_labels? (或别的什么?)。
如果您使用的是 Keras,*** 上还有其他一些与加载批处理相关的答案。他们可能会有所帮助。我分享链接作为参考。阅读下面的答案,您想自己编写代码。
对于 Keras 批量加载:Keras: load images batch wise for large dataset 和 How to split dataset into K-fold without loading the whole dataset at once? 如果这没有帮助,请谷歌“keras fit_generator”获取一些教程。您需要编写一个 Python 生成器函数来从 H5 文件中读取和加载图像数组。
我的回答:
通常,您希望从表中读取随机行。下面的代码显示了如何使用 Table.read_coordinates()
函数来做到这一点。这是一个独立的示例,它创建一个与您的数据模式(相同的组和数据集布局)匹配的示例 HDF5 文件。它在创建数据后关闭文件,然后打开“只读”以访问数据。
读取过程首先创建 2 个随机且唯一的行号列表(test_list
和 train_list
),然后使用它们将行数据读取到如上所述的各种数组中。 “只读”部分应该“按原样”处理您的数据(只需更改文件名)。获得数组后,您可以传递它们来训练和测试您的模型。
import tables as tb
import numpy as np
import random
nrows = 8000
size = 100
ds_dt = np.dtype( [ ('data',(float,(size,size))), ('filename','S100'),
('id',int), ('label',int), ('offset',float) ] )
# Create sample data for use below
with tb.File('SO_70014301.h5','w') as h5f:
data_table = h5f.create_table('/neg','data',description=ds_dt,createparents=True)
for cnt in range(nrows):
arr = np.random.random(size*size).reshape(size,size)
data_list = [ (arr, str(f'filename_cnt+1:003.jpg'), cnt+1, cnt+1001, 10.*cnt), ]
data_table.append(data_list)
# read sample data and extract Table: '/neg/data' aka file.root.neg.data
with tb.File('SO_70014301.h5','r') as h5f:
data_table = h5f.root.neg.data
nrows = data_table.nrows
#create lists with row ids to extract test and training data
row_list = list(range(nrows))
test_list = sorted(random.sample(row_list, k=int(0.20*nrows)))
train_list = list(set(row_list) - set(test_list))
print(len(row_list),len(test_list),len(train_list))
#extract entire training dataset to np.recarray
train_arr = data_table.read_coordinates(train_list)
print(train_arr.shape)
print(train_arr.dtype)
#extract entire test dataset to np.recarray
test_arr = data_table.read_coordinates(test_list)
print(test_arr.shape)
print(test_arr.dtype)
# extract training data to array
train_data = data_table.read_coordinates(train_list,field='data')
# extract training labels to array
train_labs = data_table.read_coordinates(train_list,field='label')
print(train_data.shape, train_data.dtype)
print(train_labs.shape, train_labs.dtype)
# extract test data to array
test_data = data_table.read_coordinates(test_list,field='data')
# extract test labels to array
test_labs = data_table.read_coordinates(test_list,field='label')
print(test_data.shape, test_data.dtype)
print(test_labs.shape, test_labs.dtype)
【讨论】:
以上是关于PyTable 表拆分的主要内容,如果未能解决你的问题,请参考以下文章