m0_74083574 2024-05-23 23:32 采纳率: 100%
浏览 8
已结题

tensorflow

我刚试着做CNN算法,遇到了很大的问题。
出来的结果是这样的:

img


我希望出现的结果是这样的:

img


希望得到您的回复!我将不胜感激!代码附在下方


import pandas as pd  
from PIL import Image
from sklearn.model_selection import train_test_split
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers,models
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img,img_to_array,array_to_img

def load_and_preprocess_image(path,size=(100,100)):
    img=load_img(path, target_size=size)
    img_tensor=img_to_array(img)
    img_tensor=np.expand_dims(img_tensor,axis=0)
    img_tensor/=255. # 像素归一化
    return img_tensor
'''
load_and_preprocess_image(path,target_size=(32,32))
用于加载和预处理图片
path为图片的相对路径
target_size为转换后的目标大小,缺省默认为(100*100)
返回预处理后的数组
'''

#从本地加载数据集
#Step 1:从excel表格中读取图片的路径和标签
df=pd.read_excel('Paths_Labels.xlsx')
Paths=df['Path'].tolist()
Labels=df['Label'].tolist()
'''
注:提取数据也可以使用下方代码
Paths = df.iloc[:, 0].tolist()  
Labels=df.iloc[:0].tolist
'''
#Step 2:将图片路径和标签划分为训练集和测试集
paths_train,paths_test,y_train,y_test=train_test_split(Paths,Labels,test_size=0.2,random_state=0)
#Step 3:加载训练集和测试集图片(顺便预处理)
X_train=[load_and_preprocess_image(path) for path in paths_train]
X_test=[load_and_preprocess_image(path) for path in paths_test]
'''
目前为止,数据集已经加载完毕
训练集图片X_train,训练集标签y_train
测试集图片X_test,测试集标签y_test
'''

#构建卷积神经网络模型
model=models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100,100,3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10)
])

#编译模型
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

#训练模型
history=model.fit(X_train,y_train,epochs=2,validation_data=(X_test,y_test))
  • 写回答

15条回答 默认 最新

  • guicai_guojia 2024-05-24 08:31
    关注

    chatgpt回答方案

    看起来你在尝试使用卷积神经网络(CNN)来处理图像分类任务时遇到了问题。为了帮助你解决这个问题,我将详细检查你的代码,并指出可能的问题和改进的方法。

    问题分析

    你的代码在几个方面可能存在问题:

    1. 图像预处理
      • 图像数组的形状可能不一致。
      • 数据未转换成NumPy数组。
    2. 数据集加载
      • 数据集可能未正确加载到模型中。
    3. 模型训练
      • 训练数据的形状和标签可能不匹配。

    代码改进

    以下是对你的代码进行改进的一些建议和步骤:

    1. 图像预处理函数

    确保图像数组的形状一致,并将图像数组转换成NumPy数组。

    def load_and_preprocess_image(path, size=(100,100)):
        img = load_img(path, target_size=size)
        img_tensor = img_to_array(img)
        img_tensor /= 255.0  # 像素归一化
        return img_tensor
    

    2. 加载数据集

    将列表转换成NumPy数组,并确保图像数据形状正确。

    # 从本地加载数据集
    df = pd.read_excel('Paths_Labels.xlsx')
    Paths = df['Path'].tolist()
    Labels = df['Label'].tolist()
    
    # 将图片路径和标签划分为训练集和测试集
    paths_train, paths_test, y_train, y_test = train_test_split(Paths, Labels, test_size=0.2, random_state=0)
    
    # 加载训练集和测试集图片(顺便预处理)
    X_train = np.array([load_and_preprocess_image(path) for path in paths_train])
    X_test = np.array([load_and_preprocess_image(path) for path in paths_test])
    
    # 确保标签是整数类型的 NumPy 数组
    y_train = np.array(y_train).astype(np.int)
    y_test = np.array(y_test).astype(np.int)
    

    3. 检查数据形状

    确保训练集和测试集的数据形状正确。

    print(f'X_train shape: {X_train.shape}')
    print(f'y_train shape: {y_train.shape}')
    print(f'X_test shape: {X_test.shape}')
    print(f'y_test shape: {y_test.shape}')
    

    4. 构建模型

    保持模型的结构,但确保最后一层的输出维度与标签数量匹配。

    model = models.Sequential([
        layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)),
        layers.MaxPooling2D((2, 2)),
        layers.Conv2D(64, (3, 3), activation='relu'),
        layers.MaxPooling2D((2, 2)),
        layers.Conv2D(64, (3, 3), activation='relu'),
        layers.Flatten(),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')  # 假设你有10个分类
    ])
    

    5. 编译和训练模型

    确保损失函数和度量指标与分类任务匹配。

    # 编译模型
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    # 训练模型
    history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
    

    完整代码示例

    import pandas as pd  
    from PIL import Image
    from sklearn.model_selection import train_test_split
    import numpy as np
    import tensorflow as tf
    from tensorflow.keras import layers, models
    from tensorflow.keras.preprocessing.image import load_img, img_to_array
    
    def load_and_preprocess_image(path, size=(100, 100)):
        img = load_img(path, target_size=size)
        img_tensor = img_to_array(img)
        img_tensor /= 255.0  # 像素归一化
        return img_tensor
    
    # 从本地加载数据集
    df = pd.read_excel('Paths_Labels.xlsx')
    Paths = df['Path'].tolist()
    Labels = df['Label'].tolist()
    
    # 将图片路径和标签划分为训练集和测试集
    paths_train, paths_test, y_train, y_test = train_test_split(Paths, Labels, test_size=0.2, random_state=0)
    
    # 加载训练集和测试集图片(顺便预处理)
    X_train = np.array([load_and_preprocess_image(path) for path in paths_train])
    X_test = np.array([load_and_preprocess_image(path) for path in paths_test])
    
    # 确保标签是整数类型的 NumPy 数组
    y_train = np.array(y_train).astype(np.int)
    y_test = np.array(y_test).astype(np.int)
    
    # 打印数据形状以确保正确
    print(f'X_train shape: {X_train.shape}')
    print(f'y_train shape: {y_train.shape}')
    print(f'X_test shape: {X_test.shape}')
    print(f'y_test shape: {y_test.shape}')
    
    # 构建卷积神经网络模型
    model = models.Sequential([
        layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)),
        layers.MaxPooling2D((2, 2)),
        layers.Conv2D(64, (3, 3), activation='relu'),
        layers.MaxPooling2D((2, 2)),
        layers.Conv2D(64, (3, 3), activation='relu'),
        layers.Flatten(),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')  # 假设你有10个分类
    ])
    
    # 编译模型
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    # 训练模型
    history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
    
    # 绘制训练和验证的损失和准确率曲线
    plt.figure(figsize=(12, 4))
    plt.subplot(1, 2, 1)
    plt.plot(history.history['loss'], label='Training Loss')
    plt.plot(history.history['val_loss'], label='Validation Loss')
    plt.title('Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    
    plt.subplot(1, 2, 2)
    plt.plot(history.history['accuracy'], label='Training Accuracy')
    plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
    plt.title('Accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend()
    
    plt.show()
    

    总结

    通过以上改进,确保数据集加载和预处理正确,并且模型的输出层与标签数量匹配,应该能够解决你在训练CNN时遇到的问题。如果问题依然存在,请提供更多详细信息和具体错误信息,以便进一步诊断。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月23日

悬赏问题

  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?