TF-Slim提供简化的卷积神经网络定义的语法,使得构建复杂网络变得简单易行。同时,提供多种预训练模型的下载和使用:VGG、AlexNet、Inception等。
在一个抽象级别上定义一个层操作,在一个命令中包含卷积操作、权重初始化、正则化和激活函数等:
net = slim.conv2d(inputs, 64, [11, 11], 4, padding='SAME', weights_initializer=tf.truncated_normal_initializer(stddev=0.01), weights_regularizer=slim.l2_regularizer(0.0007), scope='conv1')
使用repeat可避免复制或粘贴相同的行,但只适用于图层大小相同的情况:
net = slim.repeat(net, 5, slim.conv2d, 128, [3, 3], scope='conv1')
当图层大小不一时,可使用stack命令,允许连接不同形状的图层:
net = slim.stack(net, slim.conv2d, [(64, [3, 3]), (64, [1, 1]), (128, [3, 3]), (128, [1, 1]), (256, [3, 3])], scop='conv'
)
使用arg_scope的作用域机制,可将一组共享参数传递给同一个作用域中定义的每个操作:
with slim.arg_scope([slim.conv2d], padding='VALID', activation_fn=tf.nn.relu,
weights_initializer=tf.truncated_normal_initializer(stddev=0.02),
weights_regularizer=slim.l2_regularizer(0.001)):
net = slim.conv2d(inputs, 64, [3, 3], scope='conv1')
net = slim.conv2d(inputs, 128, [5, 5], padding='SAME', scope='conv2')
下载并使用预训练VGG16模型
from tensorflow.contrib import slim
sys.path.append("/home/itay/git/models/slim")
import sys
from datasets import dataset_utils
import tensorflow as tf
import urllib2
from nets import vgg
from preprocessing import vgg_preprocessing
import os
target_dir = '/home/itay/git/checkpoints'
url = ("http://54.68.5.226/car.jpg")
im_as_string = urllib2.urlopen(url).read()
im = tf.image.decode_jpeg(im_as_string, channels=3)
image_size = vgg.vgg_16.default_image_size
processed_im = vgg_preprocessing.preprocess_image(im,
image_size,
image_size,
is_training=False)
processed_images = tf.expand_dims(processed_im, 0)
with slim.arg_scope(vgg.vgg_arg_scope()):
logits, _ = vgg.vgg_16(processed_images,
num_classes=1000,
is_training=False)
probabilities = tf.nn.softmax(logits)
def vgg_arg_scope(weight_decay=0.0005):
with slim.arg_scope([slim.conv2d, slim.fully_connected],
activation_fn=tf.nn.relu,
weights_regularizer=slim.l2_regularizer(weight_decay),
biases_initializer=tf.zeros_initializer):
with slim.arg_scope([slim.conv2d], padding='SAME') as arg_sc:
return arg_sc
load_vars = slim.assign_from_checkpoint_fn(
os.path.join(target_dir, 'vgg_16.ckpt'),
slim.get_model_variables('vgg_16'))
from datasets import imagenet
imagenet.create_readable_names_for_imagenet_labels()
names = []
with tf.Session() as sess:
load_vars(sess)
network_input, probabilities = sess.run([processed_images,
probabilities])
probabilities = probabilities[0, 0:]
names_ = imagenet.create_readable_names_for_imagenet_labels()
idxs = np.argsort(-probabilities)[:5]
probs = probabilities[idxs]
classes = np.array(names_.values())[idxs+1]
for c,p in zip(classes,probs):
print('Class: '+ c + ' |Prob: ' + str(p))
网友评论