广播错误 HDF5:无法广播 (3, 2048, 1, 1) -> (4, 2048, 1, 1)
Broadcast error HDF5: Can't broadcast (3, 2048, 1, 1) -> (4, 2048, 1, 1)
我收到以下错误:
类型错误:无法广播 (3, 2048, 1, 1) -> (4, 2048, 1, 1)
我正在提取特征并将它们放入 hdf5 数据集中,如下所示:
array_40 = hdf5_file.create_dataset(
f'{phase}_40x_arrays', shape, maxshape=(None, args.batch_size, 2048, 1, 1))
In (None, args.batch_size, 2048, 1, 1),由于数据集大小的未知性质,指定了None。 args.batch_size在本例中为4,2048,1和1是提取的特征数量及其空间维度。
形状定义为:
shape = (dataset_length, args.batch_size, 2048, 1, 1)
但是,我不确定我可以用 args.batch_size 做什么错误:
ValueError:块元组中的值非法
编辑:是的,您绝对是对的。我正在尝试增量写入 hdf5 数据集。我在下面展示了更多代码。我正在提取特征并将它们逐步存储到 hdf5 数据集中。尽管批处理大小为 4,但理想的做法是将批处理中的每个项目保存为自己的 instance/row.
shape = (dataset_length, 2048, 1, 1)
all_shape = (dataset_length, 6144, 1, 1)
labels_shape = (dataset_length)
batch_shape = (1,)
path = args.HDF5_dataset + f'{phase}.hdf5'
#hdf5_file = h5py.File(path, mode='w')
with h5py.File(path, mode='a') as hdf5_file:
array_40 = hdf5_file.create_dataset(
f'{phase}_40x_arrays', shape, maxshape=(None, 2048, 1, 1)
)
array_labels = hdf5_file.create_dataset(
f'{phase}_labels', labels_shape, maxshape=(None), dtype=string_type
)
array_batch_idx = hdf5_file.create_dataset(
f'{phase}_batch_idx', data=np.array([-1, ])
)
hdf5_file.close()
# either new or checkpionted file exists
# load file and create references to exisitng h5 datasets
with h5py.File(path, mode='r+') as hdf5_file:
array_40 = hdf5_file[f'{phase}_40x_arrays']
array_labels = hdf5_file[f'{phase}_labels']
array_batch_idx = hdf5_file[f'{phase}_batch_idx']
batch_idx = int(array_batch_idx[0]+1)
print("Batch ID is restarting from {}".format(batch_idx))
dataloaders_dict = torch.utils.data.DataLoader(datasets_dict, batch_size=args.batch_size, sampler=SequentialSampler2(
datasets_dict, batch_idx, args.batch_size),drop_last=True, num_workers=args.num_workers, shuffle=False) # make sure shuffling is false for sampler to work and incase you restart
for i, (inputs40x, paths40x, labels) in enumerate(dataloaders_dict):
print(f'Batch ID: {batch_idx}')
inputs40x = inputs40x.to(device)
labels = labels.to(device)
paths = paths40x
x40 = resnet(inputs40x)
# torch.Size([1, 2048, 1, 1]) batch, feats, 1l, 1l
array_40[...] = x40.cpu()
array_labels[batch_idx, ...] = labels[:].cpu()
array_batch_idx[:,...] = batch_idx
batch_idx +=1
hdf5_file.flush()
我认为您对 maxshape=()
参数的使用感到困惑。它在每个维度中设置最大分配数据集大小。第一个数据集维度在创建时设置为 dataset_length
,maxshape[0]=None
允许大小无限增长。创建时第二个数据集维度的大小为 args.batch_size
。您为 maxshape
指定了相同的大小,因此无法增加此维度。
我对你的例子有点困惑。听起来您正在尝试将数据增量写入 args.batch_size
的 rows/instances 中的数据集。你的例子有 51 rows/instances 条数据,你想分批写入 args.batch_size=4
。有 51 行,您可以写前 48 行(0-3、4-7...44-47),然后坚持剩下的 3 行。您不能通过添加一个计数器(称之为 nrows_left
)并将批量大小参数更改为 min(args.batch_size, rows_left)
来解决这个问题吗?对我来说似乎是最简单的解决方案。
没有更多信息,我无法编写完整的示例。
我将尝试在下面展示我的意思:
# args.batch_size = 4
shape = (dataset_length, 2048, 1, 1)
array_40 = hdf5_file.create_dataset(
f'{phase}_40x_arrays', shape, maxshape=(None, 2048, 1, 1))
nrows_left= dataset_length
rcnt = 0
loopcnt = dataset_length/args.batch_size
if dataset_length%args.batch_size != 0:
loopcnt += 1
for loop in range(loopcnt) :
nload = min(nrows_left, args.batch_size)
array_40[rcnt :row+nload] = img_data[rcnt:row+nload ]
rcnt += nload
nrows_left -= nload
我收到以下错误:
类型错误:无法广播 (3, 2048, 1, 1) -> (4, 2048, 1, 1)
我正在提取特征并将它们放入 hdf5 数据集中,如下所示:
array_40 = hdf5_file.create_dataset(
f'{phase}_40x_arrays', shape, maxshape=(None, args.batch_size, 2048, 1, 1))
In (None, args.batch_size, 2048, 1, 1),由于数据集大小的未知性质,指定了None。 args.batch_size在本例中为4,2048,1和1是提取的特征数量及其空间维度。
形状定义为:
shape = (dataset_length, args.batch_size, 2048, 1, 1)
但是,我不确定我可以用 args.batch_size 做什么错误:
ValueError:块元组中的值非法
编辑:是的,您绝对是对的。我正在尝试增量写入 hdf5 数据集。我在下面展示了更多代码。我正在提取特征并将它们逐步存储到 hdf5 数据集中。尽管批处理大小为 4,但理想的做法是将批处理中的每个项目保存为自己的 instance/row.
shape = (dataset_length, 2048, 1, 1)
all_shape = (dataset_length, 6144, 1, 1)
labels_shape = (dataset_length)
batch_shape = (1,)
path = args.HDF5_dataset + f'{phase}.hdf5'
#hdf5_file = h5py.File(path, mode='w')
with h5py.File(path, mode='a') as hdf5_file:
array_40 = hdf5_file.create_dataset(
f'{phase}_40x_arrays', shape, maxshape=(None, 2048, 1, 1)
)
array_labels = hdf5_file.create_dataset(
f'{phase}_labels', labels_shape, maxshape=(None), dtype=string_type
)
array_batch_idx = hdf5_file.create_dataset(
f'{phase}_batch_idx', data=np.array([-1, ])
)
hdf5_file.close()
# either new or checkpionted file exists
# load file and create references to exisitng h5 datasets
with h5py.File(path, mode='r+') as hdf5_file:
array_40 = hdf5_file[f'{phase}_40x_arrays']
array_labels = hdf5_file[f'{phase}_labels']
array_batch_idx = hdf5_file[f'{phase}_batch_idx']
batch_idx = int(array_batch_idx[0]+1)
print("Batch ID is restarting from {}".format(batch_idx))
dataloaders_dict = torch.utils.data.DataLoader(datasets_dict, batch_size=args.batch_size, sampler=SequentialSampler2(
datasets_dict, batch_idx, args.batch_size),drop_last=True, num_workers=args.num_workers, shuffle=False) # make sure shuffling is false for sampler to work and incase you restart
for i, (inputs40x, paths40x, labels) in enumerate(dataloaders_dict):
print(f'Batch ID: {batch_idx}')
inputs40x = inputs40x.to(device)
labels = labels.to(device)
paths = paths40x
x40 = resnet(inputs40x)
# torch.Size([1, 2048, 1, 1]) batch, feats, 1l, 1l
array_40[...] = x40.cpu()
array_labels[batch_idx, ...] = labels[:].cpu()
array_batch_idx[:,...] = batch_idx
batch_idx +=1
hdf5_file.flush()
我认为您对 maxshape=()
参数的使用感到困惑。它在每个维度中设置最大分配数据集大小。第一个数据集维度在创建时设置为 dataset_length
,maxshape[0]=None
允许大小无限增长。创建时第二个数据集维度的大小为 args.batch_size
。您为 maxshape
指定了相同的大小,因此无法增加此维度。
我对你的例子有点困惑。听起来您正在尝试将数据增量写入 args.batch_size
的 rows/instances 中的数据集。你的例子有 51 rows/instances 条数据,你想分批写入 args.batch_size=4
。有 51 行,您可以写前 48 行(0-3、4-7...44-47),然后坚持剩下的 3 行。您不能通过添加一个计数器(称之为 nrows_left
)并将批量大小参数更改为 min(args.batch_size, rows_left)
来解决这个问题吗?对我来说似乎是最简单的解决方案。
没有更多信息,我无法编写完整的示例。
我将尝试在下面展示我的意思:
# args.batch_size = 4
shape = (dataset_length, 2048, 1, 1)
array_40 = hdf5_file.create_dataset(
f'{phase}_40x_arrays', shape, maxshape=(None, 2048, 1, 1))
nrows_left= dataset_length
rcnt = 0
loopcnt = dataset_length/args.batch_size
if dataset_length%args.batch_size != 0:
loopcnt += 1
for loop in range(loopcnt) :
nload = min(nrows_left, args.batch_size)
array_40[rcnt :row+nload] = img_data[rcnt:row+nload ]
rcnt += nload
nrows_left -= nload