集智专栏
资源加载中,请稍后...
集智专栏

[2018.05.08直播] Python之面向对象

Kaiser

往期回顾

负基础入门Python系列汇总


直播时间 20:00

1. 页内观看(仅视频)

2. 完整观看(可发弹幕):Python:面向对象

3. Bilibili直播



33. 类和对象

类(class)

class AKM:

    pass


对象(object): an instance of a class

The AKM in your hands.

your_gun = AKM()


属性(attribute)

How is it going with your gun.

your_gun.damage
your_gun.shooting_range
...


方法(method):do something

你可以向着法西斯的开火:

your_gun.fire()


也可以交给你的队友:

your_gun.drop()


33.1 Everything is an object in Python

33.2 class

class <ClassName>(Object):
# python2


class <ClassName>:
# python3


33.3 init(self)

构造函数,安排上了。

程序说明
__init__()
示例代码
class zhizhang: def __init__(self, name, job): self.name = name self.job = job print("Hua Q!") ai = zhizhang('VAN', 'artist') print("My name is {}, I'm an {}".format(ai.name, ai.job))


33.4 属性/方法权限

程序说明
attributes/methods
示例代码
class AKM: def __init__(self, damage, ammo, attach): self.damage = damage self._ammo = ammo self.__attach = attach akm = AKM(50, 30, 3) print(akm.damage) print(akm._ammo) print(akm.__attach)


33.5 继承

super(): 调用父类的属性/方法。

程序说明
inherit
示例代码
class Person: def __init__(self, name, age, job): self.name = name self.age = age self.job = job def intro(self): print("{}岁, {} desu".format(self.age, self.job)) class Young(Person): def intro(self): print("Hua Q!") super().intro() I = Person('LaoWang', 24, 'student') you = Young('WuKe', 5,'artist') I.intro() you.intro()





34. 山寨TensorFlow

这一系列出自我站翻译过的《土法神经网络》(Deep Learning from Scratch)系列,自己动手,丰衣足食,以类和对象的形式实现了TensorFlow的基本功能。当然性能无法与原生框架相提并论,所以原作者的Github repo叫"TensorSlow".

不过原文有很多读者反映没看懂,后来我发现是讲解顺序和变量命名的原因。原本先Operation后placeholder, Variable的顺序确实不太便于理解;另外变量的命名不够直观,过长的名称也降低了代码可读性。所以我稍微改写了一下放在这里。

34.1 TensorFlow

TensorFlow,顾名思义就是Tensor(张量)在Flow,如下图所示:

Computational GraphComputational Graph


因为官网被墙了,所以如果你感兴趣的话可以查阅由掘金社区组织翻译的中文文档


34.2 Simple Example

34.2.1 Data

程序说明
Data
示例代码
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt %matplotlib inline x_data = np.float32(np.random.rand(2, 100)) y_data = np.dot([0.100, 0.200], x_data) + 0.300 from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x_data[0], x_data[1], y_data)
程序验证过程
True


34.2.2 Linear Model

程序说明
Linear Model
示例代码
b = tf.Variable(tf.zeros([1])) W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0)) y = tf.matmul(W, x_data) + b print(y)
程序验证过程
True


34.2.3 Initialization

程序说明
Training
示例代码
# Parameters loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss) # Initialization init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) # Initial Prediction(random) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x_data[0], x_data[1], y_data) ax.scatter(x_data[0], x_data[1], np.dot(sess.run(W), x_data)+sess.run(b), c='r')
程序验证过程
True


34.2.4 Training

程序说明
Training
示例代码
for step in range(0, 201): sess.run(train) if step % 20 == 0: print(step, sess.run(W), sess.run(b)) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x_data[0], x_data[1], y_data) ax.scatter(x_data[0], x_data[1], np.dot(sess.run(W), x_data)+sess.run(b), c='r')
程序验证过程
True



34.3 “逆向工程”

Computational Graph

定义计算的流程结构。

程序说明
Graph
示例代码
class Graph: def __init__(self): self.operations = [] self.placeholders = [] self.variables = [] def as_default(self): global _default_graph _default_graph = self class placeholder: def __init__(self): self.output = None self.go = [] _default_graph.placeholders.append(self) class Variable: def __init__(self, initial_value=None): self.output = initial_value self.go = [] _default_graph.variables.append(self) class Operation: def __init__(self, come=[]): self.come = come self.go = [] self.output = None for i in come: i.go.append(self) _default_graph.operations.append(self) class matmul(Operation): def __init__(self, n, m): super().__init__([n, m]) def compute(self,a,b): return a.dot(b) class add(Operation): def __init__(self, n, m): super().__init__([n, m]) def compute(self, a, b): return a + b
程序验证过程
True


Session

让张量Flow的更猛烈些吧。

程序说明
Session
示例代码
class Session: def run(self, nodes, feed_dict={}): nodes_postorder = traverse_postorder(nodes) print(nodes_postorder) for node in nodes_postorder: if isinstance(node, placeholder): node.output = feed_dict[node] elif isinstance(node, Operation): node.output = node.compute(*[i.output for i in node.come]) if isinstance(node.output, list): node.output = np.array(node.output) return nodes.output def traverse_postorder(operation): nodes_postorder = [] def recurse(node): if isinstance(node, Operation): for i in node.come: recurse(i) nodes_postorder.append(node) recurse(operation) return nodes_postorder # Instance x = placeholder() A = Variable([[1,0], [0,-1]]) b = Variable([1,1]) y = matmul(A, x) z = add(y, b) # Build Graph and Session Graph().as_default() sess = Session() output = sess.run(z, {x:[1,2]})
程序验证过程
True


您也许喜欢这些文章

集智专栏

玩儿懂深度学习Part 6:物体的识别与定位

发表至系列教程
这是《GPU学习深度学习》系列文章的第六篇,本文以如何识别马路上的行人、车辆为主题,介绍了基于 Tensorflow 的 SSD 模型如何应用在物体识别定位项目中。
集智专栏

[2018.01.14] “女生科技体验节” TensorFlow Workshop

发表至业界新闻
Kaiser在2018年1月14日“女生科技体验节”主持关于TensorFlow的workshop,这次用Fashion-MNIST替换了过度使用的MNIST(手写数字)数据集,并以此为实例展示TensorFlow的基本操作。
集智专栏

土法神经网络 Part III:训练标准

发表至系列教程
这是本系列教程的第三章。本系列教程将带领你入门深度神经网络的数学和算法基础。然后我们将效仿 TensorFlow API,自己动手用 Python 实现一个神经网络库。

文章评论(4)

captain 发表于 3月前回复
最后的土法神经网络里要加一句“Graph().as_default()”,将“_default_graph”调用一次,还要import numpy as np
silhouettes 发表于 3月前回复
感觉视频少了一段啊 好难受 b站这一集还没有
Kaiser集智 站长 发表于 4月前回复
回复新用户758:头图出处 https://youtu.be/cxEdZmeUZs0
对,就是这个惨叫鸡系列
Mass 发表于 4月前回复
头图出处 https://youtu.be/cxEdZmeUZs0