5.3 使用tensorflow搭建GoogLeNet网络 笔记
生活随笔
收集整理的這篇文章主要介紹了
5.3 使用tensorflow搭建GoogLeNet网络 笔记
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
B站資源
csdn本家
文章目錄
- model
- model_add_bn
- train
- train_add_bn
- trainGPU
- predict
model
from tensorflow.keras import layers, models, Model, Sequentialdef GoogLeNet(im_height=224, im_width=224, class_num=1000, aux_logits=False):# tensorflow中的tensor通道排序是NHWCinput_image = layers.Input(shape=(im_height, im_width, 3), dtype="float32")# (None, 224, 224, 3)x = layers.Conv2D(64, kernel_size=7, strides=2, padding="SAME", activation="relu", name="conv2d_1")(input_image)# (None, 112, 112, 64)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_1")(x)# (None, 56, 56, 64)x = layers.Conv2D(64, kernel_size=1, activation="relu", name="conv2d_2")(x)# (None, 56, 56, 64)x = layers.Conv2D(192, kernel_size=3, padding="SAME", activation="relu", name="conv2d_3")(x)# (None, 56, 56, 192)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_2")(x)#池化核大小為3,步距為2# (None, 28, 28, 192)x = Inception(64, 96, 128, 16, 32, 32, name="inception_3a")(x)# (None, 28, 28, 256)x = Inception(128, 128, 192, 32, 96, 64, name="inception_3b")(x)# (None, 28, 28, 480)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_3")(x)# (None, 14, 14, 480)x = Inception(192, 96, 208, 16, 48, 64, name="inception_4a")(x)if aux_logits:aux1 = InceptionAux(class_num, name="aux_1")(x)# (None, 14, 14, 512)x = Inception(160, 112, 224, 24, 64, 64, name="inception_4b")(x)# (None, 14, 14, 512)x = Inception(128, 128, 256, 24, 64, 64, name="inception_4c")(x)# (None, 14, 14, 512)x = Inception(112, 144, 288, 32, 64, 64, name="inception_4d")(x)if aux_logits:aux2 = InceptionAux(class_num, name="aux_2")(x)# (None, 14, 14, 528)x = Inception(256, 160, 320, 32, 128, 128, name="inception_4e")(x)# (None, 14, 14, 532)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_4")(x)# (None, 7, 7, 832)x = Inception(256, 160, 320, 32, 128, 128, name="inception_5a")(x)# (None, 7, 7, 832)x = Inception(384, 192, 384, 48, 128, 128, name="inception_5b")(x)# (None, 7, 7, 1024)x = layers.AvgPool2D(pool_size=7, strides=1, name="avgpool_1")(x)# (None, 1, 1, 1024)x = layers.Flatten(name="output_flatten")(x)# (None, 1024)x = layers.Dropout(rate=0.4, name="output_dropout")(x)x = layers.Dense(class_num, name="output_dense")(x)# (None, class_num)aux3 = layers.Softmax(name="aux_3")(x)if aux_logits:model = models.Model(inputs=input_image, outputs=[aux1, aux2, aux3])#無法屏蔽,要用就得帶,不用就不能弄else:model = models.Model(inputs=input_image, outputs=aux3)return model
model_add_bn
from tensorflow.keras import layers, models, Model, Sequentialdef InceptionV1(im_height=224, im_width=224, class_num=1000, aux_logits=False):# tensorflow中的tensor通道排序是NHWCinput_image = layers.Input(shape=(im_height, im_width, 3), dtype="float32")# (None, 224, 224, 3)x = layers.Conv2D(64, kernel_size=7, strides=2, padding="SAME", use_bias=False, name="conv1/conv")(input_image)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv1/bn")(x)x = layers.ReLU()(x)# (None, 112, 112, 64)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_1")(x)# (None, 56, 56, 64)x = layers.Conv2D(64, kernel_size=1, use_bias=False, name="conv2/conv")(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv2/bn")(x)x = layers.ReLU()(x)# (None, 56, 56, 64)x = layers.Conv2D(192, kernel_size=3, padding="SAME", use_bias=False, name="conv3/conv")(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv3/bn")(x)x = layers.ReLU()(x)# (None, 56, 56, 192)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_2")(x)# (None, 28, 28, 192)x = Inception(64, 96, 128, 16, 32, 32, name="inception3a")(x)# (None, 28, 28, 256)x = Inception(128, 128, 192, 32, 96, 64, name="inception3b")(x)# (None, 28, 28, 480)x = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool_3")(x)# (None, 14, 14, 480)x = Inception(192, 96, 208, 16, 48, 64, name="inception4a")(x)if aux_logits:aux1 = InceptionAux(class_num, name="aux1")(x)# (None, 14, 14, 512)x = Inception(160, 112, 224, 24, 64, 64, name="inception4b")(x)# (None, 14, 14, 512)x = Inception(128, 128, 256, 24, 64, 64, name="inception4c")(x)# (None, 14, 14, 512)x = Inception(112, 144, 288, 32, 64, 64, name="inception4d")(x)if aux_logits:aux2 = InceptionAux(class_num, name="aux2")(x)# (None, 14, 14, 528)x = Inception(256, 160, 320, 32, 128, 128, name="inception4e")(x)# (None, 14, 14, 532)x = layers.MaxPool2D(pool_size=2, strides=2, padding="SAME", name="maxpool_4")(x)# (None, 7, 7, 832)x = Inception(256, 160, 320, 32, 128, 128, name="inception5a")(x)# (None, 7, 7, 832)x = Inception(384, 192, 384, 48, 128, 128, name="inception5b")(x)# (None, 7, 7, 1024)x = layers.AvgPool2D(pool_size=7, strides=1, name="avgpool_1")(x)# (None, 1, 1, 1024)x = layers.Flatten(name="output_flatten")(x)# (None, 1024)x = layers.Dropout(rate=0.4, name="output_dropout")(x)x = layers.Dense(class_num, name="fc")(x)# (None, class_num)aux3 = layers.Softmax()(x)if aux_logits:model = models.Model(inputs=input_image, outputs=[aux1, aux2, aux3])else:model = models.Model(inputs=input_image, outputs=aux3)return modelclass Inception(layers.Layer):def __init__(self, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj, **kwargs):super(Inception, self).__init__(**kwargs)self.branch1 = Sequential([layers.Conv2D(ch1x1, kernel_size=1, use_bias=False, name="conv"),layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="bn"),layers.ReLU()], name="branch1")self.branch2 = Sequential([layers.Conv2D(ch3x3red, kernel_size=1, use_bias=False, name="0/conv"),layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="0/bn"),layers.ReLU(),layers.Conv2D(ch3x3, kernel_size=3, padding="SAME", use_bias=False, name="1/conv"),layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="1/bn"),layers.ReLU()], name="branch2") # output_size= input_sizeself.branch3 = Sequential([layers.Conv2D(ch5x5red, kernel_size=1, use_bias=False, name="0/conv"),layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="0/bn"),layers.ReLU(),layers.Conv2D(ch5x5, kernel_size=3, padding="SAME", use_bias=False, name="1/conv"),layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="1/bn"),layers.ReLU()], name="branch3") # output_size= input_sizeself.branch4 = Sequential([layers.MaxPool2D(pool_size=3, strides=1, padding="SAME"), # caution: default strides==pool_sizelayers.Conv2D(pool_proj, kernel_size=1, use_bias=False, name="1/conv"),layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="1/bn"),layers.ReLU()], name="branch4") # output_size= input_sizedef call(self, inputs, **kwargs):branch1 = self.branch1(inputs)branch2 = self.branch2(inputs)branch3 = self.branch3(inputs)branch4 = self.branch4(inputs)outputs = layers.concatenate([branch1, branch2, branch3, branch4])return outputsclass InceptionAux(layers.Layer):def __init__(self, num_classes, **kwargs):super(InceptionAux, self).__init__(**kwargs)self.averagePool = layers.AvgPool2D(pool_size=5, strides=3)self.conv = layers.Conv2D(128, kernel_size=1, use_bias=False, name="conv/conv")self.bn1 = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv/bn")self.rule1 = layers.ReLU()self.fc1 = layers.Dense(1024, activation="relu", name="fc1")self.fc2 = layers.Dense(num_classes, name="fc2")self.softmax = layers.Softmax()def call(self, inputs, **kwargs):# aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14x = self.averagePool(inputs)# aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4x = self.conv(x)x = self.bn1(x)x = self.rule1(x)# N x 128 x 4 x 4x = layers.Flatten()(x)x = layers.Dropout(rate=0.5)(x)# N x 2048x = self.fc1(x)x = layers.Dropout(rate=0.5)(x)# N x 1024x = self.fc2(x)# N x num_classesx = self.softmax(x)return xtrain
from tensorflow.keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt from model import GoogLeNet import tensorflow as tf import json import osdata_root = os.path.abspath(os.path.join(os.getcwd(), "../..")) # get data root path image_path = data_root + "/data_set/flower_data/" # flower data set path train_dir = image_path + "train" validation_dir = image_path + "val"# create direction for saving weights if not os.path.exists("save_weights"):os.makedirs("save_weights")im_height = 224 im_width = 224 batch_size = 32 epochs = 30def pre_function(img):# img = im.open('test.jpg')# img = np.array(img).astype(np.float32)img = img / 255.img = (img - 0.5) * 2.0#做了一個(gè)縮放,截圖中的寫法一樣return img# data generator with data augmentation train_image_generator = ImageDataGenerator(preprocessing_function=pre_function,horizontal_flip=True) validation_image_generator = ImageDataGenerator(preprocessing_function=pre_function)train_data_gen = train_image_generator.flow_from_directory(directory=train_dir,batch_size=batch_size,shuffle=True,target_size=(im_height, im_width),class_mode='categorical') total_train = train_data_gen.n# get class dict class_indices = train_data_gen.class_indices# transform value and key of dict inverse_dict = dict((val, key) for key, val in class_indices.items()) # write dict into json file json_str = json.dumps(inverse_dict, indent=4) with open('class_indices.json', 'w') as json_file:json_file.write(json_str)val_data_gen = train_image_generator.flow_from_directory(directory=validation_dir,batch_size=batch_size,shuffle=True,target_size=(im_height, im_width),class_mode='categorical') total_val = val_data_gen.nmodel = GoogLeNet(im_height=im_height, im_width=im_width, class_num=5, aux_logits=True) # model.build((batch_size, 224, 224, 3)) # when using subclass model model.summary()#打印每一層 # using keras low level api for training 一個(gè)比較底層的方法(因?yàn)橛袃蓚€(gè)輔助分類器,參數(shù)不匹配) loss_object = tf.keras.losses.CategoricalCrossentropy(from_logits=False) optimizer = tf.keras.optimizers.Adam(learning_rate=0.0003)train_loss = tf.keras.metrics.Mean(name='train_loss') train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')test_loss = tf.keras.metrics.Mean(name='test_loss') test_accuracy = tf.keras.metrics.CategoricalAccuracy(name='test_accuracy')@tf.function def train_step(images, labels):with tf.GradientTape() as tape:aux1, aux2, output = model(images, training=True)loss1 = loss_object(labels, aux1)loss2 = loss_object(labels, aux2)loss3 = loss_object(labels, output)loss = loss1*0.3 + loss2*0.3 + loss3gradients = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_loss(loss)train_accuracy(labels, output)@tf.function def test_step(images, labels):_, _, output = model(images, training=False)#有兩個(gè)值不要t_loss = loss_object(labels, output)test_loss(t_loss)test_accuracy(labels, output)best_test_loss = float('inf') for epoch in range(1, epochs+1):train_loss.reset_states() # clear history infotrain_accuracy.reset_states() # clear history infotest_loss.reset_states() # clear history infotest_accuracy.reset_states() # clear history infofor step in range(total_train // batch_size):images, labels = next(train_data_gen)train_step(images, labels)for step in range(total_val // batch_size):test_images, test_labels = next(val_data_gen)test_step(test_images, test_labels)template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'print(template.format(epoch,train_loss.result(),train_accuracy.result() * 100,test_loss.result(),test_accuracy.result() * 100))if test_loss.result() < best_test_loss:best_test_loss = test_loss.result()model.save_weights("./save_weights/myGoogLeNet.h5")train_add_bn
from tensorflow.keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt from model_add_bn import InceptionV1 import tensorflow as tf import json import os import numpy as npdata_root = os.path.abspath(os.path.join(os.getcwd(), "../..")) # get data root path image_path = data_root + "/data_set/flower_data/" # flower data set path train_dir = image_path + "train" validation_dir = image_path + "val"# create direction for saving weights if not os.path.exists("save_weights"):os.makedirs("save_weights")im_height = 224 im_width = 224 batch_size = 16 epochs = 30def pre_function(img: np.ndarray):# img = im.open('test.jpg')# img = np.array(img).astype(np.float32)img = img / 255.img = img - [0.485, 0.456, 0.406]img = img / [0.229, 0.224, 0.225]return img# data generator with data augmentation train_image_generator = ImageDataGenerator(preprocessing_function=pre_function,horizontal_flip=True) validation_image_generator = ImageDataGenerator(preprocessing_function=pre_function)train_data_gen = train_image_generator.flow_from_directory(directory=train_dir,batch_size=batch_size,shuffle=True,target_size=(im_height, im_width),class_mode='categorical') total_train = train_data_gen.n# get class dict class_indices = train_data_gen.class_indices# transform value and key of dict inverse_dict = dict((val, key) for key, val in class_indices.items()) # write dict into json file json_str = json.dumps(inverse_dict, indent=4) with open('class_indices.json', 'w') as json_file:json_file.write(json_str)val_data_gen = train_image_generator.flow_from_directory(directory=validation_dir,batch_size=batch_size,shuffle=True,target_size=(im_height, im_width),class_mode='categorical') total_val = val_data_gen.nmodel = InceptionV1(im_height=im_height, im_width=im_width, class_num=5, aux_logits=True) # model.build((batch_size, 224, 224, 3)) # when using subclass model model.load_weights("pretrain_weights.ckpt") model.summary()# using keras low level api for training loss_object = tf.keras.losses.CategoricalCrossentropy(from_logits=False) optimizer = tf.keras.optimizers.Adam(learning_rate=0.0005)train_loss = tf.keras.metrics.Mean(name='train_loss') train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')test_loss = tf.keras.metrics.Mean(name='test_loss') test_accuracy = tf.keras.metrics.CategoricalAccuracy(name='test_accuracy')@tf.function def train_step(images, labels):with tf.GradientTape() as tape:aux1, aux2, output = model(images, training=True)loss1 = loss_object(labels, aux1)loss2 = loss_object(labels, aux2)loss3 = loss_object(labels, output)loss = loss1*0.3 + loss2*0.3 + loss3gradients = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_loss(loss)train_accuracy(labels, output)@tf.function def test_step(images, labels):_, _, output = model(images, training=False)t_loss = loss_object(labels, output)test_loss(t_loss)test_accuracy(labels, output)best_test_loss = float('inf') for epoch in range(1, epochs+1):train_loss.reset_states() # clear history infotrain_accuracy.reset_states() # clear history infotest_loss.reset_states() # clear history infotest_accuracy.reset_states() # clear history infofor step in range(total_train // batch_size):images, labels = next(train_data_gen)train_step(images, labels)for step in range(total_val // batch_size):test_images, test_labels = next(val_data_gen)test_step(test_images, test_labels)template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'print(template.format(epoch,train_loss.result(),train_accuracy.result() * 100,test_loss.result(),test_accuracy.result() * 100))if test_loss.result() < best_test_loss:best_test_loss = test_loss.result()model.save_weights("./save_weights/myInceptionV1.h5")trainGPU
import matplotlib.pyplot as plt from model import GoogLeNet import tensorflow as tf import json import os import time import glob import random os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "0"gpus = tf.config.experimental.list_physical_devices("GPU") if gpus:try:for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)except RuntimeError as e:print(e)exit(-1)data_root = os.path.abspath(os.path.join(os.getcwd(), "../..")) # get data root path image_path = data_root + "/data_set/flower_data/" # flower data set path train_dir = image_path + "train" validation_dir = image_path + "val"# create direction for saving weights if not os.path.exists("save_weights"):os.makedirs("save_weights")im_height = 224 im_width = 224 batch_size = 32 epochs = 30# class dict data_class = [cla for cla in os.listdir(train_dir) if ".txt" not in cla] class_num = len(data_class) class_dict = dict((value, index) for index, value in enumerate(data_class))# reverse value and key of dict inverse_dict = dict((val, key) for key, val in class_dict.items()) # write dict into json file json_str = json.dumps(inverse_dict, indent=4) with open('class_indices.json', 'w') as json_file:json_file.write(json_str)# load train images list train_image_list = glob.glob(train_dir+"/*/*.jpg") random.shuffle(train_image_list) train_num = len(train_image_list) train_label_list = [class_dict[path.split(os.path.sep)[-2]] for path in train_image_list]# load validation images list val_image_list = glob.glob(validation_dir+"/*/*.jpg") random.shuffle(val_image_list) val_num = len(val_image_list) val_label_list = [class_dict[path.split(os.path.sep)[-2]] for path in val_image_list]def process_train_img(img_path, label):label = tf.one_hot(label, depth=class_num)image = tf.io.read_file(img_path)image = tf.image.decode_jpeg(image)image = tf.image.convert_image_dtype(image, tf.float32)image = tf.image.resize(image, [im_height, im_width])image = tf.image.random_flip_left_right(image)image = (image - 0.5) / 0.5return image, labeldef process_val_img(img_path, label):label = tf.one_hot(label, depth=class_num)image = tf.io.read_file(img_path)image = tf.image.decode_jpeg(image)image = tf.image.convert_image_dtype(image, tf.float32)image = tf.image.resize(image, [im_height, im_width])image = (image - 0.5) / 0.5return image, labelAUTOTUNE = tf.data.experimental.AUTOTUNE# load train dataset train_dataset = tf.data.Dataset.from_tensor_slices((train_image_list, train_label_list))#用tfdata讀取,真正多線程讀取,加速訓(xùn)練 train_dataset = train_dataset.shuffle(buffer_size=train_num)\.map(process_train_img, num_parallel_calls=AUTOTUNE)\.repeat().batch(batch_size).prefetch(AUTOTUNE)# load train dataset val_dataset = tf.data.Dataset.from_tensor_slices((val_image_list, val_label_list)) val_dataset = val_dataset.map(process_val_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\.repeat().batch(batch_size)# 實(shí)例化模型 model = GoogLeNet(im_height=224, im_width=224, class_num=5, aux_logits=True) model.summary()# using keras low level api for training loss_object = tf.keras.losses.CategoricalCrossentropy(from_logits=False) optimizer = tf.keras.optimizers.Adam(learning_rate=0.0003)train_loss = tf.keras.metrics.Mean(name='train_loss') train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')test_loss = tf.keras.metrics.Mean(name='test_loss') test_accuracy = tf.keras.metrics.CategoricalAccuracy(name='test_accuracy')@tf.function def train_step(images, labels):with tf.GradientTape() as tape:aux1, aux2, output = model(images, training=True)loss1 = loss_object(labels, aux1)loss2 = loss_object(labels, aux2)loss3 = loss_object(labels, output)loss = loss1 * 0.3 + loss2 * 0.3 + loss3gradients = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_loss(loss)train_accuracy(labels, output)@tf.function def test_step(images, labels):_, _, output = model(images, training=False)t_loss = loss_object(labels, output)test_loss(t_loss)test_accuracy(labels, output)best_test_loss = float('inf') train_step_num = train_num // batch_size val_step_num = val_num // batch_size for epoch in range(1, epochs+1):train_loss.reset_states() # clear history infotrain_accuracy.reset_states() # clear history infotest_loss.reset_states() # clear history infotest_accuracy.reset_states() # clear history infot1 = time.perf_counter()for index, (images, labels) in enumerate(train_dataset):train_step(images, labels)if index+1 == train_step_num:breakprint(time.perf_counter()-t1)for index, (images, labels) in enumerate(val_dataset):test_step(images, labels)if index+1 == val_step_num:breaktemplate = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'print(template.format(epoch,train_loss.result(),train_accuracy.result() * 100,test_loss.result(),test_accuracy.result() * 100))if test_loss.result() < best_test_loss:model.save_weights("./save_weights/myGoogLeNet.ckpt".format(epoch), save_format='tf')#ckpt官方模式predict
from model import GoogLeNet from PIL import Image import numpy as np import json import matplotlib.pyplot as pltim_height = 224 im_width = 224# load image img = Image.open("../tulip.jpg") # resize image to 224x224 img = img.resize((im_width, im_height)) plt.imshow(img)# scaling pixel value and normalize img = ((np.array(img) / 255.) - 0.5) / 0.5# Add the image to a batch where it's the only member. img = (np.expand_dims(img, 0))# read class_indict try:json_file = open('./class_indices.json', 'r')class_indict = json.load(json_file) except Exception as e:print(e)exit(-1)model = GoogLeNet(class_num=5, aux_logits=False) model.summary() # model.load_weights("./save_weights/myGoogLenet.h5", by_name=True) # h5 format,因?yàn)闆]有輔助分類器,by_name這樣就按照相應(yīng)的載入,不然報(bào)錯(cuò) model.load_weights("./save_weights/myGoogLeNet.ckpt") # ckpt format官方,ckpt就不用了,寫by_name反倒報(bào)錯(cuò) result = model.predict(img) predict_class = np.argmax(result) print(class_indict[str(predict_class)]) plt.show()總結(jié)
以上是生活随笔為你收集整理的5.3 使用tensorflow搭建GoogLeNet网络 笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5.2 使用pytorch搭建GoogL
- 下一篇: pytorch datasets.Ima