通过一个例子,讲解tensorflow的运行方式。
tensorflow的运行方式分为4步:
示例代码如下:
import tensorflow as tf
import numpy as np
"""1、加载数据及定义超参数"""
"""使用模拟数据"""
# np.linspace用于生成等差数列,上述代码表示在[-1,1]之间生成300个数据,形成等差数列关系。
x_data = np.linspace(-1,1,300)
# 将x_data转换为二维数组,newaxis表示在当前位置增加一个维度,在这里也就是增加列
x_data = x_data[:, np.newaxis]
# 加入一些噪声点
noise = np.random.normal(0, 0.05, x_data.shape)
# 根据公式模拟y值
y_true = np.square(x_data)-0.5 + noise
def add_layer(input, in_size, out_size, activation_function=None):
"""
参数1:输入数据
参数2:输入数据维度
参数3:输出数据维度
参数4:激活函数
"""
# 构建权重
w = tf.Variable(tf.random.normal([in_size, out_size]))
# 构建偏置
b = tf.Variable(tf.random.normal([1, out_size]) + 0.1)
# 矩阵相乘
y_predict = tf.matmul(input, w) + b
if activation_function is None:
outputs = y_predict
else:
outputs = activation_function(y_predict)
return outputs
def main():
# 定义训练数据的占位符
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
"""2、构建网络"""
# 构建神经网络,输入层、1个隐层、输出层
# 假设输入层有1个神经元、隐层有20个神经元、输出层有1个神经元
h1 = add_layer(xs, 1, 20, activation_function=tf.nn.relu) # 隐层
prediction = add_layer(h1, 20, 1, activation_function=None) # 输出层
# 损失函数
# reduction_indices[1]:按行求和, reduction_indices[0]:按列求和
var = tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1])
loss = tf.reduce_mean(var)
# 梯度下降
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
"""3、训练模型"""
init = tf.global_variables_initializer() # 初始化所有变量
sess = tf.Session()
sess.run(init)
for i in range(1000):
sess.run(train_step, feed_dict={xs: x_data, ys: y_true})
if i % 50 == 0:
"""4、评估模型和进行预测"""
print("loss:", sess.run(loss, feed_dict={xs: x_data, ys: y_true}))
if __name__ == '__main__':
main()
运行效果如下:
loss: 110.16617
loss: 0.036757533
loss: 0.0054481984
loss: 0.0035916578
loss: 0.0034978597
loss: 0.0034721652
loss: 0.0034505327
loss: 0.0034306566
loss: 0.0034096679
loss: 0.0033894777
loss: 0.0033684329
loss: 0.0033460592
loss: 0.003322898
loss: 0.0033007755
loss: 0.003278572
loss: 0.0032573033
loss: 0.0032364165
loss: 0.003216444
loss: 0.0031958343
loss: 0.0031740805
我们使用tensorflow框架基本都会有这4个大的步骤,有的网络结构复杂、有的网络结构简单而已,比如R-CNN网络、RPN网络、GoogleNet网络,有些网络结构我们可以直接拿来使用。
模型训练是一个非常耗时的操作,这个和我们定义的网络结构有关,有些业务场景还会涉及到一个网络结构的输出作为另外一个网络结构的输入。
总之,我们会根据我们的业务场景需求去做相应的处理,但是还是会遵循这几个基本步骤。
【拓展:np.newaxis】用于在当前位置增加一个维度,示例代码如下:
import numpy as np
def main():
test_data = np.array([1, 2, 3, 4, 5])
test_data2 = test_data[:, np.newaxis] # n行,1列
test_data3 = test_data[np.newaxis, :] # 1列,n行
print("test_data2:", test_data2)
print("test_data3:", test_data3)
if __name__ == '__main__':
main()
运行结果如下:
test_data2: [[1]
[2]
[3]
[4]
[5]]
test_data3: [[1 2 3 4 5]]