tensorlayer/example/tutorial_vgg19.py

本文介绍如何使用TensorFlow和TensorLayer构建并应用预训练的VGG-19模型进行图像分类。通过加载和预处理图像数据,利用简化版的卷积层实现模型,并演示了如何从npy文件中恢复模型参数。
部署运行你感兴趣的模型镜像
#! /usr/bin/python
 # -*- coding: utf-8 -*-
 """
 VGG-19 for ImageNet.
  
 Pre-trained model in this example - VGG19 NPZ and
 trainable examples of VGG16/19 in TensorFlow can be found here:
 https://github.com/machrisaa/tensorflow-vgg
  
 For simplified CNN layer see "Convolutional layer (Simplified)"
 in read the docs website.
  
 """
  
 import os
 import time
 import numpy as np
 import skimage
 import skimage.io
 import skimage.transform
 import tensorflow as tf
 import tensorlayer as tl
 from tensorlayer.layers import *
  
 tf.logging.set_verbosity(tf.logging.DEBUG)
 tl.logging.set_verbosity(tl.logging.DEBUG)
  
 try:
 from tensorlayer.models.imagenet_classes import *
 except Exception as e:
 raise Exception(
 "{} / download the file from: https://github.com/tensorlayer/tensorlayer/tree/master/example/data".format(e)
 )
  
 VGG_MEAN = [103.939, 116.779, 123.68]
  
 MODEL_DIR = "models"
 MODEL_NAME = "vgg19.npy"
 MODEL_PATH = os.path.join(MODEL_DIR, MODEL_NAME)
  
  
 def load_image(path):
 # load image
 img = skimage.io.imread(path)
 img = img / 255.0
 if ((0 <= img).all() and (img <= 1.0).all()) is False:
 raise Exception("image value should be [0, 1]")
 # print "Original Image Shape: ", img.shape
 # we crop image from center
 short_edge = min(img.shape[:2])
 yy = int((img.shape[0] - short_edge) / 2)
 xx = int((img.shape[1] - short_edge) / 2)
 crop_img = img[yy:yy + short_edge, xx:xx + short_edge]
 # resize to 224, 224
 resized_img = skimage.transform.resize(crop_img, (224, 224), anti_aliasing=False)
 return resized_img
  
  
 def print_prob(prob):
 synset = class_names
 # print prob
 pred = np.argsort(prob)[::-1]
 # Get top1 label
 top1 = synset[pred[0]]
 print("Top1: ", top1, prob[pred[0]])
 # Get top5 label
 top5 = [(synset[pred[i]], prob[pred[i]]) for i in range(5)]
 print("Top5: ", top5)
 return top1
  
  
 def Vgg19(rgb):
 """
 Build the VGG 19 Model
  
 Parameters
 -----------
 rgb : rgb image placeholder [batch, height, width, 3] values scaled [0, 1]
 """
 start_time = time.time()
 print("build model started")
 rgb_scaled = rgb * 255.0
 # Convert RGB to BGR
 red, green, blue = tf.split(rgb_scaled, 3, 3)
  
 if red.get_shape().as_list()[1:] != [224, 224, 1]:
 raise Exception("image size unmatch")
  
 if green.get_shape().as_list()[1:] != [224, 224, 1]:
 raise Exception("image size unmatch")
  
 if blue.get_shape().as_list()[1:] != [224, 224, 1]:
 raise Exception("image size unmatch")
  
 bgr = tf.concat([
 blue - VGG_MEAN[0],
 green - VGG_MEAN[1],
 red - VGG_MEAN[2],
 ], axis=3)
  
 if bgr.get_shape().as_list()[1:] != [224, 224, 3]:
 raise Exception("image size unmatch")
 # input layer
 net_in = InputLayer(bgr, name='input')
 # conv1
 net = Conv2dLayer(net_in, act=tf.nn.relu, shape=[3, 3, 3, 64], strides=[1, 1, 1, 1], padding='SAME', name='conv1_1')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 64, 64], strides=[1, 1, 1, 1], padding='SAME', name='conv1_2')
 net = PoolLayer(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', pool=tf.nn.max_pool, name='pool1')
 # conv2
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 64, 128], strides=[1, 1, 1, 1], padding='SAME', name='conv2_1')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 128, 128], strides=[1, 1, 1, 1], padding='SAME', name='conv2_2')
 net = PoolLayer(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', pool=tf.nn.max_pool, name='pool2')
 # conv3
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 128, 256], strides=[1, 1, 1, 1], padding='SAME', name='conv3_1')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 256, 256], strides=[1, 1, 1, 1], padding='SAME', name='conv3_2')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 256, 256], strides=[1, 1, 1, 1], padding='SAME', name='conv3_3')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 256, 256], strides=[1, 1, 1, 1], padding='SAME', name='conv3_4')
 net = PoolLayer(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', pool=tf.nn.max_pool, name='pool3')
 # conv4
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 256, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv4_1')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv4_2')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv4_3')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv4_4')
 net = PoolLayer(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', pool=tf.nn.max_pool, name='pool4')
 # conv5
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv5_1')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv5_2')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv5_3')
 net = Conv2dLayer(net, act=tf.nn.relu, shape=[3, 3, 512, 512], strides=[1, 1, 1, 1], padding='SAME', name='conv5_4')
 net = PoolLayer(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', pool=tf.nn.max_pool, name='pool5')
 # fc 6~8
 net = FlattenLayer(net, name='flatten')
 net = DenseLayer(net, n_units=4096, act=tf.nn.relu, name='fc6')
 net = DenseLayer(net, n_units=4096, act=tf.nn.relu, name='fc7')
 net = DenseLayer(net, n_units=1000, act=None, name='fc8')
 print("build model finished: %fs" % (time.time() - start_time))
 return net
  
  
 def Vgg19_simple_api(rgb):
 """
 Build the VGG 19 Model
  
 Parameters
 -----------
 rgb : rgb image placeholder [batch, height, width, 3] values scaled [0, 1]
 """
 start_time = time.time()
 print("build model started")
 rgb_scaled = rgb * 255.0
 # Convert RGB to BGR
 red, green, blue = tf.split(rgb_scaled, 3, 3)
  
 if red.get_shape().as_list()[1:] != [224, 224, 1]:
 raise Exception("image size unmatch")
  
 if green.get_shape().as_list()[1:] != [224, 224, 1]:
 raise Exception("image size unmatch")
  
 if blue.get_shape().as_list()[1:] != [224, 224, 1]:
 raise Exception("image size unmatch")
  
 bgr = tf.concat([
 blue - VGG_MEAN[0],
 green - VGG_MEAN[1],
 red - VGG_MEAN[2],
 ], axis=3)
  
 if bgr.get_shape().as_list()[1:] != [224, 224, 3]:
 raise Exception("image size unmatch")
  
 # input layer
 net_in = InputLayer(bgr, name='input')
 # conv1
 net = Conv2d(net_in, 64, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv1_1')
 net = Conv2d(net, n_filter=64, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv1_2')
 net = MaxPool2d(net, filter_size=(2, 2), strides=(2, 2), padding='SAME', name='pool1')
 # conv2
 net = Conv2d(net, n_filter=128, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv2_1')
 net = Conv2d(net, n_filter=128, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv2_2')
 net = MaxPool2d(net, filter_size=(2, 2), strides=(2, 2), padding='SAME', name='pool2')
 # conv3
 net = Conv2d(net, n_filter=256, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv3_1')
 net = Conv2d(net, n_filter=256, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv3_2')
 net = Conv2d(net, n_filter=256, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv3_3')
 net = Conv2d(net, n_filter=256, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv3_4')
 net = MaxPool2d(net, filter_size=(2, 2), strides=(2, 2), padding='SAME', name='pool3')
 # conv4
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv4_1')
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv4_2')
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv4_3')
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv4_4')
 net = MaxPool2d(net, filter_size=(2, 2), strides=(2, 2), padding='SAME', name='pool4')
 # conv5
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv5_1')
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv5_2')
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv5_3')
 net = Conv2d(net, n_filter=512, filter_size=(3, 3), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='conv5_4')
 net = MaxPool2d(net, filter_size=(2, 2), strides=(2, 2), padding='SAME', name='pool5')
 # fc 6~8
 net = FlattenLayer(net, name='flatten')
 net = DenseLayer(net, n_units=4096, act=tf.nn.relu, name='fc6')
 net = DenseLayer(net, n_units=4096, act=tf.nn.relu, name='fc7')
 net = DenseLayer(net, n_units=1000, act=None, name='fc8')
 print("build model finished: %fs" % (time.time() - start_time))
 return net
  
  
 sess = tf.InteractiveSession()
 x = tf.placeholder("float", [None, 224, 224, 3])
 # net = Vgg19(x)
 net = Vgg19_simple_api(x)
 y = net.outputs
 probs = tf.nn.softmax(y, name="prob")
 tl.layers.initialize_global_variables(sess)
  
 # You need to download the pre-trained model - VGG19 NPY
 if not os.path.isfile(MODEL_PATH):
 print("Please download vgg19.npy from : https://github.com/machrisaa/tensorflow-vgg")
 exit()
  
 npy_file = np.load(MODEL_PATH, encoding='latin1').item()
  
 params = []
 for val in sorted(npy_file.items()):
 W = np.asarray(val[1][0])
 b = np.asarray(val[1][1])
 print(" Loading %s: %s, %s" % (val[0], W.shape, b.shape))
 params.extend([W, b])
  
 print("Restoring model from npy file")
 tl.files.assign_params(sess, params, net)
  
 img1 = load_image("data/tiger.jpeg") # test data in github
 img1 = img1.reshape((1, 224, 224, 3))
 start_time = time.time()
 prob = sess.run(probs, feed_dict={x: img1})
 print("End time : %.5ss" % (time.time() - start_time))
  
 print_prob(prob[0])

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

"""CIFAR10 example for cnn_finetune. Based on: - https://github.com/pytorch/tutorials/blob/master/beginner_source/blitz/cifar10_tutorial.py - https://github.com/pytorch/examples/blob/master/mnist/main.py """ import argparse import torch import torchvision import torchvision.transforms as transforms from torch.autograd import Variable import torch.nn as nn import torch.optim as optim from cnn_finetune import make_model parser = argparse.ArgumentParser(description='cnn_finetune cifar 10 example') parser.add_argument('--batch-size', type=int, default=32, metavar='N', help='input batch size for training (default: 32)') parser.add_argument('--test-batch-size', type=int, default=64, metavar='N', help='input batch size for testing (default: 64)') parser.add_argument('--epochs', type=int, default=2, metavar='N', help='number of epochs to train (default: 2)') parser.add_argument('--lr', type=float, default=0.01, metavar='LR', help='learning rate (default: 0.01)') parser.add_argument('--momentum', type=float, default=0.9, metavar='M', help='SGD momentum (default: 0.9)') parser.add_argument('--no-cuda', action='store_true', default=False, help='disables CUDA training') parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)') parser.add_argument('--log-interval', type=int, default=100, metavar='N', help='how many batches to wait before logging training status') parser.add_argument('--model-name', type=str, default='resnet50', metavar='M', help='model name (default: resnet50)') parser.add_argument('--dropout-p', type=float, default=0.2, metavar='D', help='Dropout probability (default: 0.2)') args = parser.parse_args() use_cuda = not args.no_cuda and torch.cuda.is_available() device = torch.device('cuda' if use_cuda else 'cpu') def train(model, epoch, optimizer, train_loader, criterion=nn.CrossEntropyLoss()): total_loss = 0 total_size = 0 model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) total_loss += loss.item() total_size += data.size(0) loss.backward() optimizer.step() if batch_idx % args.log_interval == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tAverage loss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), total_loss / total_size)) def test(model, test_loader, criterion=nn.CrossEntropyLoss()): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += criterion(output, target).item() pred = output.data.max(1, keepdim=True)[1] correct += pred.eq(target.data.view_as(pred)).long().cpu().sum().item() test_loss /= len(test_loader.dataset) print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) def main(): '''Main function to run code in this script''' model_name = args.model_name if model_name == 'alexnet': raise ValueError('The input size of the CIFAR-10 data set (32x32) is too small for AlexNet') classes = ['SA', 'SB', 'SC', 'SF', 'SI'] model = make_model( model_name, pretrained=True, num_classes=len(classes), dropout_p=args.dropout_p, input_size=(32, 32) if model_name.startswith(('vgg', 'squeezenet')) else None, ) model = model.to(device) transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize( mean=model.original_model_info.mean, std=model.original_model_info.std), ]) train_set = torchvision.datasets.ImageFolder( 'D:/python/图像datasets/train',transform=transform ) train_loader = torch.utils.data.DataLoader( train_set, batch_size=args.batch_size, shuffle=True, num_workers=2 ) test_set = torchvision.datasets.ImageFolder( 'D:/python/图像datasets/test',transform=transform ) test_loader = torch.utils.data.DataLoader( test_set, args.test_batch_size, shuffle=False, num_workers=2 ) optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) # Use exponential decay for fine-tuning optimizer scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.975) # Train for epoch in range(1, args.epochs + 1): # Decay Learning Rate scheduler.step(epoch) train(model, epoch, optimizer, train_loader) test(model, test_loader) if __name__ == '__main__': main() 该段代码运行到epoch1时就卡住了 帮我看看是什么问题
最新发布
11-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值