您的位置:首页 > 其它

如何将cifar-10数据集的图片转化为227*227像素以供Alexnet训练

2018-10-09 18:00 771 查看

下载cifar-10数据集

官网地址:http://www.cs.toronto.edu/~kriz/cifar.html
这是从官网下载好的python版cifar-10数据集

加载cifar-10数据集

def load_file(cifar):
'''加载cifar数据集'''

import pickle
with open('D:\cifar-10-batches-py\\'+str(cifar), 'rb') as fo:
data = pickle.load(fo, encoding='latin1')
return data

# 这里加载了第一个data_batch
data = load_file('data_batch_1')
print(data.keys())
X = data['data']
Y = data['labels']
print(X.shape)
print(len(Y))

得到的结果是

dict_keys(['batch_label', 'labels', 'data', 'filenames'])
(10000, 3072)
10000

data是一个字典,包含了四个键:‘batch_label’, ‘labels’, ‘data’, ‘filenames’
将data的data键对应的值赋给X。
X就是[10000,3072]的矩阵,10000代表着一个batch含有10000张图片,3072=32x32x3,代表着32x32像素的RGB图片。
Y是一个长度10000的列表,值为0-9,分别代表不同的类别。

修改cifar-10图片的分辨率

def convert_cifar10_227pix(X):
'''
将cifar-10数据集的原始矩阵[10000,3072]转化为[10000,227,227,3]
用于Alexnet训练
X - 原始矩阵 shape = [10000, 3072]
m - 10000代表图片张数
n_H - 图片高度
n_W - 图片宽度
channel - RGB三色通道
'''

from PIL import Image
import numpy as np
X = np.reshape(X, (10000,3, 32, 32))  # 将图片转换成(m, channel,n_H,n_W)
X = X.transpose(0, 2, 3, 1)  # 转换成标准的矩阵(m, n_H,n_W, channel)
X_resized = np.zeros((10000,227,227,3))# 创建一个存储修改过图片分辨率的矩阵

for i in range(0,10000):
img = X[i]
img = Image.fromarray(img)
img = np.array(img.resize((227,227),Image.BICUBIC))# 修改分辨率,再转为array类
X_resized[i,:,:,:] = img

X_resized /= 255
return X_resized

运行以下代码

import matplotlib.pyplot as plt
X_resized = convert_cifar10_227pix(X)
X = np.reshape(X, (10000,3, 32, 32))
X = X.transpose(0, 2, 3, 1)
fig, axarr = plt.subplots(1, 2)
axarr[0].imshow(X[4])
axarr[1].imshow(X_resized[4])

效果如图,左边为原始的32x32像素图片,右边为转换后227x227像素图片

总结

其实通过这种方法,可以把图片转换为想要的任意像素大小,不过这种方法对内存的占用很大,要注意一次转换的图片不要太多,不然可能内存就爆了。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: