将numpy.float64类型转换为int的Tensorflow问题

时间:2019-05-10 06:28:12

标签: python numpy tensorflow artificial-intelligence

我正在使用Tensorflow创建一个非常基本的AI,并使用了官方文档/教程中的代码。这是我的完整代码:

from __future__ import absolute_import, division, print_function
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

train_images = train_images / 255.0
train_labels = train_labels / 255.0

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

问题在此行上:

plt.xlabel(class_names[train_labels[i]])
TypeError: list indices must be integers or slices, not numpy.float64

没问题,使用numpy.float64int更改为.item()

plt.xlabel(class_names[train_labels[i.item()]])
AttributeError: 'int' object has no attribute 'item'

首先是int吗?

这是在带有Tensorflow 1.13.1的Python 3.7上运行的。

2 个答案:

答案 0 :(得分:1)

该错误是由引起

train_labels = train_labels / 255.0

train_labels是标签的ndarray。通过将其除以255,得到的ndarray包含浮点数。因此,使用浮点数作为class_names的索引,导致出现第一个错误。

  

列表索引必须是整数或切片,而不是numpy.float64

要将numpy数组x转换为int,方法如下:x.astype(int)。但是在这种情况下,这样做会创建一个所有值都为0的数组。

一种解决方法是删除上面标识的行:

from __future__ import absolute_import, division, print_function
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

train_images = train_images / 255.0
# train_labels = train_labels / 255.0

plt.figure(figsize=(10,10))
for i in range(25):
    print(train_labels[i], train_images.shape, train_labels.shape, type(train_labels))
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

答案 1 :(得分:0)

归一化(在这种情况下为255的除法)通常是对要素(而不是对标签)进行必要的操作,因为标签尝试使用One hot encoding