我想使用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)
型
2条答案
按热度按时间j2qf4p5b1#
我不确定在
y_train
案例的一个子集上训练是正确的方法。通常训练是在所有案例的“随机”子集上完成的。keras
和这样的函数有split
,它将数据集,X
和y
分成训练集和测试集。但是,正如我的评论,解释你看到的行为。
对于(n,1)
y_train
:字符串
nonzero/where
返回一个索引数组的元组,每个维度一个数组。由于第二维是1,idx[1]
全为0,并且不提供任何有用的信息。当用于索引4d
x_train
时,idx
在第一个维度上选择6个值,在第二个维度上只选择1:型
仅使用第一个数组索引将保留第二维:
型
我不知道你想干什么
型
在我的例子中,
x.shape[0]
是10,但idx[0]
是(6,)。重塑idx[0]
没有意义,更不用说两个数组了。型
u4dcyp6a2#
here的代码就是你所需要的:
字符串