Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Tensorflow中实现CIFAR10时遇到问题_Python_Tensorflow - Fatal编程技术网

Python 在Tensorflow中实现CIFAR10时遇到问题

Python 在Tensorflow中实现CIFAR10时遇到问题,python,tensorflow,Python,Tensorflow,这就是我得到的错误 import os import numpy as np import pickle class CifarLoader(object): def __init__(self, source_files): self._source = source_files self._i = 0 self.images = None self.labels = None def load(self):

这就是我得到的错误

import os
import numpy as np
import pickle

class CifarLoader(object):
    def __init__(self, source_files):
        self._source = source_files
        self._i = 0
        self.images = None
        self.labels = None

    def load(self):
        data = [unpickle(f) for f in self._source] #again a list comprehension
        images = np.vstack([d["data"] for d in data]) #so vstack stacks these arrays in sequence vertically or row wise
        n = len(images)
        self.images = images.reshape(n, 3, 32, 32).transpose(0, 2, 3, 1).astype(float)/255 #number of possible shades for each channel
        self.labels = one_hot(np.hstack([d["labels"] for d in data]), 10)
        return self

    def next_batch(self, batch_size):
        x, y = self.images[self._i:self._i+batch_size], self.labels[self._i:self._i+batch_size]
        self._i = (sel._i + batch_size) % len(self.images)
        return x, y

DATA_PATH = "cifar10"

def unpickle(file):
    with open(os.path.join(DATA_PATH, file), 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

def one_hot(vec, vals=10):
    n = len(vec)
    out = np.zeros((n, vals))
    out[range(n), vec] = 1
    return out

class CifarDataManager(object):
    def __init__(self):
        self.train = CifarLoader(["data_batch_{}".format(i) for i in range(1, 6)]).load()
        self.test = CifarLoader(["test_batch"]).load()

def display_cifar(images, size):
    n = len(images)
    plt.figure()
    plt.gca().set_axis_off()
    im = np.vstack([np.hstack([images[np.random.choice(n)] for i in range(size)]) for i in range(size)])
    plt.imshow(im)
    plt.show()

d = CifarDataManager()

print ("Number of train images: {}".format(len(d.train.images)))
print ("Number of train labels: {}".format(len(d.train.labels)))
print ("Number of test images: {}".format(len(d.test.images)))
print ("Number of test images: {}".format(len(d.test.labels)))
images = d.train.images
display_cifar(images, 10)
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在()
7 plt.show()
8.
---->9 d=CifarDataManager()
10
11打印(“列车图像数:{}”。格式(len(d.train.images)))
in_uuu初始(自)
1类CifarDataManager(对象):
2定义初始化(自):
---->3 self.train=CifarLoader([“data\u batch\u{}”.i的格式(i)在范围(1,6)]).load()
4 self.test=CifarLoader([“test_batch”]).load()
负载(自身)
12 def加载(自):
13数据=[在self._source中为f取消勾选(f)#再次是一个列表
--->14 images=np.vstack([d[“data”]表示数据中的d])#因此vstack将这些数组按顺序垂直或按行堆叠
15 n=透镜(图像)
16 self.images=images.重塑(n,3,32,32).转置(0,2,3,1).aType(float)/255#每个通道可能的阴影数
英寸(.0)
12 def加载(自):
13数据=[在self._source中为f取消勾选(f)#再次是一个列表
--->14 images=np.vstack([d[“data”]表示数据中的d])#因此vstack将这些数组按顺序垂直或按行堆叠
15 n=透镜(图像)
16 self.images=images.重塑(n,3,32,32).转置(0,2,3,1).aType(float)/255#每个通道可能的阴影数
KeyError:“数据”

感谢您的帮助!我怀疑这个问题与pickle和Python3及其加载数据的方式有关。

感谢您检查文件并发布结果。现在很清楚,您的密钥是bytes字符串(bytes)。由于您没有指定,我只能猜测您使用的是python3,它不能隐式地将bytes对象转换为字符串(请参阅中的注释)。在python 2和python 3下尝试以下操作,您可能会有更好的想法:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-182-b3f5a6bd2e1d> in <module>()
      7     plt.show()
      8 
----> 9 d = CifarDataManager()
     10 
     11 print ("Number of train images: {}".format(len(d.train.images)))

<ipython-input-181-e85d41d02848> in __init__(self)
      1 class CifarDataManager(object):
      2     def __init__(self):
----> 3         self.train = CifarLoader(["data_batch_{}".format(i) for i in range(1, 6)]).load()
      4         self.test = CifarLoader(["test_batch"]).load()

<ipython-input-179-d96c4afcda51> in load(self)
     12     def load(self):
     13         data = [unpickle(f) for f in self._source] #again a list comprehension
---> 14         images = np.vstack([d["data"] for d in data]) #so vstack stacks these arrays in sequence vertically or row wise
     15         n = len(images)
     16         self.images = images.reshape(n, 3, 32, 32).transpose(0, 2, 3, 1).astype(float)/255 #number of possible shades for each channel

<ipython-input-179-d96c4afcda51> in <listcomp>(.0)
     12     def load(self):
     13         data = [unpickle(f) for f in self._source] #again a list comprehension
---> 14         images = np.vstack([d["data"] for d in data]) #so vstack stacks these arrays in sequence vertically or row wise
     15         n = len(images)
     16         self.images = images.reshape(n, 3, 32, 32).transpose(0, 2, 3, 1).astype(float)/255 #number of possible shades for each channel

KeyError: 'data'

如您所见,错误表明至少有一个未勾选的dict没有密钥“数据”。如果没有数据文件,可能很难帮助您排除故障。也许你可以一个接一个地解开你的数据文件,确保它们都有“数据”键。我就是这么做的:
try_1=unpickle(“data_batch_1”)
try_1.keys()
我得到的是:dict_键([b'labels',b'filename',b'batch_label',b'data')),但它仍然不起作用。好吧,这就搞定了!!!因此更改为:images=np.vstack([d[b“data”]表示数据中的d])self.labels=one_hot(np.hstack([d[b“labels”]表示数据中的d]),10)非常感谢您解决此问题!
d = {b'a': 1, b'b': 2}
print(d.keys())
try:
    print('Key "a" gives: {}'.format(d["a"]))
except Exception as err:
    print('Get "{}"!'.format(err.__class__.__name__))
    print('Key b"a" gives: {}'.format(d[b"a"]))