我已经创建了一个模型,它利用深度学习来使用CNN对输入数据进行分类。但分类是多类的,实际上有5个类。在训练中,模型看起来很好,也就是说,它不会过拟合或欠拟合。然而,在保存和加载模型时,无论输入图像如何,我总是得到相同的输出。最终的预测数组包含所有类的输出为0。
因此,我不确定模型是否没有预测任何东西,或者它总是产生相同的结果。
我使用tensorboard找到最佳拟合模型后创建的模型如下所示。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard
import pickle
import time
X=pickle.load(open("X.pickle","rb"))
y=pickle.load(open("y.pickle","rb"))
X=X/255.0
dense_layers=[0]
layer_sizes=[64]
conv_layers=[3]
for dense_layer in dense_layers:
for layer_size in layer_sizes:
for conv_layer in conv_layers:
NAME="{}-conv-{}-nodes-{}-dense-{}".format(conv_layer,layer_size,dense_layer,int(time.time()))
print(NAME)
tensorboard=TensorBoard(log_dir='logs\{}'.format(NAME))
model = Sequential()
model.add(Conv2D(layer_size, (3,3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
for l in range(conv_layer-1):
model.add(Conv2D(layer_size, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
for l in range(dense_layer):
model.add(Dense(layer_size))
model.add(Activation('relu'))
model.add(Dense(5))
model.add(Activation('sigmoid'))
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(X,y,batch_size=32,epochs=10,validation_split=0.3,callbacks=[tensorboard])
model.save('0x64x3-CNN-latest.model')加载模型片段如下所示:
import cv2
import tensorflow as tf
CATEGORIES= ["fifty","hundred","ten","thousand","twenty"]
def prepare(filepath):
IMG_SIZE=100
img_array=cv2.imread(filepath)
new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
return new_array.reshape(-1,IMG_SIZE,IMG_SIZE,3)
model=tf.keras.models.load_model("0x64x3-CNN-latest.model")
prediction=model.predict([prepare('30.jpg')])
print(prediction)输出始终为[[0. 0. 0. 0. 0.]]。
在转换为类别时,它总是得到50。
我的数据集包含近2200张图片,每个类平均有350-500张图片。
有人能帮个忙吗..?
发布于 2020-03-30 17:25:27
我看到当你训练的时候,你会标准化你的图像:
X = X/255.0但当你测试时,即在预测时间内,你只是读取图像并调整大小,而不是归一化。尝试:
def prepare(filepath):
IMG_SIZE=100
img_array=cv2.imread(filepath)
img_array = img_array/255.0
new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
return new_array.reshape(-1,IMG_SIZE,IMG_SIZE,3)此外,您的prepare函数返回4个维度(包括批次维度)的图像,因此当您调用predict时,您不必以列表形式提供输入。而不是:
prediction=model.predict([prepare('30.jpg')])您应该执行以下操作:
prediction=model.predict(prepare('30.jpg'))希望能有所帮助。
https://stackoverflow.com/questions/60923982
复制相似问题