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

[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


您也许喜欢这些文章

集智专栏

万物皆可JS——Google发布deeplearn.js

发表至前端开发
Google拥有着几乎是世界上最受欢迎的浏览器,同时也是业界著名的人工智能专家聚居地。那么,当网络浏览器和支撑人工智能的深度学习结合起来,又会发生什么事情呢?浏览器真的能负担得起深度学习所需要的海量计算负载么?这样做又有什么实际意义?让我们来看一看Google发布的Deeplearn.js是如何回答这些问题的。
集智专栏

《机器学习有意思! 01》- 世界上最简单的机器学习入门

发表至趣味项目
本教程适合所有对机器学习感到好奇,却不知从何下手的读者。我想应该有很多人试着读了维基百科页面,然后愈发迷惘、沉沦,盼望着有人能够提供一个high-level的解释,那你找对地方了。
集智专栏

如何用Keras打造出“风格迁移”的AI艺术作品

发表至趣味项目
教你用Python库Keras和卷积神经网络,将经典画作的艺术风格应用到自己的照片上,使用两张基本的图像素材,就能创造出惊艳的AI艺术作品。

文章评论(4)

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