TensorFlow基础知识

基本概念

计算模型(计算图)

// 还没看懂

数据模型(张量)

所有数据都是通过张量的形式来表示, 在张量中并没有真正保存数字, 它保存的是如何得到这些数字的计算过程

对中间结果的引用

# a和b 就是对常量生成这个运算结果的引用
a = tf.constant([1.0, 2.0], name ="a")
b = tf.constant([2.0, 3.0], name ="b")
result = a + b

# Tensor("add:0", shape=(2,), dtype=float32)

获得计算结果

当计算图构造完成之后, 张量可以用来获得计算结果, 也就是得到真实的数字

print(tf.Session().run(result))
# [3. 5.]

变量

  • 变量与张量的关系
    • 在tf中, 变量的声明函数tf.Variable是一个运算, 这个运算的结果就是一个张量
    • 变量是特殊的张量
  • 所有变量都会被自动加入到GraphKeys.VARIABLES集合
  • 如果声明函数时参数trainable为True, 那么这个变量将会被加入GraphKeys.TRAINABLE_VARIABLES
  • tf中提供的神经网络优化算法会将GraphKeys.TRAINABLE_VARIABLES集合中的变量作为默认的优化对象
  • 类型
    • 一个变量在构建之后, 它的类型就不能再改变
  • 维度(shape)
    • 维度在程序运行中是有可能改变的, 但是需要通过设置参数validate_shape = False
    • 虽然tf支持更改维度, 但是实际中很少用

      运行模型(会话)

  • 会话拥有并管理tf程序运行时的所有资源
  • 当所有计算完成之后,需要关闭会话来帮助系统回收资源, 否则就可能出现资源泄露的问题

    第一种模式

    明确调用会话生成函数和关闭会话函数
    # 创建一个会话
    sess = tf.Session()
    # 得到运算结果
    sess.run(result)
    # 关闭会话使得本次运行中的资源可以被释放
    sess.close()

实现神经网络

通过对参数的合理设置来解决分类或者回归问题

  • 特征向量
    • 所有用于描述实体的数字的组合就是一个实体的特征向量, 通过特征提取, 就可以将实际问题中的实体转化为空间中的点
  • 神经网络结构
    • 不同的神经元之间的连接结构
  • 神经网络的优化过程
    • 优化神经元中参数的取值过程
  • 全连接神经网络
    • 相邻两层之间任意两个节点之间都有连接
  • 每个神经元的输入既可以是其他神经元的输出, 也可以是整个神经网络的输入
  • 一个最简单的神经元结构的输出就是所有输入的加权和, 不同输入的权重就是神经元的参数

神经网络解决分类问题

  • 提取问题中实体的特征向量作为输入
  • 定义神经网络的结构, 并定义如何从神经网络的输入得到输出(前向传播算法)
  • 通过训练数据集来调整神经网络中参数的取值(训练)
  • 使用训练好的神经网络来预测未知的数据

    前向传播算法

  • 计算神经网络的前向传播结果需要三部分信息

    • 神经网络的输入, 就是从实体中提取的特征向量
    • 神经网络的连接结构
      • 神经网络是由神经元构成的, 神经网络的结构给出不同神经元(节点)之间输入输出的连接关系
    • 每个神经元中的参数

      监督学习方式

      使用监督学习的方式来更合理地设置参数取值, 设置神经网络参数的过程就是神经网络的训练过程, 只有经过有效训练的神经网络模型才可以真正的解决分类或者回归问题

    使用监督学习的方式设置神经网络参数需要一个标注好的训练数据集 (eg. 收集的一批合格和不合格的零件)

    重要思想: 在已知答案的标注数据集上, 模型给出的预测结果要尽量接近真实答案

    通过调整神经网络中的参数对训练数据进行拟合, 可以使得模型对未知的样本提供预测的能力

训练神经网络过程

  • 定义神经网络的结构和前向传播的输出结果
  • 定义损失函数以及选择反向传播优化的算法
  • 生成会话并在训练数据上反复运行反向传播优化算法

深度神经网络

神经网络有两个非常重要的特性 ———— 多层 和 非线性

  • 多层
    • 感知机
      • 感知机可以简单地理解为单层的神经网络
      • 将输入进行加权和,通过激活函数,得到输出,没有隐藏层
    • 异或问题
      • 如果2个输入的符号相同,则输出0,否则输出1
      • 感知机无法模拟异或运算的功能
    • 深度神经网络实际上有组合特征提取的功能
  • 线性模型的局限性
    • 线性模型最大的特点就是任意线性模型的组合仍然是线性模型
    • 只通过线性变换,任意层的全连接神经网络和单层神经网络模型的表达能力没有任何区别,而且它们都是线性模型
    • 线性模型能解决线性可分问题,但在现实世界中,绝大部分问题都是无法线性分割的
    • 深度学习定义中,特意强调它的目的是为解决更加复杂的问题,至少是无法通过直线(或者高维空间的平面)划分的
  • 激活函数
    • 将每个神经元的输出通过一个非线性函数(激活函数),那么整个神经网络的模型也就不再是线性的了
    • 常用的激活函数
      • ReLu tf.nn.relu
      • sigmoid tf.sigmoid
      • tanh tf.tanh

损失函数

分类问题

分类问题希望解决的是将不同的样本分到事先定义好的类别中

通过神经网络解决多分类问题最常用的方法是设置n个输出节点,理想情况下,类别所对应的输出节点值为1,其他都是0

  • 交叉熵(常用损失函数)
    • 两个概率分布之间的距离
    • 交叉熵值越小,两个概率分布越接近
    • y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))
  • softmax回归处理
    • 将神经网络的输出变成一个概率分布
  • 因为交叉熵一般会与softmax回归一起使用,所以tf对这两个功能进行了统一封装
    • tf.nn.softmax_cross_entyopy_withlogits(y, y)
    • y: 输出结果; y_: 标准答案

回归问题

回归问题解决的是对具体数值的预测,不是事先定义好的一个类别,而是一个任意实数(房价预测、销量预测等)
解决回归问题的神经网络一般只有一个输出节点,这个节点的输出值就是预测值

  • 均方误差(常用损失函数,同时也是分类问题常用损失函数)
    • tf.reducemean(tf.square(y - y))

自定义损失函数

自定义损失函数,使得神经网络优化的结果更加接近实际问题和需求

  • 预测商品销量
    • 比如在预测商品销量时,假设一个商品的成本是1元,利润是10元。那么少预测一个就少挣10元,多预测一个才少挣1元
    • 为了最大化利润,需要将损失函数和利润直接联系起来
    • 不同情况下有不同的预测值
      • 正确值比预测值大, 10 * (y_ - y)
      • 正确值小于等于预测值, 1 * (y - y_)
    • loss = tf.reduce_sum(tf.select(tf.greater(v1, v2), a(v1-v2), b(v2-v1)))

神经网络优化算法

反向传播算法

  • 反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能小
  • 反向传播算法是训练神经网络的核心算法

梯度下降算法

主要用于优化单个参数的取值

函数方法

函数

函数名 功能 使用
get_shape 获取结果张量的维度信息 result.get_shape()

tensorflow 函数

函数名 功能 使用
all_variables 获取当前计算图上所有的变量, 有助于持久化整个计算图的运行状态 tf.all_variables()
trainable_variables 得到所有需要优化的参数
initialize_all_variables 初始化所有变量 tf.initialize_all_variables()
clip_by_value 将一个张量中的数值限制在一个范围内,可以避免一些运算错误(log0),小于min的被换成min,大于max的被换成max tf.clip_by_value(v, min, max)
log 对张量中所有元素依次求对数 tf.log(v)
加减乘除 元素之间直接相操作 v1 * v2
matmul 矩阵乘法 tf.matmul(v1, v2)
reduce_mean 整个矩阵取平均 tf.reduce_mean(v)
square 求平方 tf.square(y_ - y)
greater v1是否大于v2, 返回False, True,输入张量维度不一样时,tf会进行类似numpy广播操作的处理s tf.greater(v1, v2)
select true返回v1 false返回v2 tf.select(True, v1, v2)

math库

函数 涵义
math.pi 圆周率
math.ceil(x) 对x向上取整
math.floor(x) 对x向下取整
math.pow(x, y) x的y次方
math.sqrt(x) x的平方根
math.fsum(list1) 对集合内的元素求和
… …

更多

pandas分析数据


'''
数据清洗
'''
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def main():
aqi_data = pd.read_csv('china_city_aqi.csv')
# 前两行
# print(aqi_data.head(2))
# 后两行
# print(aqi_data.tail(2))
# print('基本信息: ')
# print(aqi_data.info())

# 数据清洗
# 只保留数据 > 0
# filter_condition = aqi_data['AQI'] > 0
# clean_aqi_data = aqi_data[filter_condition]

clean_aqi_data = aqi_data[aqi_data['AQI'] > 0]

# print('AQI最大值: ', aqi_data['AQI'].max())
# print('AQI均值: ', aqi_data['AQI'].mean())

# top10
top10 = clean_aqi_data.sort_values(by=['AQI']).head(50)
# print('空气质量最好的10个城市:', top10)

top10.plot(kind='bar', x='city', y='AQI', title='空气最好的10个城市', figsize=(20, 10))
plt.savefig('top_10_aqi.png')
plt.show()

bottom10 = clean_aqi_data.sort_values(by=['AQI'], ascending=False).head(10)
# print('空气质量最差的10个城市:', bottom10)

# 数据保存csv文件, 不要索引号
# top10.to_csv('top10_aqi.csv', index=False)


if __name__ == '__main__':
main()

用python实现网络爬取数据

获取所有的数据,保存在csv文件中

引入的库

  • import requests
  • from bs4 import BeautifulSoup
    • 解析html的库
  • import csv

    main函数

    def main():
    city_list = get_all_citys()

    header = ['city', 'AQI', 'pm2.5/h', 'pm10/h', 'co/h', 'no2/h', 'o3/h', 'o3/8h', 'so2/h']
    # 写入的方式打开文件,没有会自动创建
    with open('china_city_aqi.csv', 'w', encoding='utf-8', newline='') as f:
    # 拿到writer
    writer = csv.writer(f)
    # 写入第一行
    writer.writerow(header)
    # enumerate获取索引号
    for i, city in enumerate(city_list):
    city_name = city[0]
    city_pinyin = city[1]
    city_aqi = get_city_aqi(city_pinyin)
    # 列表相加
    row = [city_name] + city_aqi
    writer.writerow(row)
    if (i + 1) % 10 == 0:
    print('已处理{}条记录, 共{}条记录'.format(i+1, len(city_list)))


    if __name__ == '__main__':
    main()

获取所有城市的名字和链接: get_all_citys()

def get_all_citys():
# 首页地址
url = 'http://pm25.in/'
# 获取整个页面的html
r = requests.get(url, timeout = 30)
soup = BeautifulSoup(r.text, 'lxml')
city_div = soup.find('div', {'class': 'all'}).find('div', {'class': 'bottom'})
city_link = city_div.find_all('a')
city_list = []
for link in city_link:
city_name = link.text
# href="/beijing"
city_pinyin = link['href'][1:] # 去掉斜杠
# 以元祖的形式保存
city_list.append((city_name, city_pinyin))
return city_list

获取特定城市的数据: get_city_aqi(city)

def get_city_aqi(city):
url = 'http://pm25.in/' + city
r = requests.get(url, timeout = 30)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all('div', {'class': 'span1'})

city_aqi = []
# 一共要获取8个数据
for i in range(8):
div_content = div_list[i]
# strip去掉前后空格
caption = div_content.find('div', {'class': 'caption'}).text.strip()
value = div_content.find('div', {'class': 'value'}).text.strip()
# city_aqi.append((caption, value))
city_aqi.append(value)
return city_aqi

拟合一元二次方程过程

前言: 首先, 这些代码是网上有的, 现在正处理刚开始学习TensorFlow的阶段, 所以将网上的demo分步理解的过程整理了下, 损失函数这一块还不是很了解。

生成函数图

生成x轴数据

# np.linspace
# 在指定的间隔内返回均匀间隔的数字
# np.newaxis()
# 插入新维度, 在使用功能上等价于None, 其实就是None的一个别名, 可以用None代替
# 生成一个 [[-1] [-0.9...]...[...], [1]] 的 300行1列 矩阵
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]

生成噪点

python内置数据结构

内置数据结构

list

创建列表

一般方式创建列表

1. 直接赋值
a = []
2. 指定类型,转换数据类型
a = list((2,3,4))
3. 通过列表内涵,创建新列表
a = [1,2,3,5]
# 对于a中元素, 逐个放入b中
b = [i for i in a]
4. 使用分片操作
a = [1,2,3,4,5]
b = [:]

for 循环创建列表

如何查看matlab自带函数的源代码

matlab会自带一些比较专用或者多用的函数提供给用户(比如:fft,rgb2gray……),我们只需要调用这些函数就可以得到我们所需要的结果,而不必关心函数内部是怎么实现的。但有时候,我们需要将函数的实现移植到其他语言中(或者低版本中没有定义你所需要的函数),就需要了解函数的代码实现。以下是查看matlab源码的方法:
1.在命令行窗口输入:type 函数名 (type fft),回车就会出现该函数的源代码和相应的注释。
2.open 函数名,打开该函数的m文件。
3.edit 函数名,也是打开该函数的m文件
matlab中的一些内置函数是看不到源码的,比如:max,min,find……

python基础知识

知识点

因为感觉学的编程语言一多,很多的规则都会搞混,所以就整理一下一些使用方法(看廖雪峰官网的总结版本3)

注释:

大小写敏感
r’’表示’’里的字符不转义
以:结束时,锁紧的语句视为代码块
空值:None
除法:/ 得到浮点数
地板除:// 得到整数
取余:%
输入:name = input(‘name:’);
输出:print();
转换成整数:int();input()输入的是str,与数据进行比较时要转换类型

字符串

字符转ASCII:ord(‘A’);
ASCII转字符:chr(65);
b’ABC’:bytes类型,每个字符只占一个字节;
‘ABC’.encode(‘ascii’):b’ABC’ 编码为指定bytes;

|