两类ValueError含义解析及RNN代码报错解决方案咨询
问题1:
ValueError: cannot reshape array of size 279936 into shape (529,529) 含义解释 这个报错的核心原因是numpy的reshape操作要求数组总元素数必须和目标形状的总元素数完全相等:
- 当前数组的总元素数是279936
- 目标形状
(529,529)的总元素数是529*529=279841
两个数值不匹配,所以无法完成形状转换。解决思路要么调整目标形状,让其总元素数等于279936;要么修改数组的预处理逻辑(比如裁剪、补全、缩放),让数组元素数匹配目标形状的总元素数。
问题2:代码报错
ValueError: could not broadcast input array from shape (4096,4374) into shape (64,64) 的解决方法 这个报错是因为你定义的dataset每个样本是(64,64)的形状,但代码里错误地将图像数组强制reshape成了(4096,4374),两者元素数差距极大,无法完成赋值。具体修正步骤如下:
先确认图像缩小后的实际尺寸:
在img.reduce(8)后添加一行print(img.size),查看缩小后的图像宽高是否为64x64。如果不是,要么调整缩小比例,要么用img.resize((64,64))强制将图像缩放到64x64,确保和dataset的样本形状匹配。修正数组转换与reshape逻辑:
img.convert("1")得到的二值图经img_to_array转换后,channels_last模式下形状为(height, width, 1)(单通道)。你需要删除错误的x = x.reshape((4096, 4374)),替换为去掉通道维度的操作:x = x.squeeze(axis=-1) # 去掉最后一个通道维度,得到(h, w)形状或者如果确认尺寸是64x64,直接用
x = x.reshape((64,64))也可以。调整归一化逻辑:
二值图的像素值通常是0和255,当前(x - 128.0)/128.0的归一化逻辑会导致值在-1到0.992之间,不太合理。建议改成:x = (x - 127.5) / 127.5 # 归一化到-1到1区间 # 或者简单归一化到0-1区间:x = x / 255.0修正后的完整循环代码示例:
i = 0 counter = 0 for _file in train_files: if(counter <= 34000): img = Image.open(folder + "/" + _file) img = img.reduce(8) print(img.size) # 确认缩小后的尺寸 img = img.convert("1") x = img_to_array(img, data_format = "channels_last") x = x.squeeze(axis=-1) # 去掉单通道维度 x = (x - 127.5) / 127.5 # 归一化 dataset[i] = x i += 1 counter += 1 if i % 1000 == 0: print("%d images to array" % i)
内容的提问来源于stack exchange,提问作者SaviorTech
相关产品推荐
相关产品推荐

