前言
以下内容是在学习过程中的一些笔记,难免会有错误和纰漏的地方。如果造成任何困扰,很抱歉。
TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,是一个功能强大的开源软件库,它由Google的布莱恩(Brain)团队开发,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。
一、前置基础
描述:这里可以添加本文要记录的大概内容
1.1 什么是神经网络
我们先从人类的大脑开始构思,人的大脑都是由无数个神经元构成,神经元之间相互通过脉络链接,组成一个庞大的神经元网络。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GT4mnGTG-1662906394071)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/头脑风暴.png)]
当人看到一只猫?抑或是一只狗时,神经网络会如何处理这些信息?
当一组图像输入到神经网络中,会被拆解成无数个可识别的/不可识别的标签,经过层层算法递进,找到最终自认为正确的一个结果(是猫是狗或是其它)。
神经网络小玩具地址 |
---|
A Neural Network Playground (tensorflow.org) |
然后简单的看一下分类
单个神经网络由多个互联的神经元构成,组织形式叫层
,某一层的神经元会将消息传递到其下一层神经元(术语为“发射
”),这即是神经网络的运行方式。
具有单个线性层的模型叫做感知器,如果模型中含有多个线性层,则称之为多层感知器
(MLP)。
事实上,机器学习的模型就是一种计算函数的方法,这个函数把对应的输入映射到对应的输出上,在这个过程中,通过损失函数(待优化的内容)的一些度量指标,逐渐不断的将模型修正。
1.2 机器学习的类型
在机器学习中,根据学习方式不同,大致归为了如下几类:
- 监督学习 - Supervised Learning
- 无监督学习 - Unsupervised Learning
- 强化学习
- 元学习/AutoML - Meta Learning
监督学习
对事先处理过
的带有标签
的数据组进行训练及量化,常见的方式有
- 分类-----类别,一手房/二手房
- 回归-----连续性数据,如耗电量
无监督学习
对没有标签的数据
进行建模,对没有事先标记的、无法事先处理的数据
进行自动分类/分群,常用的算法有
- 聚类算法
- 数据降维
强化学习
通过自动调整策略获取最大期望回报,自主探索寻找最佳模型,例如AI下棋。
AutoML
将机器学习应用于现实问题的端到端流程自动化的过程,从特征工程、模型构建、超参优化三方面实现自动化。
1.3 什么是线性回归
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-md5TkXrO-1662906394072)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习入门-线性回归模型公式-2.png)]
b为误差服从均值为0的正态分布。
如果只有一个自变量的情况下就叫一元回归
;
如果有多个自变量的情况下就叫多元回归
;
以你的工资为例,影响你工资的可能因素有很多:老板赏识、工作努力、运气不错等,如果从一个相对简单的角度去思考,你的工资仅仅由领导的心情决定,通过回归,我们就可以确定领导的心情(自变量:这类变量不依赖于其他任何变量)
与工资(因变量:这类变量依赖于一个或多个自变量)
之间的关系。
1.4 TensorFlow Keras
地址 |
---|
关于TensorFlow | TensorFlow中文官网 (google.cn) |
Keras是由Python编写的高阶深度学习API,它主要面向与用户快速开发,而Keras
作为TensorFlow
的前端,屏蔽了底层较为难以理解的算法实现,对用户友好,允许简单而快速的原型设计。
1.5 TensorFlow Estimator
首先对TensorFlow基础架构组成有一个初步的了解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AhVxZc5N-1662906394073)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/tensorflow-基础API架构分布-1.png)]
对于Estimator来说,它是一个高度封装的API,简化开发者的使用,内有许多封装好的、可以直接使用的分类及回归模型。
使用操作步骤
- 创建 x 个输入函数,
input_fn
; - 定义特征列,
feature_columns
,充当输入数据和模型之间的桥梁; - 实例化 Estimator,指定特征列和参数;
- Estimator 对象上调用一个或多个方法,传递适当的输入函数作为数据的来源(train, evaluate, predict);
什么是特征列?什么是输入函数?
特征列
充当输入数据和模型之间的桥梁,用于估算器训练的输入参数作为特征列传递,并指定模型如何解析数据。
输入函数
用于训练、评估和预测的数据需要由输入函数提供。输入函数返回一个tf.data.Dataset对象,该对象返回一个包含特征和标签的元组。
下面看看feature_columns中提供的函数使用
函数名 | 作用 | |
---|---|---|
密集数值 | categorical_column_with_identity | 每个类目都是One-Hot(独热)编码的,因此具有唯一标识。它只适用于数字值。 |
密集数值 | categorical_column_with_vocabulary_file | 当分类输入是字符串且类目在文件中给出时,使用此函数。字符串首先会转换为数字值,然后进行One-Hot编码。 |
密集数值 | categorical_column_with_vocabulary_list | 当分类输入是字符串且类目在列表中明确定义时,使用此函数。字符串首先会转换为数字值,然后进行One-Hot编码。 |
密集数值 | categorical_column_with_hash_bucket | 如果类目的数量非常大,且不可能进行One-Hot编码时,我们使用哈希。 |
密集数值 | crossed_column | 当我们希望将两列合并成单个特征来使用时,使用此函数。例如,对基于地理位置的数据,将经度值和纬度值合并为一项特征是合理的。 |
密集数值 | numeric_column | 当特征为数字时使用,它可以是单个值,甚至是矩阵。 |
分类 | indicator_column | 我们不直接使用它。当且仅当类目数量有限并可由One-Hot编码表示时,将其与分类列一起使用。 |
分类 | embedding_column | 我们不直接使用它。当且仅当类目数量非常大且不能由One-Hot编码表示时,将其与分类列一起使用。 |
分类 | bucketized_column | 当我们根据数据本身的值(而不是特定的数值)将数据划分为不同的类别时,使用此函数。 |
下面通过代码示例消化上面的内容
# 库引入
import tensorflow as tf
from tensorflow import feature_column as fc
# 特征列函数预处理
numeric_column = fc.numeric_column
categorical_column_with_vocabulary_list = fc.categorical_column_with_vocabulary_list
# 定义将用于训练回归器的特征列
featCols = [
tf.feature_column.numeric_column("area"),
tf.feature_column.categorical_column_with_vocabulary_list(
"type", ["bungalow", "apartment"]
)
]
# 定义一个输入函数以提供训练的输入 该函数返回一个包含特征和标签的元组
def train_input_fn():
features = {
"area": [1000, 2000, 4000, 1000, 2000, 4000],
"type": ["bungalow", "bungalow", "house", "apartment", "apartment", "apartment"]
}
labels = [500, 1000, 1500, 700, 1300, 1900]
return features, labels
# LinearRegressor 数据拟合
model = tf.estimator.LinearRegressor(featCols)
model.train(train_input_fn, steps=200)
# 预测结果
def predict_input_fn():
features = {
"area": [1500, 1800],
"type": ["house", "apt"]
}
return features
predictions = model.predict(predict_input_fn)
print(next(predictions))
print(next(predictions))
总结知识点
- 多元输入
- 特征列函数的使用
1.6 案例:简单一元回归
简单一元线性回归,只有单一的自变量和因变量
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 生成具有线性关系的随机数据 自变量:area 因变量:price
np.random.seed(0)
area = 2.5 * np.random.randn(100) + 25
price = 25 * area + 5 + np.random.randint(20, 50, size=len(area))
# 矩阵转换 数据处理
data = np.array([area, price])
data = pd.DataFrame(data=data.T, columns=['area', 'price'])
# 绘图
# plt.scatter(data['area'], data['price'])
# plt.show()
W = sum(price * (area - np.mean(area))) / sum((area - np.mean(area)) ** 2)
b = np.mean(price) - W * np.mean(area)
# print("计算回归系数", W, b)
# 用得到的权重和偏差值来预测新价格
y_pred = W * area + b
# 绘图
plt.plot(area, y_pred, color='red', label="forecast")
plt.scatter(data['area'], data['price'], label="train")
plt.xlabel("areaX")
plt.ylabel("priceY")
plt.legend()
plt.show()
1.7 模型训练流程
训练系统构成大致分为了四个步骤
- 数据预处理 -> 相当于数据的准备;
- 算法学习 -> 根据数据的具体情况选择合适的机器学习方式,根据不同的精度选择合适的算法;
- 模型验证;
- 模型预测;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ua8KwCQr-1662906394073)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习入门-机器学习系统构成-2.jpg)]
结合上述的库,业务开发不用太过于计较算法的核心实现,在合适的场景下选择合适的模型即可。
1.8 业务通讯结合
在Java代码中执行python文件
package org.springblade.utils;
import org.springblade.core.tool.api.R;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Python工具类
* @author 李家民
*/
public class PythonUtils {
/** Python环境变量 */
private static final String PYTHON_ENV = "E:\\27_python 3\\python";
/**
* 执行python文件并记录
* @param pathFile
* @return
*/
public static R executeAndRecord(