Python 3.x 如何使用tensorflow';s图像分类教程,用于对原始训练或验证数据集中未显示的图像进行分类?

Python 3.x 如何使用tensorflow';s图像分类教程,用于对原始训练或验证数据集中未显示的图像进行分类?,python-3.x,tensorflow,keras,tensorflow2.0,Python 3.x,Tensorflow,Keras,Tensorflow2.0,TensorFlow有,我可以运行 然后,我为使用模型定义此函数: def predict1(model,img): img = img.resize((150,150)) im = np.array(img) im = im.reshape(-1,np.shape(im)[0],np.shape(im)[1],3) # resize for 'batch' preds = model.predict(im) # predict retu

TensorFlow有,我可以运行

然后,我为使用模型定义此函数:

def predict1(model,img):
    img = img.resize((150,150))  
    im = np.array(img)    
    im = im.reshape(-1,np.shape(im)[0],np.shape(im)[1],3)  # resize for 'batch'
    preds = model.predict(im)   # predict
    return preds
然后实际使用它:

img = Image.open('MYIMAGE.jpg')
predict1(model,img)
输出为:

array([[3415.0505]], dtype=float32)
我注意到,当一个正数(这里是3415.0505)对应于一个类别时,一个负数对应于另一个类别(我在几次尝试后意识到这一点)。这很好,我可以编写一个函数,根据返回字符串的符号返回字符串
'dog'
'cat'

然而,我认为我没有抓住重点。有什么更好的方法可以真正获得
'dog'
'cat'
预测


如果有许多类别,我基于符号的方法将失败。我将使用这个分类器来分类到许多类别,这就是为什么我需要一个更好的方法。

这是基于您尝试做的教程

我对教程中的代码做了一些修改,因为您尝试的是分类,而不是二进制分类。

为了演示
对于列车_gen:

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='categorical') // change from binary to categorical
对于验证,请执行以下操作:

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=validation_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='categorical') // changed from binary to categorical
我还更新了输出层,因为它是分类的

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(2)  #Changed to 2 since you wanted a multiple output e.g.[ 0.333, -0.1333]
]) 
在预测部分,我使用了tf.math.argmax方法,它返回预测中最高值的索引

listofLabels = ['dog', 'cat']
x = model.predict(sample_training_images)
labels = tf.math.argmax(x, axis = 1)
print(labels)
for label in labels:
    print(listofLabels[label])