keras ValueError:'decode_predictions'需要一批预测(即形状的二维数组(样本数,1000)),找到的数组形状为:(一、二十六)

wqlqzqxt  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(215)

我正在使用一个由我自己训练的模型将盲文数字翻译成纯文本。如你所见,这是一个有26个类的分类问题,每个类对应字母表中的一个字母。
这是我用来训练模型的数据集:https://www.kaggle.com/datasets/shanks0465/braille-character-dataset
以下是我生成训练集和验证集的方式:

os.mkdir('./images/')
alpha = 'a'
for i in range(0, 26): 
    os.mkdir('./images/' + alpha)
    alpha = chr(ord(alpha) + 1)

rootdir = "C:\\Users\\ffernandez\\Downloads\\capstoneProject\\Braille Dataset\\Braille Dataset\\"

for file in os.listdir(rootdir):
    letter = file[0]
    copyfile(rootdir+file, './images/' + letter + '/' + file)

生成的文件夹如下所示:folder structure
这就是我创建培训和验证拆分的方式:

datagen = ImageDataGenerator(rotation_range=20,
                             shear_range=10,
                             validation_split=0.2)

train_generator = datagen.flow_from_directory('./images/',
                                              target_size=(28,28),
                                              subset='training')

val_generator = datagen.flow_from_directory('./images/',
                                            target_size=(28,28),
                                            subset='validation')

最后,这是与模型的设计、编译和训练相对应的代码:

K.clear_session()

model_ckpt = ModelCheckpoint('BrailleNet.h5',save_best_only=True)
reduce_lr = ReduceLROnPlateau(patience=8,verbose=0)
early_stop = EarlyStopping(patience=15,verbose=1)

entry = L.Input(shape=(28,28,3))
x = L.SeparableConv2D(64,(3,3),activation='relu')(entry)
x = L.MaxPooling2D((2,2))(x)
x = L.SeparableConv2D(128,(3,3),activation='relu')(x)
x = L.MaxPooling2D((2,2))(x)
x = L.SeparableConv2D(256,(2,2),activation='relu')(x)
x = L.GlobalMaxPooling2D()(x)
x = L.Dense(256)(x)
x = L.LeakyReLU()(x)
x = L.Dense(64,kernel_regularizer=l2(2e-4))(x)
x = L.LeakyReLU()(x)
x = L.Dense(26,activation='softmax')(x)

model = Model(entry,x)
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

history = model.fit_generator(train_generator,validation_data=val_generator,epochs=666,
                              callbacks=[model_ckpt,reduce_lr,early_stop],verbose=0)

下面是用于测试盲文字母“a”的图像与训练和验证集(28x28)大小相同的代码:

img_path = "./test/a1.JPG10whs.jpg"
img = plt.imread(img_path)
img_array = tf.keras.utils.img_to_array(img)
img_batch = np.expand_dims(img_array, axis=0)

img_preprocessed = tf.keras.applications.resnet50.preprocess_input(img_batch)
prediction = model.predict(img_preprocessed)

print(tf.keras.applications.imagenet_utils.decode_predictions(prediction, top=3)[0])

就在我执行最后一行代码时,出现了以下错误:
ValueError:decode_predictions需要一批预测(即形状的二维数组(样本数,1000))。找到形状为的数组:(一、二十六)
我在stackoverflow(ValueError: decode_predictions expects a batch of predictions (i.e. a 2D array of shape (samples, 1000)). Found array with shape: (1, 7))上发现了一个类似的问题。
我已经看到,只有当您的模型输出ImageNet类(1000维)时,使用“decode_predictions”才有意义,但如果我不能使用“decode_predictions”,我就不知道如何获得我的预测。
我想要的输出如下:

prediction = model.predict(img_preprocessed)
print(prediction)

output: 'a'

对于如何解决此问题的任何提示或建议,我们都非常感谢。

ehxuflar

ehxuflar1#

如果我们看一下预测对象实际上是什么,我们可以看到它有26个值,这些值是模型预测的每个字母的概率:

因此,我们需要一种方法将预测值Map到相应的字母。一种简单的方法是创建一个包含所有26个可能字母的列表,然后在预测数组中搜索最大值。例如:

#Create prediction labels from a-z
alpha="a"
labels=["a"]
for i in range(0, 25): 
    alpha = chr(ord(alpha) + 1)
    labels.append(alpha)
#Search the max value in prediction
labels[np.argmax(prediction)]

输出应该是概率最高的字符:

相关问题