用BP神经网络实现猫狗识别(python)

创建cnn模型

def define_cnn_model():
    # 使用序列模型
    model = Sequential()
    # 卷积层
    model.add(Conv2D(32, (3, 3), activation="relu",
                     kernel_initializer='he_uniform',
                     padding="same",
                     input_shape=(200, 200, 3)))
    '''卷积核数量,卷积核维度,激活函数,padding,图片像素200x200'''
    # 最大池化层
    model.add(MaxPooling2D((2, 2)))
    # Flatten 层
    model.add(Flatten())
    # 全连接层
    model.add(Dense(128, activation="relu", kernel_initializer='he_uniform'))
    model.add(Dense(1, activation="sigmoid"))  # 输出层0,1,sigmoid模型实现输出值0~1之间,分别代表猫狗

    # 编译模型
    opt = SGD(learning_rate=0.001, momentum=0.9)  # 优化器,随机梯度下降,为模型找到最佳的参数
    model.compile(optimizer=opt,
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    return model

这是一个函数,返回一个CNN的Keras模型。该模型使用卷积层、最大池化层、全连接层和一个sigmoid输出层来预测图像是猫还是狗。具体来说,该模型有以下组件:

  • 输入层:该模型的输入形状为(200,200,3),即高为200、宽为200、通道数为3(对应RGB三个颜色通道)的图像。
  • 卷积层:使用32个大小为(3,3)的滤波器进行卷积操作,使用ReLU激活函数,保证了输出值都大于等于0。
  • 池化层:使用大小为(2,2)的窗口对卷积输出进行最大化池化,从而减少模型中的参数数量,并使模型更加健壮。
  • Flatten层:将池化层输出的2D张量展平成1D向量,以便进行全连接操作。
  • 全连接层:包含128个神经元,并使用ReLU激活函数。为防止过拟合,使用了dropout技术,在全连接层输出之前随机删掉一些神经元。
  • 输出层:是一个大小为1、使用sigmoid激活函数的密集层,用于预测照片中是否是狗。

最后,该模型使用二分类交叉熵作为损失函数,使用SGD优化器,训练结束后,使用accuracy作为模型的指标来评估最终的性能。

训练模型

def train_cnn_model():
    # 实例化模型
    model = define_cnn_model()
    # 创建图片生成器,产生图片并输入
    datagen = ImageDataGenerator(rescale=1.0 / 225.0)
    train_it = datagen.flow_from_directory(
        'E:\\ma1ogo3ushu4ju4ji2\\dogs_cats\\data\\train',
        class_mode='binary',
        batch_size=64,  # 一次产生并输入64张图片
        target_size=(200, 200)  # 缩放图片为200x200,和输入图片大小相同
    )
    # 训练模型
    model.fit_generator(train_it,
                        steps_per_epoch=len(train_it),
                        epochs=20,
                        verbose=1)
    # 把模型保存到文件夹
    model.save("E:\\Data_clean\\basic_cnn_result.h5")

此代码为使用CNN模型训练猫狗图像分类器的过程。

  1. 首先调用define_cnn_model()函数实例化一个CNN模型。

  2. 接着用ImageDataGenerator创建图片生成器datagen,并指定图像预处理参数rescale=1.0/225.0。

  3. 用flow_from_directory方法指定图片目录、batch_size、目标大小等参数,让生成器逐批次产生和输入图片,其中类别由’binary’指定为二分类。

  4. 使用fit_generator方法对模型进行训练,其中指定了steps_per_epoch、epochs、verbose等参数。

  5. 最后,使用save方法把训练好的模型保存到指定路径下的h5文件格式中。
    请添加图片描述
    这是我运行后训练处的模型

定义函数读取测试文件夹中的照片

def read_random_image():
    folder = r'E:\\ma1ogo3ushu4ju4ji2\\dogs_cats\\data\\test\\'
    file_path = folder + random.choice(os.listdir(folder))
    print(file_path)
    pil_im = Image.open(file_path, 'r')
    return pil_im

这个就是定义一个函数随机取到文件夹中的图片进行测试

对一个使用模型对读取出的图片进行预测

def get_predict(pil_im, model):
    # 对图片进行缩放
    pil_im = pil_im.resize((200, 200))
    # 将格式转换为 numpy array 格式
    array_im = np.asarray(pil_im)
    array_im = np.expand_dims(array_im, axis=0)
    # 对图片进行预测
    result = model.predict(array_im)
    if result[0][0] > 0.5:
        print("预测结果是:狗")
    else:
        print("预测结果是:猫")

下面是完整代码+数据集

在这里插入图片描述
只需要把这三个文件夹放在E盘的根目录下(路径都写好的所以放在E盘根目录下,如果你想放别的地儿你就改改) 然后用Pycharm运行CNN_predict.py文件就可以,如果想要自己训练可以先执行CNN_train.py文件

下面是网盘链接需要可以自取
链接:https://pan.baidu.com/s/13-PBIvOs1GXpSnf3snQtzg?pwd=mo1s
提取码:mo1s

运行结果

有可能识别会有误,它主要是跟模型和数据集训练的大小有关
在这里插入图片描述

运行中可能遇到的bug

pydot和graphviz的包下载问题
解决办法
pip install pydot

然后第二个包要去官网下载
而且要下载32bit的不能64bit亲身试验
https://graphviz.gitlab.io/download/ 官网
下载之后配置一下
在这里插入图片描述
在这里插入图片描述
有这两个包然后就可以了

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: BP神经网络是一种常用的人工神经网络,可以用于手写数字识别。在Python中,可以使用第三方库如TensorFlow、Keras、PyTorch等来实现BP神经网络。具体实现步骤包括:1.准备手写数字数据集;2.将数据集分为训练集和测试集;3.构建BP神经网络模型;4.训练模型;5.测试模型准确率。通过不断调整神经网络的参数和结构,可以提高手写数字识别的准确率。 ### 回答2: BP神经网络(BP neural network)是一种常用的人工神经网络算法,可以实现手写数字识别。在Python中,可以使用一些库来实现此功能,例如TensorFlow、PyTorch或Keras。 首先需要准备一个手写数字识别数据集,比如常用的MNIST数据集。该数据集包含了大量的手写数字图像和对应的标签。可以使用Python的相关库,如scikit-learn或TensorFlow提供的API,快速获取和加载这些数据。 接下来,需要搭建BP神经网络模型。可以使用上述库提供的各种API、类和函数来创建一个神经网络模型。可以选择不同的网络架构,比如使用多个隐藏层,每个隐藏层有不同的神经元数量。也可以根据实际情况设置不同的激活函数和损失函数,如ReLU、sigmoid或softmax等。 然后,使用训练集对模型进行训练。通过多次迭代,将输入的手写数字图像与其对应的输出标签进行比较,并通过反向传播算法不断调整模型的权重和偏置,以使模型的损失函数逐渐减小。 最后,使用测试集对训练好的模型进行测试和评估。将测试集中的手写数字图像输入到模型中,然后与对应的真实标签进行比较,计算模型的准确率和其他评估指标。 总结来说,使用Python中的相关库和算法,可以实现BP神经网络来进行手写数字识别。通过准备数据集、搭建模型、训练模型和评估模型的过程,可以实现高效准确地识别手写数字的功能。 ### 回答3: 实现手写数字识别的方法之一是使用BP神经网络BP神经网络是一种常见的人工神经网络,它通过反向传播算法来训练和优化网络参数。 在Python中,我们可以使用一些开源的深度学习库(如TensorFlow、Keras或PyTorch)来实现BP神经网络进行手写数字识别。 首先,需要准备一个包含大量手写数字的训练集和测试集。我们可以使用MNIST(Modified National Institute of Standards and Technology)数据集,它包含了60000个训练样本和10000个测试样本。 然后,我们可以使用Python中的深度学习库来创建和训练BP神经网络模型。下面是一个使用Keras库的示例代码: 1. 引入所需库: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.datasets import mnist ``` 2. 加载和预处理数据集: ```python (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(x_train.shape[0], 784).astype('float32') / 255 x_test = x_test.reshape(x_test.shape[0], 784).astype('float32') / 255 y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) ``` 3. 构建神经网络模型: ```python model = Sequential() model.add(Dense(units=512, input_dim=784, activation='relu')) model.add(Dense(units=512, activation='relu')) model.add(Dense(units=10, activation='softmax')) ``` 4. 编译和训练模型: ```python model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=128) ``` 5. 对新样本进行预测: ```python predictions = model.predict(x_test) ``` 以上是BP神经网络实现手写数字识别Python代码示例。在实际操作中,还可以进行模型调参、数据增强和模型评估等进一步优化措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值