实战Keras3.0:自定义图片数据集分类任务

2024-01-02 23:11:14

一、创建自定义图片数据集

1、数据收集

以10张小狗图片和10张小猫图片为例

2、数据预处理

1、创建Excel表格,并在其中创建两列,一列是图片路径,另一列是对应的标签(狗0、猫1)

?2、用pandas库的read_excel函数读取Excel,用PIL库的Image函数将图片数据格式化

import pandas as pd
from sklearn.model_selection import train_test_split
import keras
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

#读取Excel表格
data = pd.read_excel('/Users/Desktop/cat_dog/dog_and_cat.xlsx')

#A列图片路径
image_data = data.iloc[:, 0].to_list()
def imageDigitization(image_data):
    train_data = []
    for image_item  in image_data:
        #读取图片
        img = Image.open(image_item)
        # 缩放图片
        img_resized = img.resize((200, 200))
        img_array = np.array(img_resized)
        train_data.append(img_array)
    return np.array(train_data)   

#将图片数据格式化
train_data = imageDigitization(image_data)


#归一化
train_data =  train_data/ 255.0


#B列标签
train_labels = np.array(data.iloc[:, 1].to_list())
3、验证数据

用matplotlib库pyplot查看数据集,因图像NumPy数组,标签是整数数组。这些标签对应于图像所代表的类别,由于数据集不包括类名称,所以将根据标签的整数自定义映射名称的数组。

#验证数据
class_names = ['dog', 'cat']

plt.figure(figsize=(20,20))
for i in range(20):
    plt.subplot(10,10,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid()
    plt.imshow(train_data[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

?

4、数据准备

用sklearn库的train_test_split划分训练集和测试集

#划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(train_data,train_labels, test_size=0.3, random_state=42)

?

二、搭建网络

任务类型猫、狗图像二分类问题

# 创建一个Sequential模型
model = keras.Sequential([
    # 添加一个卷积层,使用64个3x3的卷积核,激活函数为ReLU,填充方式为SAME,输入形状为(200, 200, 3)
    keras.layers.Conv2D(64, 3, activation='relu', padding='SAME', input_shape=(200, 200, 3)),
    # 添加一个最大池化层,池化窗口大小为2x2
    keras.layers.MaxPooling2D((2, 2)),
    # 添加一个卷积层,使用128个3x3的卷积核,激活函数为ReLU
    keras.layers.Conv2D(128, 3, activation='relu'),
    # 添加一个最大池化层,池化窗口大小为2x2
    keras.layers.MaxPooling2D((2, 2)),
    # 将卷积层的输出展平,以便输入到全连接层
    keras.layers.Flatten(),
    # 添加一个全连接层,输出维度为2
    keras.layers.Dense(2)
])


#编译模型,使用Adam优化器,损失函数为稀疏分类交叉熵(从对数中计算)
#from_logits=True表示模型输出的是未经过激活函数处理的原始分数,而不是概率分布,
#评估指标为准确率
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

模型结构?

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 200, 200, 64)      1792      
                                                                 
 max_pooling2d (MaxPooling2  (None, 100, 100, 64)      0         
 D)                                                              
                                                                 
 conv2d_1 (Conv2D)           (None, 98, 98, 128)       73856     
                                                                 
 max_pooling2d_1 (MaxPoolin  (None, 49, 49, 128)       0         
 g2D)                                                            
                                                                 
 flatten (Flatten)           (None, 307328)            0         
                                                                 
 dense (Dense)               (None, 2)                 614658    
                                                                 
=================================================================
Total params: 690306 (2.63 MB)
Trainable params: 690306 (2.63 MB)
Non-trainable params: 0 (0.00 Byte)

?

三、模型训练

保存模型、评估准确率

#模型训练
history=model.fit(X_train, y_train,validation_data=(X_test, y_test),epochs=20,verbose=1)

#保存模型
model_path = '/Users/code/model/dog_and_cat.keras'
model.save(model_path)


#评估准确率
test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
print('\nTest accuracy:', test_acc)

声明:以上代码均为学习使用

文章来源:https://blog.csdn.net/lymake/article/details/135340060
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。