神经网络训练图片数据集读取方法(二)——h5py(python)

神经网络训练图片数据集读取方法——h5py(python)

又学习另一种方法存储图片数据集——h5py

什么是h5py?

       h5py文件是存放两类对象的容器,数据集(dataset)和组(group),dataset类似数组类的数据集合,和numpy的数组差不多。group是像文件夹一样的容器,它好比python中的字典,有键(key)和值(value)。group中可以存放dataset或者其他的group。”键”就是组成员的名称,”值”就是组成员对象本身(组或者数据集)。

程序:

#coding:utf-8
# 作者:chenqidan
import os
import numpy as np
from PIL import Image
import tensorflow as tf
import matplotlib.pyplot as plt
import sklearn
from sklearn import preprocessing
import h5py
import scipy


def get_files(file_dir):
    a = []          #a,b,c,d分别是图片类数,自己记得替换掉
    label_a = []
    b = []
    label_b = []
    c = []
    label_c = []
    d = []
    label_d = []

    for file in os.listdir(file_dir + '/a'):
        ca.append(file_dir + '/a' + '/' + file)
        label_a.append(0)  
    for file in os.listdir(file_dir + '/b'):
        kk.append(file_dir + '/b' + '/' + file)
        label_b.append(1)
    for file in os.listdir(file_dir + '/c'):
        ok.append(file_dir + '/c' + '/' + file)
        label_c.append(2)
    for file in os.listdir(file_dir + '/d'):
        xj.append(file_dir + '/d' + '/' + file)
        label_d.append(3)

        # 把所有数据集进行合并
    image_list = np.hstack((a, b, c, d))
    label_list = np.hstack((label_a, label_b, label_c, label_d))

    # 利用shuffle打乱顺序
    temp = np.array([image_list, label_list])
    temp = temp.transpose()
    np.random.shuffle(temp)

    # 从打乱的temp中再取出list(img和lab)
    image_list = list(temp[:, 0])
    label_list = list(temp[:, 1])
    label_list = [int(i) for i in label_list]

    return image_list, label_list
    # 返回两个list 分别为图片文件名及其标签  顺序已被打乱
#-----------------------------------------------------
train_dir = 'F:/pychram_lianxi/skills/h_gz/new1/train/'
image_list,label_list = get_files(train_dir)
print(len(image_list))
print(len(label_list))
print('完成')

#--------------------------------------------------------------------------------
# 32为数据长度的20%,图片大小100*100
Train_image = np.random.rand(len(image_list) - 32, 100, 100).astype('float32')
Train_label = np.random.rand(len(image_list) - 32).astype('float32')

Test_image = np.random.rand(32, 100, 100).astype('float32')
Test_label = np.random.rand(32).astype('float32')
#-------------------------------------------------------------------------------
for i in range(len(image_list) - 32):
    Train_image[i] = np.array(plt.imread(image_list[i]))
    Train_label[i] = np.array(label_list[i])

for i in range(len(image_list) - 32, len(image_list)):
    Test_image[i + 32 - len(image_list)] = np.array(plt.imread(image_list[i]))
    Test_label[i + 32 - len(image_list)] = np.array(label_list[i])
#----------------------------------------------------------------------------------
# 生成h5py
f = h5py.File('./data.h5', 'w')
f.create_dataset('X_train', data=Train_image)
f.create_dataset('y_train', data=Train_label)
f.create_dataset('X_test', data=Test_image)
f.create_dataset('y_test', data=Test_label)
f.close()


train_dataset = h5py.File('./data.h5', 'r')
train_set_x_orig = np.array(train_dataset['X_train'][:]) 
train_set_y_orig = np.array(train_dataset['y_train'][:]) 
test_set_x_orig = np.array(train_dataset['X_test'][:]) 
test_set_y_orig = np.array(train_dataset['y_test'][:]) 
#f.close()

#---------------------------------------------------------------------------


print(train_set_x_orig.max())
print(train_set_x_orig.min())

print(test_set_x_orig.shape)
print(test_set_y_orig.shape)

结果可以看到

下面我们就要检查h5py的正确性,是否安装我们的要求生成的。

程序:

#coding:utf-8
# 作者:chenqidn

import h5py
import numpy as np
f = h5py.File('./data.h5','r')   #打开h5文件
# 可以查看所有的主键
for key in f.keys():
    print(f[key].name)
    print(f[key].shape)
    print(f[key].value)

这是我的一小部分y_test数据,可以看出,数据已经被打乱了。

 

ps:大家互相学习,有问题互相讨论,我也在学习阶段,欢迎大家指点!这篇文章的代码是我看一位大神的博客复制的,改了改,适用我自己的数据集。

今天的重庆有点冷,最近学习不太顺利,代码一直有问题,训练的精度也不是很好,不过还是要加油的,不能放弃!

你可能感兴趣的:(神经网络训练图片数据集读取方法(二)——h5py(python))