云深395 2022-04-14 22:37 采纳率: 20%
浏览 87
已结题

模型预测评估模型出错,如何对模型进行预测,并输出一张、一类的准确率等?

问题遇到的现象和发生背景 模型预测时,不论上面模型训练多少次,更新多少次,它预测的准确率都是同一个数
问题相关代码,请勿粘贴截图


from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPool2D,Activation,Dropout,Flatten,Dense
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img
import numpy as np
import tensorflow as tf
import pathlib
train_data_dir =pathlib.Path('D:/pythonpython/tensorflow/model/data/train')
test_data_dir =pathlib.Path('D:/pythonpython/tensorflow/model/data/test')
train_data_root = pathlib.Path(train_data_dir)
test_data_root = pathlib.Path(test_data_dir)
print(train_data_root)
print(test_data_root)
import random
all_image_paths = list(train_data_root.glob('/')) # 所有子目录下图片
all_image_paths = [str(path) for path in all_image_paths]
random.shuffle(all_image_paths) #打乱数据
print(len(all_image_paths))
train_label_names = sorted(item.name for item in train_data_root.glob('/') if item.is_dir())#读取目录并排序为类别名
train_label_to_index = dict((name, index) for index, name in enumerate(train_label_names))#创建类别字典
train_all_image_labels = [train_label_to_index[pathlib.Path(path).parent.name]
for path in all_image_paths] #图像parent path 对应类
test_label_names = sorted(item.name for item in test_data_root.glob('
/') if item.is_dir())#读取目录并排序为类别名
test_label_to_index = dict((name, index) for index, name in enumerate(test_label_names))#创建类别字典
test_all_image_labels = [test_label_to_index[pathlib.Path(path).parent.name]
for path in all_image_paths] #图像parent path 对应类
train_label_to_index
test_label_to_index
@tf.function
def preprocess_image(path):
image_size=224
image = tf.io.read_file(path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [image_size, image_size])
image /= 255.0 # normalize to [0,1] range
return image
ds = tf.data.Dataset.from_tensor_slices((all_image_paths, train_all_image_labels)
)
def load_and_preprocess_from_path_label(path, label):
return preprocess_image(path), label

image_label_ds = ds.map(load_and_preprocess_from_path_label)
image_label_ds
AUTOTUNE = tf.data.experimental.AUTOTUNE
BATCH_SIZE = 16
image_count = len(all_image_paths)

设置一个和数据集大小一致的 shuffle buffer size(随机缓冲区大小)以保证数据

被充分打乱。

ds = image_label_ds.shuffle(buffer_size=image_count) # buffer_size等于数据集大小确保充分打乱
ds = ds.repeat() #repeat 适用于next(iter(ds)
)
ds = ds.batch(BATCH_SIZE)

当模型在训练的时候,prefetch 使数据集在后台取得 batch。

ds = ds.prefetch(buffer_size=AUTOTUNE)#随机缓冲区相关
vgg16_model = VGG16(weights='imagenet',include_top=False, input_shape=(224,224,3)
)
vgg16_model.summary()
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:])
)
top_model.add(Dense(256,activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(5,activation='softmax')
)

model = Sequential()
model.add(vgg16_model)
model.add(top_model)
def change_range(image,label):
return 2*image-1, label
keras_ds = ds.map(change_range)

数据集可能需要几秒来启动,因为要填满其随机缓冲区。

image_batch, label_batch = next(iter(keras_ds)
)
feature_map_batch = vgg16_model(image_batch)
print(feature_map_batch.shape)
steps_per_epoch=tf.math.ceil(len(all_image_paths)/BATCH_SIZE).numpy()
steps_per_epoch

定义优化器,代价函数,训练过程中计算准确率

model.compile(optimizer=SGD(lr=1e-3,momentum=0.9),loss='sparse_categorical_crossentropy',metrics=['accuracy'])

history=model.fit(ds, epochs=16, steps_per_epoch=230)

pip install h5py

model.save('model_vgg16.h5')
test_data_path = 'D:/pythonpython/tensorflow/model/data/test/dandelion/dandelion-5.jpg'
img_height =224
img_width = 224
img = tf.keras.utils.load_img(
test_data_path, target_size=(img_height, img_width)
)
img_array = tf.keras.utils.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create a batch

predictions = model.predict(img_array)
score = tf.nn.softmax(predictions[0])

print(
This image most likely belongs to {} with a {:2f} percent confidence.
.format(test_label_names[np.argmax(score)], 100 * np.max(score))
)

运行结果及报错内容 无论模型怎么训练,它的结果总是This image most likely belongs to dandelion with a 40.460968 percent confidence.
我的解答思路和尝试过的方法 换了一种方法


from tensorflow.keras.models import load_model
import numpy as np
import matplotlib.pyplot as plt

label = test_label_to_index
label = dict(zip(label.values(),label.keys()
)
)

载入模型

model = load_model('model_vgg16.h5')

@tf.function
def predict(image):
# 导入图片
image = load_img(image)
plt.imshow(image)
plt.show()
image = image.resize((224,224))
image = img_to_array(image)
image = image/255
# (1,224,224,3)
image = np.expand_dims(image,0)
return model.predict_classes(image)[0]
pre = predict("D:/pythonpython/tensorflow/model/data/test/dandelion/dandelion-5.jpg")
print(label[pre])
但是出现错误

python
AttributeError: 'Sequential' object has no attribute 'predict_classes'
tensorflow版本2.6,找不到可以替代的方法

我想要达到的结,训练模型可以得到某张,某类的准确率

python

This image most likely belongs to dandelion with a () percent confidence.

  • 写回答

4条回答 默认 最新

  • 陆海潘江小C 2020CSDN博客之星Top85 2022-04-14 23:31
    关注
    获得1.50元问题酬金

    模型预测的准确率一般都是以一个batch或epoch来评估的,并没有预测某条数据的准确率,只有预测某条数据的标签。
    看到你代码的报错信息,model.predict_classes这个方法并不存在,需要自行实现。

    评论

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 修改了问题 4月14日
  • 修改了问题 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)