tensorflow - 如何在张量流中获得每类的概率?图像分类器
问题描述
所以我有以下代码
#Get the paths of the directories which contain train and test data
train_dir = os.path.join('/ImageClassifier/cats_and_dogs_filtered', 'train')
validation_dir = os.path.join('/ImageClassifier/cats_and_dogs_filtered', 'validation')
train_cats_dir = os.path.join(train_dir, 'cats') # directory with our training cat pictures
train_dogs_dir = os.path.join(train_dir, 'dogs') # directory with our training dog pictures
validation_cats_dir = os.path.join(validation_dir, 'cats') # directory with our validation cat pictures
validation_dogs_dir = os.path.join(validation_dir, 'dogs') # directory with our validation dog pictures
num_cats_tr = len(os.listdir(train_cats_dir))
num_dogs_tr = len(os.listdir(train_dogs_dir))
num_cats_val = len(os.listdir(validation_cats_dir))
num_dogs_val = len(os.listdir(validation_dogs_dir))
total_train = num_cats_tr + num_dogs_tr
total_val = num_cats_val + num_dogs_val
batch_size = 128
epochs = 15
IMG_HEIGHT = 150
IMG_WIDTH = 150
train_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our training data
validation_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our validation data
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='binary')
val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
directory=validation_dir,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')
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(1)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit_generator(
train_data_gen,
steps_per_epoch=total_train // batch_size,
epochs=epochs,
validation_data=val_data_gen,
validation_steps=total_val // batch_size
)
现在我选择了任意图像,并尝试对其进行分类(并期望模型返回属于每个类的图像的概率),所以我这样做了
PATH = 'ToPredictIMG/dogs/1200px-Dog_for_Senior_Dog_Food_Diet_Wikipedia_Page.jpg'
img = image.load_img(PATH,
target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
images = np.vstack([x])
model.predict_proba(images, batch_size=1)
Out[122]:
array([[695.1686]], dtype=float32)
虽然我期望一个包含图像属于狗类和猫类的概率的二维子数组。
问题是什么?
我也试过这个(在这种情况下有 4 张图片)
predictIMG = ImageDataGenerator(rescale=1./255)
PATH = '/ImageClassifier/ToPredictIMG'
predictIMG_gen = predictIMG.flow_from_directory(directory=PATH,
shuffle=True,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='binary')
接着
model.predict_proba(predictIMG_gen,batch_size=None)
Output: array([[ 1.6341457],
[ 2.7946496],
[-6.4226017],
[ 5.3173203]], dtype=float32)
还有这个
model.predict(predictIMG_gen,batch_size=None)
Output: array([[ 5.3173203],
[ 1.6341457],
[-6.4226017],
[ 2.7946496]], dtype=float32)
再说一遍,问题是什么?
解决方案
推荐阅读
- python-3.x - 使用 Super 将类分解为单独的类(和单独的文件)
- java - 在 Android 中用作嵌套视图或 RecyclerView 项视图的自定义视图
- c# - 在多个任务中同时等待一个任务
- featuretools - Featuretools 从多列创建索引
- html - DRY & BEM 澄清
- javascript - 提取已知符号之间的字符串并将其分配为仅使用 javascript 的可重用变量
- html - HTML & CSS Split input form - char by char
- ruby-on-rails - 基本红宝石。为什么这个方法返回零?
- javascript - jsx中无法识别布尔值?
- jdbc - 来自 Google Apps 脚本的 Jdbc 连接错误