深度学习手记(四)之线性模型

使用深度学习框架Keras和TensorFlow实现线性模型,自我感觉有点大材小用。但是,对于我们初学者来说能够拿来练练手也是不错的。其实,我们都知道神经网络如果不加激活函数就是线性的模型,所以实现线性模型,就不用加激活函数了。下面用Keras和TensorFlow框架分别实现一下线性模型。

  • TensorFlow线性模型
  • Keras线性模型

1.TensorFlow


import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 创建数据,然后与最后结果对比wight和bias的大小。
x_data = np.random.rand(100)
noise = np.random.normal(0, 0.02, x_data.shape)
y_data = x_data * 0.2 + 0.3 + noise

# plt.plot(x_data, y_data, "b.")
# plt.show()

# 创建模型
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))   # 初始化weight
b = tf.Variable(tf.zeros([1]))    # 初始化bias
# 指定命名空间,等一下可以在tensorboard中显示。
with tf.name_scope("output"):
    y = W * x_data + b
# 定义loss function 或 cost function (损失函数)
# 计算残差平方和(线性模型好坏的常用评定方法),在Tensor的所有维度计算((y-y_data)^ 2)的和 / N。
loss = tf.reduce_mean(tf.square(y_data - y))
# 使用梯度下降优化器对模型进行优化。
optimizer = tf.train.GradientDescentOptimizer(0.05)  # 设置学习率
train = optimizer.minimize(loss)

# 创建会话
sess = tf.Session()
# 使所有变量生效
init = tf.global_variables_initializer()
sess.run(init)

# 训练步数
for step in range(3001):
    # 优化每一步
    sess.run(train)
    if step % 500 == 0:
        # 打印出每一步的损失,权重和偏差

        print("Step=%d, Loss=%f" % (step, sess.run(loss)))
        # 写入tensorboard中
        writer = tf.summary.FileWriter("D:/log", tf.get_default_graph())
# 得到预测的W和b。
W = sess.run(W)
b = sess.run(b)
print("W:", W, "b:", b)

# 绘制最佳拟合直线
plt.scatter(x_data, y_data)
plt.plot(x_data, sess.run(y), 'r-', label="Fitted line")    # 拟合的线
plt.legend()
plt.show()

sess.close()

结果:
Step=0, Loss=0.316282
Step=500, Loss=0.000292
Step=1000, Loss=0.000285
Step=1500, Loss=0.000285
Step=2000, Loss=0.000285
Step=2500, Loss=0.000285
Step=3000, Loss=0.000285
W: [ 0.19831541] b: [ 0.29817221]
这里写图片描述
可以看出,预测的W和b都是很接近我们设定的W和b。
同时,我们运行tensorboard。

tensorboard --logdir=log

注意:在运行tensorboard的时候最好在生成log文件的目录下。比如:我这里的log文件就是在D盘,所以,我先进入D盘在运行tensorboard –logdir=log。避免不必要的错误。
这里写图片描述
这就是一个简单的线性模型的tensor张量图。


  1. Keras
    Keras框架是一个轻量级的框架,很容易上手。

import numpy as np

import matplotlib.pyplot as plt

# Sequential序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,没有跨层连接。这种模型编译速度快,操作上也比较简单。
from keras.models import Sequential
# Dense全连接层
from keras.layers import Dense
# 数据输入
x_data = np.random.rand(100)
noise = np.random.normal(0, 0.01, x_data.shape)
y_data = x_data * 0.1 + 0.2 + noise

# plt.scatter(x_data, y_data)
# plt.show()


# 搭建模型
model = Sequential()
# 在模型中添加一个全连接层,直接可以用add一层一层添加。units表示输出,input_dim表示输入。
model.add(Dense(units=1, input_dim=1))
# 给模型一个优化器,sgd随机梯度下降,mse均方误差
model.compile(optimizer="sgd", loss="mse")

for i in range(3001):
    cost = model.train_on_batch(x_data, y_data)
    # 每500个batch打印一次cost值
    if i % 500 == 0:
        print("Step:%d, Loss:%.6f" % (i, cost))


# 打印权值和偏置值
W, b = model.layers[0].get_weights()
print("W:", W, "b:", b)

y_pred = model.predict(x_data)

plt.scatter(x_data, y_data)

plt.plot(x_data, y_pred, "r-", lw=3)
plt.show()

结果:
Step:0, Loss:0.395879
Step:500, Loss:0.005924
Step:1000, Loss:0.001846
Step:1500, Loss:0.000621
Step:2000, Loss:0.000253
Step:2500, Loss:0.000143
Step:3000, Loss:0.000109
W: [[ 0.07935581]] b: [ 0.21228427]
这里写图片描述
可以看出,与TensorFlow相似,预测的W和b都是很接近真实的W和b的。


进入深度学习的大门,实现一个线性模型,这才是第一步,今后的道路任重而道远!因为喜欢,并非专业。

猜你喜欢

转载自blog.csdn.net/llh_1178/article/details/79684988
今日推荐