学习笔记TF023:下载、缓存、属性字典、惰性属性、覆盖数据流图、资源

确保目录构造存有。每一次创建文件,确保父目录早已存有。确保特定途径所有或一部分目录早已存有。建立沿特定途径上不会有目录。

下载函数公式,假如文件夹名称未指定,从URL分析。下载文档,返回当地系统文件文件夹名称。假如文档存有,不下载。假如文档未指定,从URL分析,返回filepath 。具体下载前,查验下载部位是不是有总体目标名字文档。是,绕过下载。下载文档,返回途径。反复下载,把文档从系统文件删掉。

import os

import shutil

import errno

from lxml import etree

from urllib.request import urlopen

def ensure_directory(directory):

directory = os.path.expanduser(directory)

try:

os. ** kedirs(directory)

except OSError as e:

if e.errno != errno.EEXIST:

raise e

def download(url, directory, filename=None):

if not filename:

_, filename = os.path.split(url)

directory = os.path.expanduser(directory)

ensure_directory(directory)

filepath = os.path.join(directory, filename)

if os.path.isfile(filepath):

return filepath

print('Download', filepath)

with urlopen(url) as response, open(filepath, 'wb') as file_:

shutil.copyfileobj(response, file_)

return filepath

硬盘缓存文件装饰器,较规模性数据解决正中间結果储存硬盘公共性部位,缓存文件载入函数公式装饰器。Python pickle作用完成函数公式返回值实例化、反序列化。只合适能列入主存数据。@disk_cache装饰器,函数公式实参发送给被装饰函数公式。函数参数明确主要参数组成是不是有缓存文件。散列投射为文件夹名称数据。如果是'method',绕过第一主要参数,缓存文件filepath,'directory/basename-hash.pickle'。方式 method=False主要参数通告装饰器是不是忽视第一个主要参数。

import functools

import os

import pickle

def disk_cache(basename, directory, method=False):

directory = os.path.expanduser(directory)

ensure_directory(directory)

def wrapper(func):

@functools.wraps(func)

def wrapped(*args, **kwargs):

key = (tuple(args), tuple(kwargs.items()))

if method and key:

key = key[1:]

filename = '{}-{}.pickle'.for ** t(basename, hash(key))

filepath = os.path.join(directory, filename)

if os.path.isfile(filepath):

with open(filepath, 'rb') as handle:

return pickle.load(handle)

result = func(*args, **kwargs)

with open(filepath, 'wb') as handle:

pickle.dump(result, handle)

return result

return wrapped

return wrapper

@disk_cache('dataset', '/home/user/dataset/')

def get_dataset(one_hot=True):

dataset = Dataset('http://example.com/dataset.bz2')

dataset = Tokenize(dataset)

if one_hot:

dataset = OneHotEncoding(dataset)

return dataset

特性词典。承继自内嵌dict类,可以用属性语法浏览悠已经有原素。传到规范词典(键值对)。内嵌函数公式locals,返回作用域全部静态变量名值投射。

class AttrDict(dict):

def __getattr__(self, key):

if key not in self:

raise AttributeError

return self[key]

def __setattr__(self, key, value):

if key not in self:

raise AttributeError

self[key] = value

可塑性特性装饰器。外界应用。浏览model.optimze,数据流程图建立新测算途径。启用model.prediction,建立新权重值和偏置。界定只测算一次特性。結果保留到含有一些作为前缀的调用函数。可塑性特性,TensorFlow实体模型结构型、归类。

import functools

def lazy_property(function):

attribute = '_lazy_' function.__name__

@property

@functools.wraps(function)

def wrapper(self):

if not hasattr(self, attribute):

setattr(self, attribute, function(self))

return getattr(self, attribute)

return wrapper

class Model:

def __init__(self, data, target):

self.data = data

self.target = target

self.prediction

self.optimize

self.error

@lazy_property

def prediction(self):

data_size = int(self.data.get_shape()[1])

target_size = int(self.target.get_shape()[1])

weight = tf.Variable(tf.truncated_nor ** l([data_size, target_size]))

bias = tf.Variable(tf.constant(0.1, shape=[target_size]))

incoming = tf. ** tmul(self.data, weight) bias

return tf.nn.soft ** x(incoming)

@lazy_property

def optimize(self):

cross_entropy = -tf.reduce_sum(self.target, tf.log(self.prediction))

optimizer = tf.train.RMSPropOptimizer(0.03)

return optimizer.minimize(cross_entropy)

@lazy_property

def error(self):

mistakes = tf.not_equal(

tf.arg ** x(self.target, 1), tf.arg ** x(self.prediction, 1))

return tf.reduce_mean(tf.cast(mistakes, tf.float32))

遮盖数据流程图装饰器。未确立特定使用寿命他数据流程图,TensorFlow应用默认设置。Jupyter Notebook,编译器情况在不一样一单元实行期内维持。原始默认设置数据流程图自始至终存有。实行再度界定数据流程图计算模块,加上到已存有数据流程图。依据菜单栏选择项重启kernel,再度运作全部模块。

建立订制数据流程图,设定默认设置。全部计算加上到该数据流程图,再度运作模块,建立新数据流程图。旧数据流图自动清理。

装饰器中建立数据流程图,装饰主函数。主函数定义详细数据流程图,界定占位符,函数调用建立实体模型。

import functools

import tensorflow as tf

def overwrite_graph(function):

@functools.wraps(function)

def wrapper(*args, **kwargs):

with tf.Graph().as_default():

return function(*args, **kwargs)

return wrapper

@overwrite_graph

def ** in():

data = tf.placeholder(...)

target = tf.placeholder(...)

model = Model()

** in()

API文档,编写代码时参考:

https:// ** .tensorflow.org/versions/ ** ster/api_docs/index.html

Github库,跟踪TensorFlow最新功能特性,阅读拉拽请求(pull request)、问题(issues)、发行记录(release note):

https://github.com/tensorflow/tensorflow

分布式 TensorFlow:

https:// ** .tensorflow.org/versions/ ** ster/how_tos/distributed/index.html

构建新TensorFlow功能:

https:// ** .tensorflow.org/ ** ster/how_tos/adding_an_op/index.html

邮件列表:

https://groups.google.com/a/tensorflow.org/d/forum/discuss

StackOverflow:

http://stackoverflow.com/questions/tagged/tensorflow

代码:

https://github.com/backstopmedia/tensorflowbook

参考资料:

《面向机器智能的TensorFlow实践》

欢迎付费咨询(150元每小时),我的微信:qingxingfengzi

扫码免费用

源码支持二开

申请免费使用

在线咨询