Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
图像分类器Keras预测_Keras_Conv Neural Network - Fatal编程技术网

图像分类器Keras预测

图像分类器Keras预测,keras,conv-neural-network,Keras,Conv Neural Network,我遵循Keras博客上的一个教程,我有以下问题:一旦模型经过训练,我如何挑选图像并对其进行分类 我知道train_generator.class_索引中有模型中的类 目标是引入图像的路径并返回相应的类 代码如下: #使用的库 从keras导入后端为K 来自keras进口申请 来自keras导入优化器 从keras.preprocessing.image导入ImageDataGenerator,数组\u到\u img,img\u到\u数组,加载\u img 从keras.models导入顺序 从k

我遵循Keras博客上的一个教程,我有以下问题:一旦模型经过训练,我如何挑选图像并对其进行分类

我知道train_generator.class_索引中有模型中的类

目标是引入图像的路径并返回相应的类

代码如下:

#使用的库
从keras导入后端为K
来自keras进口申请
来自keras导入优化器
从keras.preprocessing.image导入ImageDataGenerator,数组\u到\u img,img\u到\u数组,加载\u img
从keras.models导入顺序
从keras.layers导入Conv2D、MaxPooling2D
从keras.layers导入激活、脱落、变平、致密
从keras.optimizers导入新加坡元
进口cv2
从PIL导入图像
将matplotlib.pyplot作为plt导入
从scipy.misc导入imread
将numpy作为np导入
%matplotlib内联
#我们图像的维度。
img_宽度,img_高度=150,150
列车数据目录='数据/列车'
验证\数据\目录='数据/验证'
nb_系列样品=3000
nb_验证_样本=1200
纪元=10#50
批量大小=16
n_类=3
#获取数据
#这是我们将用于训练的增强配置
序列数据发生器=图像数据发生器(重缩放=1./255,剪切范围=0.2,缩放范围=0.2,水平翻转=True)
#这是我们将用于测试的增强配置:
#只有重新缩放
test_datagen=ImageDataGenerator(重缩放=1./255)
列车生成器=来自列车目录的列车数据生成流(列车数据目录,目标尺寸=(img\U宽度,img\U高度)\
批次大小=批次大小,类别模式='categorical')#类别模式='binary'
验证\u生成器=来自\u目录的测试\u datagen.flow\u(验证\u数据\u目录,目标\u大小=(img\u宽度,img\u高度)\
批次大小=批次大小,类别模式=分类'#类别模式=分类
如果K.image_data_format()==“channels_first”:
输入形状=(3,img\u宽度,img\u高度)
其他:
输入形状=(img\u宽度,img\u高度,3)
模型=顺序()
model.add(Conv2D(32,(3,3),input_shape=input_shape))
添加(激活('relu'))
add(MaxPooling2D(池大小=(2,2)))
model.add(Conv2D(32,(3,3)))
添加(激活('relu'))
add(MaxPooling2D(池大小=(2,2)))
model.add(Conv2D(64,(3,3)))
添加(激活('relu'))
add(MaxPooling2D(池大小=(2,2)))
model.add(展平())
模型.添加(密度(64))
添加(激活('relu'))
模型。添加(辍学率(0.5))
模型添加(密集(n_类))
model.add(激活('softmax'))#sigmoid
model.compile(loss='classifical_crossentropy',optimizer='rmsprop',metrics=['accurity'])\loss binary_crossentropy
#另一种模式
#compile(优化器=SGD(lr=0.0001,动量=0.9),loss='classifical\u crossentropy',metrics=['accurity'])
型号。装配发电机(系列发电机,每个历元的步数=nb系列样品//批量大小,
时代=时代,验证\数据=验证\生成器,验证\步骤=nb\验证\样本//批量大小)
编辑1:

我编写了以下函数,但它不起作用:

def预测(型号、img、目标尺寸):
如果img.size!=目标尺寸:
img=img.resize(目标大小)
x=image.img_到_数组(img)
x=np。展开尺寸(x,轴=0)
x=预处理_输入(x)
preds=模型预测(x)
返回preds[0]
目标_大小=(150150)
模型=加载模型(模型名称)
img_path='image_test/test1.jpg'
img=Image.open(img\u路径)
图=plt.图()
plt.imshow(img)
plt.show()
preds=预测(模型、img、目标尺寸)
preds
编辑2

出现错误:

---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
17 plt.imshow(img)
18 plt.show()
--->19 preds=预测(模型、img、目标尺寸)
20先令
预测中(模型、img、目标尺寸)
3 img=img.调整大小(目标尺寸)
4.
---->5 x=image.img_到_数组(img)
6 x=np。展开尺寸(x,轴=0)
7 x=预处理_输入(x)
AttributeError:'numpy.ndarray'对象没有属性'img_to_array'
编辑3:解决方案如下(我们必须重塑图形):

def预测(型号、img、目标尺寸):
如果img.size!=目标尺寸:
img=img.resize(目标大小)
x=img.getdata()#.img_到_数组(img)
x=np。展开尺寸(x,轴=0)
x=(x/255.)
打印(“shape=,x.shape”)
x=x.重塑(1150150,3)
preds=模型预测(x)
返回preds[0]
目标_大小=(150150)
img_path='image_test/bird.jpg'
img=Image.open(img\u路径)
图=plt.图()
plt.imshow(img)
plt.show()
preds=预测(模型、img、目标尺寸)
preds

从生成器中获取您的模型所期望的确切形状:

X, Y = train_generator.next()  #or next(train_generator)
现在看看这些:

print(X.shape)
print(X.max())
获取一个图像库,例如Pillow(
from PIL import image
),然后将所需文件加载到数组中(方法取决于库)

确保此加载数组中的最大值与
X
中的最大值兼容(例如,您可能需要将数组除以255)

您可以创建包含多个图像的数组,也可以仅创建一个图像,但请确保在第一个维度中考虑批大小:

oneImageBatch = oneImageArray.reshape((1,)+oneImageArray.shape)

然后使用
model.predict(oneImageBatch)

这肯定会奏效

from keras.preprocessing import image

targ_size = (150, 150)

def predict(model, img_path):
    x = image.load_image(img_path, target_size=targ_size)
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    preds = model.predict(x)
    return preds


model = load_model(model_name)
img_path = 'image_test/test1.jpg'
preds = predict(model, img_path)
这将为每个类返回一个概率数组。如果您想知道它是哪个类,只需执行以下操作:


pred\u class=np.argmax(pred,axis=-1)

你的意思是
model.predict(image)
不起作用吗?我在我的帖子中制作并编辑了。什么不起作用?您是否收到错误消息,或者预测结果与预期不符?请发布错误消息。