Tensorflow 学习笔记

一、张量Tensor

TensorFlow 使用张量(Tensor)作为数据的基本单位。TensorFlow 的张量在概念上类似于多维数组,我们可以使用它来描述数学中的标量(0 维数组)、向量(1 维数组)、矩阵(2 维数组)等各种量,张

量的重要属性是其形状、类型和值。可以通过张量的shapedtype属性和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))

 

posted @ 2022-04-24 23:30  熊能能  阅读(99)  评论(0)    收藏  举报