深度學習-Tensorflow2.2-多分類{8}-多輸出模型實例-20


``在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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進行訓練

在這里插入圖片描述

data_dir = "F:/py/ziliao/數據集/multi-output-classification/dataset" # 定義路徑
data_root = pathlib.Path(data_dir)
data_root

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

# 因為要預測顏色和種類 使用切割 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  # 顏色,種類

在這里插入圖片描述

# 編寫一個對應的索引
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

在這里插入圖片描述

# 對每一個圖片label進行編碼
all_image_labels = [pathlib.Path(path).parent.name for path in all_image_paths]
all_image_labels[:5],len(all_image_labels)

在這里插入圖片描述

# 把顏色及物品轉換成對應的序號
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]

在這里插入圖片描述

# 繪制圖片 及 對應的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()

在這里插入圖片描述
加載和格式化圖像

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)

在這里插入圖片描述

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())

在這里插入圖片描述

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()

在這里插入圖片描述

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())

在這里插入圖片描述

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

在這里插入圖片描述

# 划分數據集
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

在這里插入圖片描述

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()

在這里插入圖片描述

# 編譯
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)

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM