numpy.where缩小数组维数

ymzxtsji  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(103)

我想使用CIFAR-100数据集中的一些类来训练模型。我使用NumPy where来过滤数据集,但它缩小了图像数组的维度。

import numpy as np
from tensorflow.keras.datasets import cifar100

(x_train, y_train), (x_test, y_test) = cifar100.load_data()
index = np.where((y_train == 1) | (y_train == 2))
print('Images Shape: {}'.format(x_train.shape))
X_train = x_train[index]
Y_train = y_train[index]
print('Images Shape: {}'.format(X_train.shape))

字符串
印刷品:
图像形状:(50000,32,32,3)
图像形状:(1000,32,3)
目前为止我所尝试的:
过滤后,我尝试将结果转换为像这样的图像形状:
index = np.asarray(index).reshape(x_train.shape[0])
然后我得到了这个错误:
ValueError:无法将大小为2000的数组整形为shape(50000,)
我想只使用CIFAR-100数据集中的10个类来训练一个模型。
这是我的模型:

import numpy as np
from tensorflow.keras.datasets import cifar100
from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D
from tensorflow.keras.models import Sequential

model = Sequential()
model.add(Conv2D(16, (3, 3),
                 # strides=(1, 1),
                 activation='relu',
                 padding='same',  # 'valid',
                 input_shape=(32, 32, 3)))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(32, (3, 3),
                 # strides=(1, 1),
                 activation='relu'))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(32, (3, 3),
                 # strides=(1, 1),
                 activation='relu'))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

model.fit(X_train,
          Y_train,
          epochs=5,
          batch_size=64)

j2qf4p5b

j2qf4p5b1#

我不确定在y_train案例的一个子集上训练是正确的方法。通常训练是在所有案例的“随机”子集上完成的。keras和这样的函数有split,它将数据集,Xy分成训练集和测试集。
但是,正如我的评论,解释你看到的行为。
对于(n,1)y_train

In [203]: y = np.arange(10)[:,None]
In [204]: idx = np.nonzero((y<4)|(y>7))
In [205]: idx
Out[205]: (array([0, 1, 2, 3, 8, 9]), array([0, 0, 0, 0, 0, 0]))

字符串
nonzero/where返回一个索引数组的元组,每个维度一个数组。由于第二维是1,idx[1]全为0,并且不提供任何有用的信息。
当用于索引4d x_train时,idx在第一个维度上选择6个值,在第二个维度上只选择1:

In [206]: x = np.ones((10,2,3,4),int)
In [207]: x[idx].shape
Out[207]: (6, 3, 4)


仅使用第一个数组索引将保留第二维:

In [208]: x[idx[0]].shape
Out[208]: (6, 2, 3, 4)


我不知道你想干什么

index = np.asarray(index).reshape(x_train.shape[0])


在我的例子中,x.shape[0]是10,但idx[0]是(6,)。重塑idx[0]没有意义,更不用说两个数组了。

In [209]: np.array(idx)
Out[209]: 
array([[0, 1, 2, 3, 8, 9],
       [0, 0, 0, 0, 0, 0]])

u4dcyp6a

u4dcyp6a2#

here的代码就是你所需要的:

import tensorflow_datasets as tfds
import tensorflow as tf

def predicate(x, allowed_labels=tf.constant([0., 1., 2.])):
    label = x['label']
    isallowed = tf.equal(allowed_labels, tf.cast(label, tf.float32))
    reduced = tf.reduce_sum(tf.cast(isallowed, tf.float32))
    return tf.greater(reduced, tf.constant(0.))

cifar100_builder = tfds.builder("cifar100")
cifar100_builder.download_and_prepare()
ds_train = cifar100_builder.as_dataset(split="train")
ds_test = cifar100_builder.as_dataset(split="test")

filtered_ds_train=ds_train.filter(predicate)
filtered_ds_test=ds_test.filter(predicate)

字符串

相关问题