深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

   2023-03-08 学习力445
核心提示:import tensorflow as tffrom tensorflow import kerasimport matplotlib.pyplot as plt%matplotlib inlineimport numpy as npimport pathlibimport osimport randomos.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'import IPython.display as display
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pathlib
import os
import random
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
import IPython.display as display
gpu_ok = tf.test.is_gpu_available()
print("tf version:", tf.__version__)
print("use GPU", gpu_ok) # 判断是否使用gpu进行训练

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

data_dir = "F:/py/ziliao/数据集/multi-output-classification/dataset" # 定义路径
data_root = pathlib.Path(data_dir)
data_root

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

for item in data_root.iterdir():
    print(item) # 查看所有目录

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

all_image_paths = list(data_root.glob("*/*")) # 使用glob方法取出所有图片
image_count = len(all_image_paths)
image_count # 查看图片张数

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

all_image_paths = [str(path) for path in all_image_paths]
random.shuffle(all_image_paths)  # 对所有图片路径进行乱序
# 提取目录名称
label_names = sorted(item.name for item in data_root.glob("*/") if item.is_dir()) 
label_names

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

# 因为要预测颜色和种类 使用切割 set取出唯一的值 进行提取
color_label_names = set(name.split("_")[0] for name in label_names)
item_label_names = set(name.split("_")[1] for name in label_names) 

color_label_names,item_label_names  # 颜色,种类

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

# 编写一个对应的索引
color_label_to_index = dict((name,index)for index,name in enumerate(color_label_names))
item_label_to_index = dict((name,index)for index,name in enumerate(item_label_names))

color_label_to_index,item_label_to_index

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

# 对每一个图片label进行编码
all_image_labels = [pathlib.Path(path).parent.name for path in all_image_paths]
all_image_labels[:5],len(all_image_labels)

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

#  把颜色及物品转换成对应的序号
color_labels = [color_label_to_index[label.split("_")[0]]for label in all_image_labels]
item_labels = [item_label_to_index[label.split("_")[1]]for label in all_image_labels]
color_labels[:5],item_labels[:5]

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

# 绘制图片 及 对应的label
for n in range(3):
    image_index = random.choice(range(len(all_image_paths)))
    display.display(display.Image(all_image_paths[image_index],width=100,height=100))
    print(all_image_labels[image_index])
    print()

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20
加载和格式化图像

img_path = all_image_paths[0]
img_path
img_raw = tf.io.read_file(img_path)
print(repr(img_raw)[:100]+"...")
img_tensor = tf.image.decode_image(img_raw)

print(img_tensor.shape)
print(img_tensor.dtype)

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

img_tensor = tf.cast(img_tensor,tf.float32)
img_tensor = tf.image.resize(img_tensor,[224,224])
img_final = img_tensor/255.0
print(img_final.shape)
print(img_final.numpy().min())
print(img_final.numpy().max())

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

def load_and_preporocess_image(path):
    image = tf.io.read_file(path) # 读取图片
    image = tf.image.decode_jpeg(image,channels=3) # 对图片进行解码
    image = tf.image.resize(image,[224,224]) # 定义图片形状
    image = tf.cast(image,tf.float32) # 改变图片的数据类型
    image = image/255.0 # 归一化
    image = 2*image-1  #  归一化到-1到1 之间
    return image
image_path = all_image_paths[0] # 取出第一个路径
label = all_image_labels[0] # 取出第一个label

plt.imshow((load_and_preporocess_image(image_path)+1)/2) # 使用上面函数对图片进行处理
plt.grid(False)
plt.xlabel(label)
print()

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths) # 创建样本数据集
AUTOTUNE = tf.data.experimental.AUTOTUNE
image_ds = path_ds.map(load_and_preporocess_image,num_parallel_calls=AUTOTUNE)
label_ds = tf.data.Dataset.from_tensor_slices((color_labels,item_labels)) # 创建目标值数据集
for ele in label_ds.take(3):
    print(ele[0].numpy(),ele[1].numpy())

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

image_label_ds = tf.data.Dataset.zip((image_ds,label_ds)) # 拼接
image_label_ds

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

# 划分数据集
test_count = int(image_count*0.2) # 测试集取百分之20
train_count = image_count-test_count
train_data = image_label_ds.skip(test_count) # 训练集 : skip 跳过 test数据集
test_data = image_label_ds.take(test_count) #  测试集
BATCH_SIZE = 32 # 定义批次
train_data = train_data.shuffle(buffer_size=train_count).repeat(-1) # 对训练集进行乱序,repeat(-1) 一直重复
train_data = train_data.batch(BATCH_SIZE)
train_data = train_data.prefetch(buffer_size=AUTOTUNE)
train_data

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

test_data = test_data.batch(BATCH_SIZE)

建立模型

mobile_net = tf.keras.applications.MobileNetV2(input_shape=(224, 224, 3),
                                               include_top=False)
inputs = tf.keras.Input(shape=(224, 224, 3))
x = mobile_net(inputs)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x1 = tf.keras.layers.Dense(1024,activation="relu")(x)
out_color = tf.keras.layers.Dense(len(color_label_names),
                                  activation="softmax")(x1)
x2 = tf.keras.layers.Dense(1024,activation="relu")(x)
out_item = tf.keras.layers.Dense(len(item_label_names),
                                 activation="softmax")(x2)
model = tf.keras.Model(inputs = inputs,
                       outputs = [out_color,out_item])
model.summary()

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

# 编译
model.compile(optimizer="adam",
             loss="sparse_categorical_crossentropy", 
             metrics=["acc"])
train_steps = train_count//BATCH_SIZE
test_steps = test_count//BATCH_SIZE
model.fit(train_data,
          epochs=10,
          steps_per_epoch=train_steps,
          validation_data=test_data,
          validation_steps=test_steps)

深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20

 
反对 0举报 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • TensorFlow与Flask结合识别手写体数字
    TensorFlow与Flask结合识别手写体数字
    阅读本文约“2.2分钟”TensorFlow框架        ——TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统        ——可被用于语音识别或图像识别等多项机器学习和深度学习领域        ——TensorFlow是将复杂的数据结构
    03-08
  • 在 GPU 上运行 TensorFlow 教程 (MNIST)
    在 GPU 上运行 TensorFlow 教程 (MNIST)
    介绍我想接触TensorFlow,暂时想运行教程。有GPU!这就是我的想法,但是我很难让它发挥作用,所以我将把信息留在这里。它是为谁准备的?想要在 GPU 上运行 TensorFlow 的人概述基本遵循TensorFlow官方教程它是作为初学者编写的,所以如果它顺利,它很容易!ht
    03-08
  • TensorFlow 开发者证书 PyCharm 相关环境创建与错误斗争+复习
    TensorFlow 开发者证书 PyCharm 相关环境创建与
    介绍2022 年 11 月TensorFlow 开发者证书通过了特定于测试PyCharm我遇到了一个相关的问题,所以我写了这篇文章,因为我想为将来参加考试的人提供有用的信息。 目标:即将考取TensorFlow开发者证书的人 环境:Windows 11 内容:考试过程中出现的错误及解决方法
    03-08
  • tensorflow2.0——LSTM,GRU(Sequential层版)
    前面都是写的cell版本的GRU和LSTM,比较底层,便于理解原理。下面的Sequential版不用自定义state参数的形状,使用更简便: import tensorflow as tfimport osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'assert tf.__version__.startswith('2.')# 设置相关底层
    02-10
  • TensorFlow基础笔记(7) 图像风格化效果与性能优
    参考 http://hacker.duanshishi.com/?p=1693http://blog.csdn.net/hungryof/article/details/53981959http://blog.csdn.net/hungryof/article/details/61195783http://blog.csdn.net/wyl1987527/article/details/70245214https://www.ctolib.com/AdaIN-style.
    02-09
  • Tensorflow报错总结 TensorFlow文档
    输入不对应报错内容:WARNING:tensorflow:Model was constructed with shape (None, 79) for input Tensor("genres:0", shape=(None, 79), dtype=float32), but it was called on an input with incompatible shape (128, 5).定义模型的输入和训练时候传入的in
    02-09
  • 深度学习框架之TensorFlow的概念及安装(ubuntu
    2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源。TensorFlow 是使用数据流图进行数值计算的开源软件库。也就是说,TensorFlow 使用图(graph)来表示计算任务。图中的节点表示数学运算,边表示运算之间用来交流的多维数组(也就是tensor,张量)
    02-09
  • tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数
    tensorflow中 tf.train.slice_input_producer
    tensorflow数据读取机制tensorflow中为了充分利用GPU,减少GPU等待数据的空闲时间,使用了两个线程分别执行数据读入和数据计算。具体来说就是使用一个线程源源不断的将硬盘中的图片数据读入到一个内存队列中,另一个线程负责计算任务,所需数据直接从内存队列
    02-09
  • 机器学习 - pycharm, tensorflow集成篇
    机器学习 - pycharm, tensorflow集成篇
     继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的参考:  http://blog.csdn.net/include1224/article/details/53452824思路其实很简单,说下要点吧1. python必须要3.5 64位版本(上一篇直接装的是64位版本的An
    02-09
  • tensorflow学习之 Eager execution
    tensorflow学习之 Eager execution
      首先tensorflow本身就是一个声明式的编程。而不是命令式的编程。       1、声明式的编程可以简单理解为先统一列出计算形式或者是表达式,然后最终在会话中进行计算。    2、而命令式就像是python本身就是。有初始值,再写出计算式的时候,运行
    02-09
点击排行