学习tensorflow的经验和总结
现在是个人均机器学习的时代,tensorflow更新到2.0更加容易上手,本文从搭建环境到模型构建给出一点示例以供学习
关于搭建环境
如果是初学TF建议使用cpu版本,这样省去诸多麻烦。例如gpu版本需要电脑gpu支持(nividia,需要驱动),并且安装cuDnn和cudatoolkit(需要和tensorflow版本对应),另外python高版本还未适配tensorflow所以不能安装过高版本,此时anaconda闪亮登场,它不仅能虚拟环境让py、包等与系统隔离开,指定python版本和自动下相应cuda搭配。当然如果用cpu版本无需考虑。
import tensorflow as tf
print(tf.__version__) #打印即成功
关于keras和tf.keras
现在都是直接下载tensorflow里面内置了keras,官方也推荐使用后者,相当于后者是将其收纳了,实际上关系是:tensorflow作为其计算工具,后者是tensorflow的高级api,简单来说就是协作关系,keras是只笔,tensorflow是张纸。
初识Tensorflow
前馈神经网络:分为多层, 相邻层之间全连接, 不存在同层连接与跨层连接. 整个网络中无反馈,可用一个有向无环图表示.用标准bp算法训练(基于SDG)。
以下从特性到建立模型和训练。从代码实战开始
- 了解其特效和基础–自动求导机制
x = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape:
y = 3*tf.square(x)
z = y+3*x
z_grad = tape.gradient(z,x)
print(y,z,z_grad)
#利用其求偏导
X = tf.constant([[1., 2.], [3., 4.]])
y = tf.constant([[1.], [2.]])
w = tf.Variable(initial_value=[[1.], [2.]])
b = tf.Variable(initial_value=1.)
with tf.GradientTape() as tape:
L = tf.reduce_sum(tf.square(tf.matmul(X, w) + b - y))
w_grad, b_grad = tape.gradient(L, [w, b]) # 计算L(w, b)关于w, b的偏导数
print(L, w_grad, b_grad)
# 线性回归示例:生成data
X_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)
X = (X_raw - X_raw.min()) / (X_raw.max() - X_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())
X = tf.constant(X)
y = tf.constant(y)
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables=[a,b]
num_epoch = 10000
opt = tf.keras.optimizers.SGD(learning_rate=5e-4)
for e in range(num_epoch):
with tf.GradientTape() as tape:
y_pred = a * X + b
loss = tf.reduce_sum(tf.square(y_pred-y))
grads = tape.gradient(loss,variables)
opt.apply_gradients(grads_and_vars=zip(grads,variables))
print(a,b)
- 创建自己的模型作用如上面的运算和variable(下面的方法都是各类框架通用,没有使用高级api,都是自定义网络)
class MyModel(tf.keras.Model):
def __init__(self):
super().__init__() # Python 2 下使用 super(MyModel, self).__init__()
# 此处添加初始化代码(包含 call 方法中会用到的层),例如
# layer1 = tf.keras.layers.BuiltInLayer(...)
# layer2 = MyCustomLayer(...)
def call(self, input):
# 此处添加模型调用的代码(处理输入并返回输出),例如
# x = layer1(input)
# output = layer2(x)
return output
# 还可以添加自定义的方法
#由于继承自model其有variable这一属性获取所有变量
#将上例的y=ax+b模型化
X = tf.constant([[1.0, 2.0,