Tensorflow 学习笔记
一、张量Tensor
TensorFlow 使用张量(Tensor)作为数据的基本单位。TensorFlow 的张量在概念上类似于多维数组,我们可以使用它来描述数学中的标量(0 维数组)、向量(1 维数组)、矩阵(2 维数组)等各种量,张
量的重要属性是其形状、类型和值。可以通过张量的shape、dtype属性和numpy()方法获得。
1、创建张量
import tensorflow as tf # 创建0维张量,即标量。int32类型 tensor_0 = tf.constant(4) print(tensor_0) # 创建1维张量。int32类型 tensor_1 = tf.constant([2,3,4]) print(tensor_1) # 创建2维张量。int32类型 tensor_2 = tf.constant([[1,2],[3,4],[5,6]],dtype=tf.float16) print(tensor_2) # 创建3维张量。int32类型 tensor_3 = tf.constant([ [[1,0,2,3,5], [5,6,2,11,2]], [[12,2,22,55,5], [22,22,55,55,95]] ]) print(tensor_3)
2、张量转换成numpy
import numpy as np np.array(tf.constant([])) tf.constant([]).numpy
3、变量
就Tensorflow而言,变量是一种特殊类型的张量对象,他允许我们在训练模型阶段,在tensorflow会话中储存和更新模型的参数。
3.1定义变量
方式1:tf.Variable() 是为新变量创建对象并将其添加到计算图的类。
方式2:tf.get_variable()是假设某个变量名在计算图中,可以复用给定变量名的现有值或者不存在则创建新的变量,因此变量名的name非常重要!
无论采用哪种变量定义方式,直到调用tf.Session启动计算图并且在会话中具体运行了初始化操作后才设置初始值。事实上,只有初始化Tensorflow的变量之后才会为计算图分配内存。
g1 = tf.Graph() with g1.as_default(): w = tf.Variable(np.array([[1,2,3,4],[5,6,7,8]]),name="w") print(w)
3.2初始化变量
由于变量是直到调用tf.Session启动计算图并且在会话中具体运行了初始化操作后才设置初始值,只有初始化Tensorflow的变量之后才会为计算图分配内存。因此这个初始化的过程十分重要,这个初始化过程包括:为 相关张量分配内存空间并为其赋予初始值。
#定义变量:参数可变,形状不可变 a = tf.constant([3,3]) print(a.dtype) print(a.shape)
4、常用函数
# 定义张量a,b a = tf.constant([[1,2],[3,4]]) b = tf.constant([[1,2],[3,4]]) tf.add(a,b) # 求和 tf.subtract(a,b) # 减法 tf.multiply(a,b) # 点乘 tf.divide(a,b) # 除法 #tf.mod(a,b) # 取模 #tf.abs(a) # 绝对值 print(tf.matmul(a,b)) # 矩阵乘法,注意行与列
二、TF使用实例
1、拟合线性函数
import tensorflow as tf import matplotlib.pyplot as plt import numpy as np from tensorflow.keras.optimizers import SGD import os os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2' # 生成数据.100个0-1的随机点 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 # 构建一个顺序模型。顺序模型为kersa中的基本模型结构,类似一层一层叠加网络 model = tf.keras.Sequential() # Dense为全连接层。在顺序模型中加入一个全连接层 # units为输出神经元个数 # input_dim为输入神经元个数,input_dim只需要在输入层设置,其他层的输入自动推导 # keras中网络结构定义好了默认的权值 model.add(tf.keras.layers.Dense(units=1, input_dim=1)) # 设置模型的优化器和代价函数,学习率 # sgd随机梯度下降法 mse均方误差 model.compile(optimizer=SGD(0.03), loss='mse') # 训练2002次 batch:批处理 for i in range(2002): cost = model.train_on_batch(x_data,y_data) if i%500 == 0: print('cost--',cost) y_pred = model.predict(x_data) plt.scatter(x_data,y_data) plt.plot(x_data,y_pred,'r-',lw=3) plt.show()
2、拟合非线性函数
import tensorflow as tf import matplotlib.pyplot as plt import numpy as np from tensorflow.keras.optimizers import SGD import os os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2' # 生成x数据与噪声数据 x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis] noise = np.random.normal(0,0.02,x_data.shape) y_data = np.square(x_data) + noise # 构建顺序网络模型 model = tf.keras.Sequential() # 非线性回归需要一个带有隐藏层的神经网络,并且需要非线性的激活函数 model.add(tf.keras.layers.Dense(input_dim=1,activation='tanh',units=10)) model.add(tf.keras.layers.Dense(activation='tanh',units=1)) # 设置模型的优化与代价函数,学习率为0.3 model.compile(optimizer=SGD(0.3),loss='mse') for i in range(3001): cost = model.train_on_batch(x_data,y_data) if i%1000 == 0: print("cost--",cost) y_pred = model.predict(x_data) plt.subplot(2,2,i/1000 + 1) plt.scatter(x_data,y_data) plt.plot(x_data,y_pred,'r-') plt.title("picture:" + str(i/1000 + 1)) plt.show()
三、手写数字图片分类任务
1.MNIST数据集介绍
MNIST是一个手写数字的数据集。其中训练集有60000张图片,测试集有10000张图片,每一张图片包含 28*28个像素。下载网站为http://yann.lecun.com/exdb/mnist/。标签是介于0-9的数字,有时候把标签转化为独热编码,然后再传给模型训练。
2.Softmax函数介绍
多分类问题中通常使用softmax函数作为网络输出层的激活函数,software函数可以对输出值进行归一化操作,把所有输出值都转化为概率,概率之和为1。
3.简单MNIST数据集分类模型-keras封装
import tensorflow as tf from tensorflow.keras.optimizers import SGD # 1.获取数据 mnist = tf.keras.datasets.mnist ''' 数据载入的时候已经划分好了训练集和测试集 x_train(60000,28,28) y_train(60000) x_test (10000,28,28) y_test (10000) ''' # 2.数据基本处理 (x_train,y_train),(x_test,y_test) = mnist.load_data() # 必须以元组的形式接收 # 3.数据归一化 x_test = x_test/255.0 x_train = x_train/255.0 y_train = tf.keras.utils.to_categorical(y_train,num_classes=10) y_test = tf.keras.utils.to_categorical(y_test,num_classes=10) # 4.特征工程 # Flatten把数据从3维变成2维 (60000,28,28)-->(60000,784) # 输入数据形状input_shape不包含数据的数量 (28,28)即可 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28,28)), tf.keras.layers.Dense(10,activation='softmax') ]) # 优化器 sgd = SGD(0.1) model.compile(optimizer=sgd,loss='mse',metrics=['accuracy']) model.fit(x_train,y_train,epochs=10,batch_size=32,validation_data=(x_test,y_test))