| 
 今天在看网上的视频学习深度学习的时候,用到了CIFAR-10数据集。当我兴高采烈的运行代码时,却发现了一些错误:  
  
 
 - 1
  
 - 2
  
 - 3
  
 - 4
  
 - 5
  
 - 6
  
 - 7
  
 - 8
  
 - 9
  
 - 10
  
 - 11
  
 - 12
  
 - 13
  
 - 14
  
 - 15
  
 - 16
  
 - 17
  
 - 18
  
 - 19
  
 - 20
  
 - 21
  
 - 22
  
 - 23
  
 - 24
  
 - 25
  
 - 26
  
 - 27
  
 - 28
  
 - 29
  
 - 30
  
 - 31
  
 - 32
  
  
  错误代码如下:  
'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence  
 
  于是乎开始各种搜索问题,问大佬,网上的答案都是类似:  
   
 
   
 
   
  然而并没有解决问题!还是错误的!(我大概搜索了一下午吧,都是上面的答案)  
  哇,就当我很绝望的时候,我终于发现了一个新奇的答案,抱着试一试的态度,尝试了一下:  
def load_CIFAR_batch(filename): """ 载入cifar数据集的一个batch """ with open(filename, 'rb') as f: datadict = p.load(f, encoding='latin1') X = datadict['data'] Y = datadict['labels'] X = X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float") Y = np.array(Y) return X, Y  
 
  竟然成功了,这里没有报错了!欣喜之余,我就很好奇,encoding=’latin1’到底是啥玩意呢,以前没有见过啊?于是,我搜索了一下,了解到:  
 
 Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。  
 因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。  
  
  还没等我高兴起来,运行后,又发现了一个问题:  
memory error  
 
  什么鬼?内存错误!哇,原来是数据大小的问题。  
X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")  
 
  这告诉我们每批数据都是10000 * 3 * 32 * 32,相当于超过3000万个浮点数。 float数据类型实际上与float64相同,意味着每个数字大小占8个字节。这意味着每个批次占用至少240 MB。你加载6这些(5训练+ 1测试)在总产量接近1.4 GB的数据。  
 for b in range(1, 2): f = os.path.join(ROOT, 'data_batch_%d' % (b,)) X, Y = load_CIFAR_batch(f) xs.append(X) ys.append(Y)  
 
  所以如有可能,如上代码所示只能一次运行一批。  
  到此为止,错误基本搞定,下面贴出正确代码:  
  
 
 - 1
  
 - 2
  
 - 3
  
 - 4
  
 - 5
  
 - 6
  
 - 7
  
 - 8
  
 - 9
  
 - 10
  
 - 11
  
 - 12
  
 - 13
  
 - 14
  
 - 15
  
 - 16
  
 - 17
  
 - 18
  
 - 19
  
 - 20
  
 - 21
  
 - 22
  
 - 23
  
 - 24
  
 - 25
  
 - 26
  
 - 27
  
 - 28
  
 - 29
  
 - 30
  
 - 31
  
 - 32
  
  
import numpy as np from julyedu.data_utils import load_CIFAR10 import matplotlib.pyplot as plt plt.rcParams['figure.figsize'] = (10.0, 8.0) plt.rcParams['image.interpolation'] = 'nearest' plt.rcParams['image.cmap'] = 'gray' 
 
   
 顺便看一下CIFAR-10数据组成:  
   
 
   
 
   
  
 
 |