基于vgg16的迁移学习,训练自己的数据集(含预测结果)

本文介绍了vgg16网络的基础知识,包括其结构特点和参数优势。通过详细步骤展示了如何运用vgg16进行迁移学习,涉及数据集准备、预训练权重下载、标注文件生成、TFRecord文件制作以及模型训练。经过20万代训练,验证集上的准确率达到90.75%。
摘要由CSDN通过智能技术生成

1.vggNet简介

vgg16是2014年由牛津大学提出的一个深度神经网络模型,该模型在2014年的ILSVRC分类比赛中,取得了第二名的成绩,而第一名当属大名鼎鼎的googleNet,vggNet包含5种网络类型,如下图所示:

常见的有vgg16和vgg19。顾名思义vgg16有16层,包含13层卷积池化层和3层全连接层。而vgg19包含16层卷积池化层和3层全连接层。vggNet全部使用1x1,3x3的卷积核,而且vggNet证明了两个3x3的卷积核可以等效为一个5x5的卷积核,下图示

                       


一张5x5的图经两个3x3的卷积核卷积后得到一张1x1的特征图,等效为一个5x5的卷积核。同时在参数量上可以发现,5x5的卷积核的参数量是5x5=25,两个3x3的卷积核是2x3x3=18,参数量是减少了的28%,同时由于与一个5x5的卷积核卷积只需一次非线性激活,而与两个卷积核卷积可以进行两次非线性激活变换,非线性表征加强了,增加了CNN对特征的学习能力。另外1x1卷积核能实现降维,增加非线性。


2.vgg16实现迁移学习

1.数据集准备,我使用8类数据,分别是truck,tiger,flower,kittycat,guitar,houses,plane,person,数据每类训练集500张,验证集300张

2.vgg16预训练权重下载,我把它放在我的百度网盘里了,密码fwi4

3.生成train.txt,val.txt,label.txt

create_labels_files.py

# -*-coding:utf-8-*-

import os
import os.path

def write_txt(content, filename, mode='w'):
    """保存txt数据
    :param content:需要保存的数据,type->list
    :param filename:文件名
    :param mode:读写模式:'w' or 'a'
    :return: void
    """
    with open(filename, mode) as f:
        for line in content:
            str_line = ""
            for col, data in enumerate(line):
                if not col == len(line) - 1:
                    # 以空格作为分隔符
                    str_line = str_line + str(data) + " "
                else:
                    # 每行最后一个数据用换行符“\n”
                    str_line = str_line + str(data) + "\n"
            f.write(str_line)


def get_files_list(dir):
    '''
    实现遍历dir目录下,所有文件(包含子文件夹的文件)
    :param dir:指定文件夹目录
    :return:包含所有文件的列表->list
    '''
    # parent:父目录, filenames:该目录下所有文件夹,filenames:该目录下的文件名
    files_list = []
    for parent, dirnames, filenames in os.walk(dir):
        for filename in filenames:
            print("parent is: " + parent)
            print("filename is: " + filename)
            # print(os.path.join(parent, filename))  # 输出rootdir路径下所有文件(包含子文件)信息
            curr_file = parent.split(os.sep)[-1]
            if curr_file == 'flower':
                labels = 0
            elif curr_file == 'guitar':
                labels = 1
            elif curr_file == 'person':
                labels = 2
            elif curr_file == 'houses':
                labels = 3
            elif curr_file == 'plane':
                labels = 4
            elif curr_file == 'tiger':
                labels = 5
            elif curr_file == 'kittycat':
                labels = 6
            elif curr_file == 'truck':
                labels = 7
            files_list.append([os.path.join(curr_file, filename), labels])
            print(files_list)
    return files_list


if __name__ == '__main__':
    train_dir = 'dataset/train'
    train_txt = 'dataset/train.txt'
    train_data = get_files_list(train_dir)
    write_txt(train_data, train_txt, mode='w')

    val_dir = 'dataset/val'
    val_txt = 'dataset/val.txt'
    val_data = get_files_list(val_dir)
    write_txt(val_data, val_txt, mode='w')

4.制作tf.record文件

create_tf_record.py

# -*-coding: utf-8 -*-

import tensorflow as tf
import numpy as np
import os
import cv2
import matplotlib.pyplot as plt
import random
from PIL import Image

def _int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
# 生成字符串型的属性
def _bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
# 生成实数型的属性
def float_list_feature(value):
  return tf.train.Feature(float_list=tf.train.FloatList(value=value))

def get_example_nums(tf_records_filenames):
    '''
    统计tf_records图像的个数(example)个数
    :param tf_records_filenames: tf_records文件路径
    :return:
    '''
    nums= 0
    for record in tf.python_io.tf_record_iterator(tf_records_filenames):
        nums += 1
    return nums

def show_image(title,image):
    '''
    显示图片
    :param title: 图像标题
    :param image: 图像的数据
    :return:
    '''
    # plt.figure("show_image")
    # print(image.dtype)
    plt.imshow(image)
    plt.axis('on')    # 关掉坐标轴为 off
    plt.title(title)  # 图像题目
    plt.show()

def load_labels_file(filename,labels_num=1,shuffle=False):
    '''
    载图txt文件,文件中每行为一个图片信息,且以空格隔开:图像路径 标签1 标签2,如:test_image/1.jpg 0 2
    :param filename:
    :param labels_num :labels个数
    :param shuffle :是否打乱顺序
    :return:images type->list
    :return:labels type->list
    '''
    images=[]
    labels=[]
    with open(filename) as f:
        lines_list=f.readlines()
        if shuffle:
            random.shuffle(lines_list)

        for lines in lines_list:
            line=lines.rstrip().split(' ')
            label=[]
            for i in range(labels_nu
  • 5
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 非常感谢您的提问。关于使用Python基于迁移学习训练一个模型的问题,我可以回答。 使用Python进行迁移学习训练一个模型的步骤如下: 1. 选择一个预训练的模型,如VGG、ResNet或Inception等。 2. 用预训练的模型作为特征提取器,提取输入数据集的特征。 3. 将提取的特征输入到一个新的全连接层中,用于分类或回归。 4. 对新的全连接层进行训练,更新权重参数。 5. 对整个模型进行微调,包括预训练模型的权重和新的全连接层的权重。 6. 用测试数据集对模型进行评估,调整模型的超参数和训练参数,直到达到最佳性能。 以上是使用Python基于迁移学习训练一个模型的基本步骤。具体实现过程中,需要根据具体问题和数据集进行调整和优化。希望对您有所帮助。 ### 回答2: 使用Python利用迁移学习训练一个模型可以通过以下步骤进行: 1. 导入所需的Python库,如TensorFlow和Keras等。这些库提供了训练和构建模型所需的功能和工具。 2. 下载预训练模型权重。预训练模型通常是在大型数据集上进行训练后得到的,具有良好的特征提取能力。可以从TensorFlow和Keras的官方网站下载这些模型的权重。 3. 创建模型。使用Keras或TensorFlow等库创建一个模型。可以选择使用预训练模型的全部网络结构,也可以根据需要对其进行调整。 4. 设置迁移学习的方式。迁移学习可以通过冻结预训练模型的一部分或全部层来进行。冻结的层不会在训练过程中更新权重,而是保持原有的特征提取能力。可以根据任务需求选择合适的层进行冻结。 5. 设置自定义的输出层。根据要解决的具体问题,添加适当的自定义输出层。输出层的结构和神经元数量通常根据数据集和任务类型进行调整。 6. 编译和训练模型。编译模型需要设置损失函数、优化器和评估指标等。然后,使用数据集对模型进行训练。可以根据需要设置训练的批次大小、迭代次数和学习率等参数。 7. 进行模型评估和预测。使用测试集对训练好的模型进行评估,计算模型的准确率、损失值等指标。然后,使用模型进行预测,得出对新样本的分类结果。 8. 进行模型微调(可选)。根据实际情况,可以对模型进行微调,以进一步提高模型性能。可以解冻一些层进行训练,并根据需要进行调整。 9. 保存模型。将训练好的模型保存到硬盘上,以便在需要时进行加载和使用。 使用Python进行迁移学习训练模型可以简化模型构建的过程,并节省大量的训练时间。通过利用预训练模型的特征提取能力,可以在小规模数据集上实现高效的训练预测。同时,Python提供了丰富的工具和库,使得迁移学习训练模型的过程更加方便和灵活。 ### 回答3: 基于迁移学习使用Python训练模型可以大大加快模型训练的速度和提高模型的准确性。迁移学习是指将已经在大规模数据集训练好的深度学习模型的参数、网络架构等迁移到一个新的任务上进行训练。 首先,在Python中使用深度学习框架(如TensorFlow、PyTorch等)加载预训练好的模型。这些模型通常是在大规模数据集上进行训练得到的,如ImageNet数据集。可以使用框架提供的函数加载模型的参数,并创建一个新的模型结构。 接下来,冻结预训练模型的参数,即将这些参数设置为不可训练。这样做是因为预训练模型已经在大规模数据集训练得到了较好的特征提取能力,我们只需要在新的任务上微调这些特征。 然后,在新的任务上构建新的模型结构,一般需要去掉原模型的输出层,并添加新的层来适应新的任务。根据新任务的要求,可以选择添加全连接层、卷积层或其他类型的层。 在构建新的模型结构后,使用Python编写代码进行模型训练。这包括指定损失函数、优化算法、学习率等超参数,并使用新的数据集进行训练。可以根据需要调整超参数,使用训练集和验证集来监控模型的性能,并进行适当的调整。 最后,使用训练好的模型在测试集或实际应用中进行评估。可以通过计算准确率、召回率、F1得分等指标来评估模型的性能。 总之,通过使用Python进行迁移学习,我们可以充分利用已有的预训练模型,快速训练一个适应新任务的模型。这种方法不仅可以节省数据集和计算资源的成本,还可以提高模型的准确性和效率。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值