加载您自己的数据-使用Python、TensorFlow和Keras p.2深入学习基础知识

欢迎来到一个教程,在这里我们将讨论如何加载我们自己的外部数据集,这带来了各种各样的挑战!

首先,我们需要一个数据集。我们去拿来自微软的狗对猫数据集。如果这个数据集消失了,有人会告诉我的。我会亲自主持。

现在您已经拥有了数据集,它现在已被压缩。解压缩数据集,您会发现它创建了一个名为PetImages。在里面,我们有Cat和Dog目录,然后填充猫和狗的图像。放轻松点!让我们玩这个数据集!首先,我们需要了解如何将此数据集转换为培训数据。我们马上就有几个问题要解决了。最大的问题是,并不是所有这些图像都是相同的大小。虽然我们最终可以在神经网络中有不同大小的层,但这并不是最基本的目标。我们现在要重塑事物,所以每一幅图像都有相同的维度。接下来,我们可能想或不想保留颜色。首先,如果您还没有matplotlib,那么安装matplotlib(pip install matpltlib),以及OpenCV(pip install opencv-python).

import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
from tqdm import tqdm

DATADIR = “X:/Datasets/PetImages”

CATEGORIES = [“Dog”, “Cat”]

for category in CATEGORIES: # do dogs and cats
path = os.path.join(DATADIR,category) # create path to dogs and cats
for img in os.listdir(path): # iterate over each image per dogs and cats
img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE) # convert to array
plt.imshow(img_array, cmap=‘gray’) # graph it
plt.show() # display!

    break  # we just want one for now so break
break  #...and one more!

在这里插入图片描述
看,一只狗!

print(img_array)
[[189 189 189 … 29 29 31]
[186 186 186 … 36 35 36]
[184 185 185 … 35 33 33]

[168 169 170 … 71 72 72]
[169 170 171 … 68 67 67]
[168 169 170 … 64 63 62]]
现在它的形状:

print(img_array.shape)
(398, 500)
这是一个375英尺,500宽,3通道的图像。3通道是因为它是RGB(颜色)。我们绝对不想要这么大的图像,但是不同的图像是不同的形状,这也是一个问题。

IMG_SIZE = 50

new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
plt.imshow(new_array, cmap=‘gray’)
plt.show()
在这里插入图片描述
嗯,我觉得有点模糊。我们用100x100走吧?
new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
plt.imshow(new_array, cmap=‘gray’)
plt.show()
在这里插入图片描述
好多了。我们试试吧。接下来,我们要创建培训数据和所有这些,但是,首先,我们应该留出一些图像进行最终测试。我将手动创建一个名为Testing然后在其中创建两个目录,一个用于Dog一张是给你的Cat。从这里开始,我将从这两张图片中移出前15张图片。Dog和Cat训练版本。确保你移动它们,而不是复制。我们会用这个来做最后的测试。

现在,我们要开始建立我们的培训数据!
training_data = []

def create_training_data():
for category in CATEGORIES: # do dogs and cats

    path = os.path.join(DATADIR,category)  # create path to dogs and cats
    class_num = CATEGORIES.index(category)  # get the classification  (0 or a 1). 0=dog 1=cat

    for img in tqdm(os.listdir(path)):  # iterate over each image per dogs and cats
        try:
            img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE)  # convert to array
            new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))  # resize to normalize data size
            training_data.append([new_array, class_num])  # add this to our training_data
        except Exception as e:  # in the interest in keeping the output clean...
            pass
        #except OSError as e:
        #    print("OSErrroBad img most likely", e, os.path.join(path,img))
        #except Exception as e:
        #    print("general exception", e, os.path.join(path,img))

create_training_data()

print(len(training_data))
100%|a-a-a-a-a-a-a-a-a-a-a-a-| 12486/12486 [00:14<00:00, 890.92it/s]
100%|a-a-a-a-a-a-a-a-a-a-a-a-| 12486/12486 [00:12<00:00, 966.98it/s]
24916
太好了,我们有将近25K的样品!太棒了。

我们要做的一件事是确保我们的数据是平衡的。在这个数据集的情况下,我可以看到数据集开始是平衡的。所谓平衡,我的意思是每个班级都有相同数量的例子(狗和猫的数量相同)。如果不平衡,您可以将类权重传递给模型,以便它可以适当地度量误差,或者通过将较大的集合调整为与较小的集合相同的大小来平衡样本。

如果不平衡,模型将首先了解到,最好的方法是只预测一个类,以最常见的类为准。然后,它会经常被困在这里。然而,在我们的例子中,这些数据已经平衡了,所以这很容易。也许稍后我们会有一个不太平衡的数据集。

此外,如果您的数据集太大,无法适应您的内存,您可以批处理加载您的数据。有很多方法可以做到这一点,有些是在TensorFlow之外,还有一些是内置的。我们可能会进一步讨论这一点,但目前,我们主要是试图涵盖您的数据应该如何看上去、形状和输入到模型中。

接下来,我们要对数据进行洗牌。现在我们的数据是所有的狗,然后是所有的猫。这通常也会导致麻烦,因为最初,分类器将学会只是预测狗总是。然后它会转移到哦,只是预测所有的猫!像这样来回走也没用。

import random

random.shuffle(training_data)
我们的training_data是一个列表,意味着它是可变的,所以现在它被很好地调整了。我们可以通过迭代几个初始样本并打印出类来确认这一点。

for sample in training_data[:10]:
print(sample[1])
1
1
1
0
0
1
0
0
0
1
太好了,我们把课程很好地混为一谈了!是时候做我们的模特了!

X = []
y = []

for features,label in training_data:
X.append(features)
y.append(label)

print(X[0].reshape(-1, IMG_SIZE, IMG_SIZE, 1))

X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)
[[[[215]
[113]
[169]

[100]
[ 62]
[ 83]]

[[128]
[140]
[156]

[113]
[ 63]
[ 97]]

[[149]
[146]
[183]

[141]
[ 90]
[ 98]]

[[ 58]
[ 20]
[ 23]

[ 79]
[208]
[209]]

[[ 35]
[ 26]
[ 21]

[ 77]
[211]
[210]]

[[ 27]
[ 21]
[ 24]

[ 93]
[205]
[195]]]]
让我们保存这些数据,这样我们就不必每次想玩神经网络模型时都要计算它:

import pickle

pickle_out = open(“X.pickle”,“wb”)
pickle.dump(X, pickle_out)
pickle_out.close()

pickle_out = open(“y.pickle”,“wb”)
pickle.dump(y, pickle_out)
pickle_out.close()
我们总是可以将它加载到当前脚本中,或者通过执行以下操作来加载一个全新的脚本:

pickle_in = open(“X.pickle”,“rb”)
X = pickle.load(pickle_in)

pickle_in = open(“y.pickle”,“rb”)
y = pickle.load(pickle_in)
现在我们已经得到了数据集,我们已经准备好覆盖卷积神经网络,并用我们的数据实现一个分类。

下一个教程:卷积神经网络-Python、TensorFlow和Keras P.3的深度学习基础

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值