Tensorflow---使用Tensorflow进行VGG模型的迁移学习和自定义训练

一、代码中所需的数据集可以通过以下链接进行下载

百度网盘提取码:lala

二、代码运行环境

Tensorflow-gpu==2.4.0

Python==3.7

三、数据的读取处理代码如下:

import tensorflow as tf
import os
import glob
import random
import matplotlib.pyplot as plt

# 环境变量的配置
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'

label_to_index = {
    'cat': 0,
    'dog': 1
}

index_to_label = {
    0: 'cat',
    1: 'dog'
}


# 进行图片的解析,同时进行图片增强
def train_load_image_by_path(path, label):
    img = tf.io.read_file(path)
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.resize(img, [360, 360])
    img = tf.image.random_crop(img, [256, 256, 3])  # 随机裁剪
    img = tf.image.random_flip_left_right(img)  # 随机左右翻转
    img = tf.image.random_flip_up_down(img)  # 随机上下翻转
    # img = tf.image.random_brightness(img, 0.5)  # 随机改变亮度
    # img = tf.image.random_contrast(img, 0, 1)  # 随机改变图像的对比度
    img = tf.cast(img, tf.float32)
    img = img / 255.0
    label = [tf.cast(label, tf.int64)]
    return img, label


# 进行图片的解析
def test_load_image_by_path(path, label):
    img = tf.io.read_file(path)
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.resize(img, [256, 256])
    img = tf.cast(img, tf.float32)
    img = img / 255.0
    label = [tf.cast(label, tf.int64)]
    return img, label


# 数据的提取
def make_dataset():
    train_image_path = glob.glob('dataset/train/*.jpg')
    random.shuffle(train_image_path)
    train_image_label = [label_to_index.get(img_path.split('\\')[1].split('.')[0]) for img_path in train_image_path]

    dataset = tf.data.Dataset.from_tensor_slices((train_image_path, train_image_label))
    count = len(train_image_path)
    test_count = int(count * 0.2)

    train_dataset = dataset.skip(test_count)
    test_dataset = dataset.take(test_count)

    train_dataset = train_dataset.map(train_load_image_by_path, num_parallel_calls=tf.data.experimental.AUTOTUNE)
    train_dataset = train_dataset.shuffle(100).batch(16)
    train_dataset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE)

    test_dataset = test_dataset.map(test_load_image_by_path, num_parallel_calls=tf.data.experimental.AUTOTUNE)
    test_dataset = test_dataset.batch(16)
    test_dataset = test_dataset.prefetch(tf.data.experimental.AUTOTUNE)

    return train_dataset, test_dataset


if __name__ == '__main__':
    train_data, test_data = make_dataset()
    for imgg, labeel in test_data.take(1):
        plt.title(index_to_label.get(labeel.numpy()[0][0]))
        plt.imshow(imgg[0])
        plt.show()

四、模型的构建如下:

import tensorflow as tf
import os

# 环境变量的配置
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'


# 进行模型的构建
def make_model():
    conv_base = tf.keras.applications.VGG16(weights='imagenet', include_top=False)
    model = tf.keras.Sequential()
    model.add(conv_base)
    model.add(tf.keras.layers.GlobalAveragePooling2D())
    model.add(tf.keras.layers.Dense(512, activation='relu'))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    conv_base.trainable = False
    model.summary()
    return model


if __name__ == '__main__':
    make_model()

五、模型的训练如下:

import tensorflow as tf
import os
from data_loader import make_dataset
from model import make_model
import tqdm
import datetime

# 环境变量的配置
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'

# 数据的加载
train_dataset, test_dataset = make_dataset()

# 模型的构建
my_model = make_model()

# 模型的相关配置
loss_func = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.Adam()

# 评估指标
train_loss_mean = tf.keras.metrics.Mean('train_loss')
train_accuracy = tf.keras.metrics.Accuracy('train_accuracy')
test_loss_mean = tf.keras.metrics.Mean('test_loss')
test_accuracy = tf.keras.metrics.Accuracy('test_accuracy')

# 日志写入定义
run_now_time = datetime.datetime.now().strftime('%Y-%m-%d---%H-%M-%S')
log_dir = os.path.join('logs', run_now_time)
train_writer = tf.summary.create_file_writer(logdir=log_dir + 'train')
test_writer = tf.summary.create_file_writer(logdir=log_dir + 'test')

NUM_EPOCHS = 30


# 定义单步训练
def train_steps(model, images, labels):
    with tf.GradientTape() as t:
        pre = model(images)
        loss_step = loss_func(labels, pre)
    grads = t.gradient(loss_step, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))
    train_loss_mean(loss_step)
    train_accuracy(labels, tf.cast(pre > 0.5, tf.int32))


# 定义单步测试
def test_steps(model, images, labels):
    pre = model(images)
    loss_step = loss_func(labels, pre)
    test_loss_mean(loss_step)
    test_accuracy(labels, tf.cast(pre > 0.5, tf.int32))


def train():
    for epoch in range(NUM_EPOCHS):
        train_tqdm = tqdm.tqdm(iter(train_dataset), total=len(train_dataset))
        for image, label in train_tqdm:
            train_steps(my_model, image, label)
            train_tqdm.set_description_str('Epoch: {}'.format(epoch))
            train_tqdm.set_postfix_str(
                'Train loss : {} Train accuracy is : {}'.format(train_loss_mean.result(), train_accuracy.result()))
        with train_writer.as_default():
            tf.summary.scalar('train_loss', data=train_loss_mean.result(), step=epoch)
            tf.summary.scalar('train_accuracy', data=train_accuracy.result(), step=epoch)
        train_tqdm.close()
        train_loss_mean.reset_states()
        train_accuracy.reset_states()

        test_tqdm = tqdm.tqdm(iter(test_dataset), total=len(test_dataset))
        for image_test, label_test in test_tqdm:
            test_steps(my_model, image_test, label_test)
            test_tqdm.set_description_str('Epoch: {}'.format(epoch))
            test_tqdm.set_postfix_str(
                'Test loss : {} Test accuracy is : {}'.format(test_loss_mean.result(), test_accuracy.result()))
        with test_writer.as_default():
            tf.summary.scalar('test_loss', data=test_loss_mean.result(), step=epoch)
            tf.summary.scalar('test_accuracy', data=test_accuracy.result(), step=epoch)
        test_tqdm.close()
        test_loss_mean.reset_states()
        test_accuracy.reset_states()


if __name__ == '__main__':
    train()

六、模型预测代码如下:

import tensorflow as tf
import os
from data_loader import index_to_label
import matplotlib.pyplot as plt

# 环境变量的配置
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'

# 模型的加载
my_model = tf.keras.models.load_model(r'model_data/model.h5')


# 图片的读取
def load_image(path):
    image = tf.io.read_file(path)
    image = tf.image.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, [256, 256])
    image = tf.cast(image / 256, tf.float32)
    return image


# 进行预测
while True:
    input_path = input('请输入图片路径:\n')
    try:
        img = load_image(input_path)
    except:
        print('路径输入不正确!\n')
        continue
    else:
        plt.imshow(img)
        img = tf.expand_dims(img, 0)
        pre = my_model(img)
        plt.title(index_to_label.get(tf.cast(pre > 0.5, tf.int32).numpy()[0][0]))
        plt.show()

七、模型训练过程中,各个指标的变化情况

训练的Loss变化曲线
训练的准确率变化曲线
测试时Loss变化曲线
测试时准确率变化曲线

八、模型的预测结果如下

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用TensorFlow中提供的预训练模型来实现VGG-19网络。以下是一些步骤: 1.导入TensorFlow和其他必要的库。 2.下载VGG-19模型的预训练权重文件。这些文件可以在TensorFlow官方提供的链接中找到。 3.建立VGG-19模型的图表,并将模型加载到会话中。 4.准备输入图像并将其传递给模型进行预测。 5.获取模型输出,这将是一个具有1000个元素的向量,每个元素表示一个类别。 6.使用softmax函数将输出向量转换为概率分布,以便可以识别最可能的类别。 7.根据预测结果,可以采取不同的行动,比如输出类别标签或对图像进行进一步的处理。 以下是一个用TensorFlow实现VGG-19模型的参考代码: ``` import tensorflow as tf import numpy as np import urllib.request def download(url, filename): urllib.request.urlretrieve(url, filename) def load_image(filename): image = tf.keras.preprocessing.image.load_img(filename, target_size=(224, 224)) image = tf.keras.preprocessing.image.img_to_array(image) image = np.expand_dims(image, axis=0) image = tf.keras.applications.vgg19.preprocess_input(image) return image def VGG19(input_shape=(224,224,3), output_shape=1000, weights_path=None): vgg19 = tf.keras.applications.VGG19(include_top=True, input_shape=input_shape, weights=None, classes=output_shape) if weights_path: vgg19.load_weights(weights_path) return vgg19 download("http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat", "vgg19_weights.h5") input_shape = (224, 224, 3) output_shape = 1000 weights_path = "vgg19_weights.h5" image = load_image("test_image.jpg") model = VGG19(input_shape, output_shape, weights_path) outputs = model.predict(image) preds = tf.keras.applications.vgg19.decode_predictions(outputs, top=1)[0] print("Predicted class: {}".format(preds[0][1])) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

水哥很水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值