tensorflow2.0学习笔记(一)
这是本人自学tensorflow的笔记,用于记录。机器学习从本质上而言是一种猜谜游戏,比比谁能在知道开头和结尾的前提下猜到过程。从数学的角度而言就是如何在已知y,x的前提下猜到 y=w*x+b 这个表达式(一维角度)。如何解决这个问题就是机器学习的两大分类之一:回归问题
问题
已知关系式为: y = 3*x + 0.8 ,随机给出100个x和y,如何建立这个关系式?
解答
1.导入基础库
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
2.构建数据
x_data = np.random.rand(100)
y_data = np.array(x_data*3+0.8)
如何创建随机数组?- - - - >np.random
3.构建模型
构建一个单层神经网络
l_0 = tf.keras.layers.Dense(units = 1, input_shape = [1])
model = tf.keras.Sequential(l_0)
keras 介绍
1.构建模型:tf.keras.Sequential
# 添加一个64维输入的连接层
model.add(keras.layers.Dense(64, activation='relu'))
# 添加另一个
model.add(keras.layers.Dense(64, activation='relu'))
# 添加一个softmax层
model.add(keras.layers.Dense(10,activation='softmax'))
在 tf.keras.layers 中有很多层,下面是一些通用的构造函数的参数:
- activation:设置层的激活函数。 此参数由内置函数的名称或可调用对象指定。 默认情况下,不应用任何激活。
- kernel_initializer 和 bias_initializer:设置层创建时,权重和偏差的初始化方法。指定方法:名称 或 可调用对象。默认为"Glorot uniform" initializer。
- kernel_regularizer 和 bias_regularizer:设置层的权重、偏差的正则化方法。比如:L1 或 L2 正则。默认为空。
# 创建sigmoid层
layers.Dense(64, activation=tf.sigmoid)
# 将系数0.01的L1正则化应用于矩阵的线性层
layers.Dense(64, kernel_regularizer=keras.regularizers.l1(0.01))
# 创建sigmoid层
layers.Dense(64, activation=tf.sigmoid)
# 将系数0.01的L1正则化应用于矩阵的线性层
layers.Dense(64, kernel_regularizer=keras.regularizers.l1(0.01))
2.构建模型后,通过调用compile方法配置其训练过程:
model.compile(optimizer=tf.train.AdamOptimizer(0.001),loss='categorical_crossentropy',metrics=['accuracy'])
tf.keras.Model.compile有三个重要参数:
- optimizer:训练过程的优化方法。此参数通过 tf.train 模块的优化方法的实例来指定,比如:AdamOptimizer, RMSPropOptimizer, GradientDescentOptimizer。
- loss:训练过程中使用的损失函数(通过最小化损失函数来训练模型)。 常见的选择包括:均方误差(mse),categorical_crossentropy和binary_crossentropy。 损失函数由名称或通过从tf.keras.losses模块传递可调用对象来指定。
- metrics:训练过程中,监测的指标(Used to monitor training)。
指定方法:名称 或 可调用对象 from the tf.keras.metrics 模块。
对于小的数据集,可以直接使用 NumPy 格式的数据进行训练、评估模型。模型使用 fit 方法训练数据:
model.fit(data, labels, epochs=10, batch_size=32)
tf.keras.Model.fit 有三个重要的参数:
- epochs:训练多少轮。(小批量)
- batch_size:当传递NumPy数据时,模型将数据分成较小的批次,并在训练期间迭代这些批次。 此整数指定每个批次的大小。 请注意,如果样本总数不能被批量大小整除,则最后一批可能会更小。
- validation_data:在对模型进行原型设计时,您希望轻松监控其在某些验证数据上的性能。 传递这个参数 - 输入和标签的元组 - 允许模型在每个epoch的末尾以传递数据的推理模式显示损失和度量。
model.compile(loss = 'mse', optimizer = tf.keras.optimizers.Adam(0.1))history = model.fit(x_data, y_data, epochs = 500, verbose = False)
print("Finished training the model")
训练结束后,查看损失函数
plt.xlabel('Epoch Number')
plt.ylabel("Loss Magnitude")
plt.plot(history.history['loss'])
预测新的数字
print(model.predict([100.0]))
300.81683,符合预期
查看训练过程中的中间层结果
These are the layer variables: [array([[3.0001688]], dtype=float32), array([0.79995996], dtype=float32)]
与3.0和0.8接近。
如果换用多层简单网络
l_0 = tf.keras.layers.Dense(units=4, input_shape=[1])
l_1 = tf.keras.layers.Dense(units=4)
l_2 = tf.keras.layers.Dense(units=1)
model = tf.keras.Sequential([l_0, l_1, l_2])
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(0.1))
model.fit(x_data, y_data, epochs=500, verbose=False)
print("Finished training the model")
print(model.predict([100.0]))
print("Model predicts that 100 degrees Celsius is: {} degrees Fahrenheit".format(model.predict([100.0])))
print("These are the l0 variables: {}".format(l_0.get_weights()))
print("These are the l1 variables: {}".format(l_1.get_weights()))
print("These are the l2 variables: {}".format(l_2.get_weights()))