基于VGG-19的猫十二分类

1.数据详情

cat_12数据集包含3个部分,训练集cat_12_train,测试集cat_test,以及存储图片名称及标签的train_list.txt

2.数据预处理

train_list.txt文件存储了文件名称和标签,文件格式如下,我们定义了prepare_image函数分别将文件路径与标签存储于X_train与y_train中,并打乱数据

 加载数据时,使用keras.image模块进行数据的加载,并进行数据归一化操作

from keras.preprocessing import image
import random
# 分离路径与标签
def prepare_image(file_path):
    X_train = []
    y_train = []

    with open(file_path) as f:
        context = f.readlines()
    random.shuffle(context)

    for str in context:
        str = str.strip('\n').split('\t')

        X_train.append('./cat_12/' + str[0])
        y_train.append(str[1])

    return X_train, y_train


# 数据归一化
def preprocess_image(img):
    img = image.load_img(img, target_size=(224, 224))
    img = image.img_to_array(img)
    img = img / 255.0
    return img

3.构建VGG 19并进行训练

(1)构建VGG_block模块

一个模块就代表VGG网络中的卷积组

class Vgg_Block(keras.layers.Layer):
    def __init__(self, units, filters, **kwargs):
        super().__init__(**kwargs)
        self.main_layer = []
        for i in range(units):
            self.main_layer.append(keras.layers.Conv2D(filters=filters, kernel_size=(3, 2),
                                                       padding="same", strides=(1, 1),
                                                       activation="relu"))
        self.main_layer.append(keras.layers.MaxPool2D(pool_size=(2, 2)))

    def call(self, inputs):
        Z = inputs
        for layer in self.main_layer:
            Z = layer(Z)
        return Z

(2)构建VGG 19模型

model = keras.models.Sequential()
model.add(keras.layers.Input(shape=(224, 224, 3)))
model.add(Vgg_Block(2, 64))
model.add(Vgg_Block(2, 128))
model.add(Vgg_Block(4, 256))
model.add(Vgg_Block(4, 512))
model.add(Vgg_Block(4, 512))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(4096, activation="relu"))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(4096, activation="relu"))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(12, activation="softmax"))

(3).模型训练完整代码如下

from dataset import prepare_image, preprocess_image
import tensorflow as tf
from tqdm import tqdm
import numpy as np
from matplotlib import pyplot as plt

X_train, y_train = prepare_image('./cat_12/train_list.txt')
train_images = []

for i in tqdm(X_train):
    train_image = preprocess_image(i)
    train_images.append(train_image)

from tensorflow import keras

train_images = np.array(train_images)
print(train_images.shape)
y_train = keras.utils.to_categorical(y_train, 12)


class Vgg_Block(keras.layers.Layer):
    def __init__(self, units, filters, **kwargs):
        super().__init__(**kwargs)
        self.main_layer = []
        for i in range(units):
            self.main_layer.append(keras.layers.Conv2D(filters=filters, kernel_size=(3, 2),
                                                       padding="same", strides=(1, 1),
                                                       activation="relu"))
        self.main_layer.append(keras.layers.MaxPool2D(pool_size=(2, 2)))

    def call(self, inputs):
        Z = inputs
        for layer in self.main_layer:
            Z = layer(Z)
        return Z


model = keras.models.Sequential()
model.add(keras.layers.Input(shape=(224, 224, 3)))
model.add(Vgg_Block(2, 64))
model.add(Vgg_Block(2, 128))
model.add(Vgg_Block(4, 256))
model.add(Vgg_Block(4, 512))
model.add(Vgg_Block(4, 512))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(4096, activation="relu"))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(4096, activation="relu"))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(12, activation="softmax"))

# keras.utils.plot_model(model=model, to_file='AlexNet.png', show_shapes=True)

model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
history = model.fit(train_images, y_train, epochs=20, batch_size=16, validation_split=0.2)

model.save('the_AlexNet_model.h5')


def show_training_history(train_history, train, val):
    plt.plot(train_history[train], linestyle='-', color='b')
    plt.plot(train_history[val], linestyle='--', color='r')
    plt.xlabel('Epoch', fontsize=12)
    plt.ylabel('train', fontsize=12)
    plt.legend(['train', 'validation'], loc='lower right')
    plt.show()


show_training_history(history.history, 'loss', 'val_loss')
show_training_history(history.history, 'acc', 'val_acc')

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
深度学习是一种机器学习的分支,其目标是通过模仿人脑神经网络的工作方式来模拟和理解人类的智能行为。TensorFlow是一个强大的深度学习框架,它提供了丰富的工具和函数来构建和训练神经网络模型。 在图像领域中,一项有趣的实验是图像风格迁移。这是一种技术,将一张图像的风格应用于另一张图像,创造出一幅以第一幅图像风格为基础的新图像。其中VGG-19是一种深度卷积神经网络模型,被广泛用于图像识别和图像风格迁移任务。 图像风格迁移实验基于VGG-19模型的步骤如下:首先,我们需要将待迁移的风格图像和内容图像加载到模型中。然后,通过计算内容图像和目标图像之间的差异来定义一个损失函数。该损失函数包括内容损失和风格损失两部分,内容损失用于保留内容图像的特征,风格损失用于学习风格图像的特征。 接下来,我们使用梯度下降的优化算法来最小化损失函数,从而生成目标图像。在每次迭代中,我们根据当前生成的图像的梯度来更新输入图像。 在实验过程中,我们可以观察到生成图像逐渐采用了风格图像的特征,并保留了内容图像的主要结构。通过调整不同的参数和迭代次数,我们可以获得不同风格和质量的图像。 综上所述,VGG-19模型的图像风格迁移实验利用了深度学习和TensorFlow的强大功能。它为我们提供了一种有趣的方式来创造具有不同风格的图像,并有助于我们更深入地理解和应用深度学习的原理和技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱花的浪漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值