tensorflow分类——卷积神经网络猫狗分类问题练习

一、数据集下载
下载链接:https://www.kaggle.com/datasets/biaiscience/dogs-vs-cats
在这里插入图片描述
二、数据集准备
我们使用的训练集将cat和dog放在一个文件夹里面,所以后面我将文件名全部读入放在dataframe,使用flow_from_dataframe,
三、训练需遇到了bug出现:TypeError: array() takes 1 positional argument but 2 were given
tf.keras.preprocessing.image.load_img内部使用Pillow 8.3.0,你需要将pillow这个包降到8.2.0.0就可以解决问题了
四、完成代码
简单跑了一下模型,并保存了,后面也加上了绘图方便观察
train_datagen.flow_from_dataframe里面的target_size=(128,128),keras.models.Sequential里面的input——shape(128,128,3)是对应的,如果你的电脑性能不好就将输出的尺寸调小一点,如;(32,32),太大电脑可能会卡死,epochs数字小点训练时间会断点,毕竟我们只是看一过程

import os
import pandas as pd
import warnings
import tensorflow as tf
from tensorflow.python import keras
from keras.preprocessing.image import ImageDataGenerator
import keras.optimizers as op
from  tensorflow.python.keras import layers
from sklearn.model_selection import train_test_split

import matplotlib.pyplot as plt
#制定好数据的路径(训练和验证的数据集)
base_dir=r'G:\pycharm\tensorflow_learning\dogandcat\dogs-vs-cats'
test_dir=os.path.join(base_dir,'test1')
train_dir=os.path.join(base_dir,'train')

#读取测试集的所有图片,分类打上标签
filenames = os.listdir(train_dir)
categories = []
for filename in filenames:
    category = filename.split('.')[0]
    if category == 'dog':
        categories.append(str(1))
    else:
        categories.append(str(0))

df= pd.DataFrame({
    'filename': filenames,
    'category': categories
})

#从测试集上划分训练集和验证集
x_train, x_val = train_test_split(df, test_size=0.2, random_state=2)
x_train = x_train.reset_index(drop=True)
x_val = x_val.reset_index(drop=True)



#数据预处理操作,读取数据,利用现有的图片数据,进行数加强,增加样本量
train_datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
    rescale=1./255)


valid_datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
    rescale=1./255)

train_generator = train_datagen.flow_from_dataframe(
    x_train,
    train_dir,
    x_col='filename',
    y_col='category',
    target_size=(128,128),
    class_mode="categorical",
 )

valid_generator = valid_datagen.flow_from_dataframe(
    x_val,
    train_dir,
    x_col='filename',
    y_col='category',
    target_size=(128,128),
    class_mode="categorical",
 )


#架构网络模型,使用卷积网络进行分类
'''
#准确率只有0.6
model=keras.models.Sequential([
    layers.Conv2D(32,(3,3),activation='relu',input_shape=(128,128,3)),
    layers.MaxPool2D(2,2),

    layers.Conv2D(64,(3,3),activation='relu'),
    layers.MaxPool2D(2,2),

    layers.Conv2D(128,(3,3),activation='relu'),
    layers.MaxPool2D(2,2),
    #为全连接层做准备
    layers.Flatten(),
    layers.Dense(512,activation='relu'),
    #使用sigmoid进行二分类
    layers.Dense(2,activation='sigmoid')
                               ])
'''
#模型优化:准确率达到0.71,上个模型会发生过拟合状况,所用我们使用了dropout
model = keras.models.Sequential([
                         keras.layers.Conv2D(filters=64, kernel_size=3, strides=(1,1), padding='valid',activation= 'relu', input_shape=(128,128,3)),
                         keras.layers.MaxPooling2D(pool_size=(2,2)),
                         keras.layers.Conv2D(filters=128, kernel_size=3, strides=(2,2), padding='same', activation='relu'),
                         keras.layers.MaxPooling2D(pool_size=(2,2)),
                         keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2,2), padding='same', activation='relu'),
                         keras.layers.MaxPooling2D(pool_size=(2,2)),
                         keras.layers.Flatten(),
                         keras.layers.Dense(units=128, activation='relu'),
                         keras.layers.Dropout(0.25),
                         keras.layers.Dense(units=256, activation='relu'),
                         keras.layers.Dropout(0.5),
                         keras.layers.Dense(units=256, activation='relu'),
                         keras.layers.Dropout(0.25),
                         keras.layers.Dense(units=128, activation='relu'),
                         keras.layers.Dropout(0.10),
                         keras.layers.Dense(units=2, activation='softmax')
])
#model.summary()

model.compile(loss='categorical_crossentropy',
 optimizer='adam',
 metrics=['acc'])

history = model.fit(train_generator, epochs=30, verbose=1, validation_data=valid_generator)


#保存模型
model.save('cat_vs_dog.h5')


#将准确率和损失率画图显示出来
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以通过TensorFlow卷积神经网络来实现识别。卷积神经网络是一种深度学习模型,可以对图像进行分类和识别。在识别中,我们可以使用卷积神经网络来训练模型,使其能够准确地识别的图像。具体实现过程需要涉及到数据预处理、模型构建、训练和测试等步骤。 ### 回答2: 识别是计算机视觉领域的一个重要任务,其中卷积神经网络是一种常用的深度学习模型。Python语言可以通过TensorFlow框架实现卷积神经网络来识别卷积神经网络主要由卷积层、池化层、全连接层和softmax输出层组成。卷积层可以提取图像的特征,池化层可以压缩图像的大小,全连接层可以将提取的特征映射到类别,最后softmax输出层可以将最终结果归一化为概率。 在Python中,可以使用TensorFlow的高级API来构建卷积神经网络。首先需要导入相关模块和数据集,例如: ``` import tensorflow as tf from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale=1./255) val_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( 'train', target_size=(150, 150), batch_size=32, class_mode='binary') validation_generator = val_datagen.flow_from_directory( 'validation', target_size=(150, 150), batch_size=32, class_mode='binary') ``` 以上代码中,首先导入了需要使用的模块,然后使用`ImageDataGenerator`对训练集和验证集进行数据增强和归一化处理,最后用`flow_from_directory`方法读取数据集并设置相关参数。 接下来可以构建卷积神经网络,例如: ``` model = tf.keras.models.Sequential([ Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)), MaxPooling2D(2,2), Conv2D(64, (3,3), activation='relu'), MaxPooling2D(2,2), Conv2D(128, (3,3), activation='relu'), MaxPooling2D(2,2), Conv2D(128, (3,3), activation='relu'), MaxPooling2D(2,2), Flatten(), Dense(512, activation='relu'), Dropout(0.5), Dense(1, activation='sigmoid') ]) ``` 以上代码中,先使用`Sequential`方法定义模型,然后添加卷积层、池化层、全连接层和输出层,其中使用了`Dropout`方法进行正则化操作。最后可以使用`compile`方法来配置模型训练所需的优化器、损失函数和评估指标,例如: ``` model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) ``` 训练模型时,可以使用`fit`方法来训练模型并评估模型的性能,例如: ``` history = model.fit_generator( train_generator, steps_per_epoch=100, epochs=30, validation_data=validation_generator, validation_steps=50) ``` 以上代码中,`fit_generator`方法可以对模型进行训练,其中需要设置训练集和验证集的`generator`,以及设置训练的步数和训练的轮数等参数。 在训练完卷积神经网络后,可以使用`save`方法将训练好的模型保存下来,例如: ``` model.save('cat_dog_model.h5') ``` 以上代码中,`save`方法可以将模型保存到本地文件,并可以在后续使用时进行加载和使用。 总之,通过PythonTensorFlow框架可以很方便地实现卷积神经网络进行识别,从而可以对计算机视觉领域有更深入的了解和实践。 ### 回答3: 识别是计算机视觉中的一个重要问题,可以通过卷积神经网络(CNN)来解决。Python语言中的TensorFlow库提供了方便的实现方式。 首先,需要准备的图像数据集,并将图像转换为数据矩阵。数据集可以使用Kaggle上的Dogs vs. Cats数据集,或自己收集。对于图像的处理,可以使用Pillow库。 接下来,需要构建卷积神经网络模型。在TensorFlow中,可以使用Keras API来创建并编译模型。简单来说,卷积神经网络由卷积层、池化层、全连接层等组成。其中,卷积层是用于提取特征的主要层,池化层是用于减少特征图大小的层,全连接层将特征图转换为最终输出。 在模型构建完成后,需要进行训练和验证。在TensorFlow中,可以使用fit()函数来进行训练。训练时,需要指定损失函数、优化器以及评估指标,并通过epochs和batch_size参数设置迭代次数和每个批次的样本数。验证时,可以使用evaluate()函数评估模型性能。 最后,可以使用预测函数predict()来识别新的图像数据。通过将预测结果与实际标签比较,可以评估模型的准确率和可靠性。 总之,通过Python语言中的TensorFlow库实现识别需要准备数据集、构建模型、进行训练和验证等步骤。相比其他传统机器学习算法,使用卷积神经网络可以显著提高识别准确率,让计算机更加智能化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值