layers.Dense(units,activation):unit输出结点数,activation激活函数
从输入层到隐藏层1.连接输入层和隐藏层的W1和b1,经过矩阵计算H1=X×W1+b1,权重W1shape=[2,6],输入层shape=[1,2],此时第一层输出为shape=[1,6]的矩阵,再经过激活函数增加拟合度
x=tf.constant([[1,2]],dtype=tf.float32)#[1,2] 输入层 w1=tf.Variable(tf.random.truncated_normal([2,6],stddev=0.1))#[2,6] # print(w1)#w1,b1是两个 b1=tf.Variable(tf.zeros([6])) h1=tf.matmul(x,w1)+b1 h1=tf.nn.relu(h1) print(h1)
常用的激活函数有sigmoid(用于二分类),tanh,ReLU,LeakyRelu,ELU,PReLU,RReLU等
激活函数的作用是将输入的信息进行非线性变换,将变换后的神经元的信息输出当作下一个神经元信息的输入,由于其引入非线性因素,故可以让神经网络逼近任何非线性函数。
从隐藏层到隐藏层可以和1一样,h1为输入,权重W2shape=[6,5],得到隐藏层shape=[1,5]
或者直接使用layers.Dense(units,activation)
fc2=layers.Dense(5,activation=tf.nn.relu)从隐藏层到输出层
可以使用layers.Dense(units,activation),且此时无激活函数
fc3=layers.Dense(4,activation=None)#无激活函数,到输出层MNIST网络架构
import tensorflow as tf
import tensorflow.keras as keras
(x_train,y_train),(x_test,y_test)=keras.datasets.mnist.load_data()
print(x_train.shape)#(60000,28,28)
print(y_train.shape)
print(x_test.shape)#(10000,28,28)
print(y_test.shape)
x_train,x_test=x_train/255.0,x_test/255.0
model=tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=[28,28]),
tf.keras.layers.Dense(128,activation=tf.nn.relu),
tf.keras.layers.Dense(64,activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),#随机删除神经元,防止过度拟合
tf.keras.layers.Dense(10,activation='softmax')
])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',
metrics=['accuracy'])#训练时的参数
model.fit(x_train,y_train,batch_size=32,epochs=5,validation_data=(x_test,y_test),validation_freq=1)
#训练集和测试集的输入特征和标签,batch_size大小,要迭代多少次epochs数据集
model.summary()#打印网络结构和参数统计
model.evaluate(x_test,y_test)#测试训练集的预测好坏
二、卷积神经网络(CNN,Convolutional Neural Network)
由一个或多个卷积层和顶端的全连接层组成,同时也包括关联权重和池化层(Pooling layer)
卷积tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC", dilations=[1, 1, 1, 1], name=None)
input:需要做卷积的输入图像,是tensor,具有[batch, in_height, in_width, in_channels],分别表示图片数量,图片高度,图片宽度,图片通道数
filter:卷积核,tensor,具有[filter_height, filter_width, in_channels, out_channels],分别表示卷积核的高度,卷积核的宽度,图像通道数,卷积核个数。
激活 池化需要一个池化核,通常取最大值或者平均值来代替这个区域,最大值有提取纹理的功能,平均值则考虑了背景。最大池化是最为常见的,将输入的图像划分为若干个矩阵区域,对每个矩形区域输出最大值。
使用类layers.Conv2D可以不需要手动定义卷积核W和偏置b张量,在使用时会自动创建
三、搭建网络 1.顺序模型 Sequential内置序列import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model=tf.keras.Sequential([
layers.Dense(10,activation='relu',input_shape=(1,),name='layer1'),
layers.Dense(15,activation='relu',name='layer2'),
layers.Dense(5,activation='softmax',name='outputs')
])
model.summary()
Sequential外置序列
model=tf.keras.Sequential() model.add(layers.Dense(10,activation=tf.nn.relu,input_shape=(1,),name="layer1")) model.add(layers.Dense(15,activation=tf.nn.relu,name='layer2')) model.add(layers.Dense(5,activation=tf.nn.softmax,name='outputs')) model.summary()2.函数模型
inputs=tf.keras.Input(shape=(1,),name='inputs') layer1=layers.Dense(10,activation="relu",name="layer1")(inputs) # 隐藏层-2 layer2 = layers.Dense(15, activation="relu", name="layer2")(layer1) # 输出层 outputs = layers.Dense(5, activation="softmax", name="outputs")(layer2) model=tf.keras.Model(inputs=inputs,outputs=outputs) model.summary()3.子类模型
class MyModel(tf.keras.Model):#类继承方法
def __init__(self):
super(MyModel, self).__init__()#继承
self.layer1 = layers.Dense(10, activation=tf.nn.relu, name="layer1")
# 隐藏层-2
self.layer2 = layers.Dense(15, activation=tf.nn.relu, name="layer2")
# 输出层
self.outputs = layers.Dense(5, activation=tf.nn.softmax, name="outputs")
def call(self, inputs, training=None, mask=None):
layer1=self.layer1(inputs)
layer2=self.layer2(layer1)
return self.outputs(layer2)
inputs=tf.constant([[1]])
print(inputs.shape)
model=MyModel()
model(inputs)
model.summary()
四、模型的加载与保存
tensorflow2中模型有ckpt、h5、pb三种格式
ckpt包含checkpoint(存储最新文件的模型名称),data(存储张量的数值),index(data的索引)
tf.train.Checkpoint(params).save()#保存
h5将模型的参数以及网络结构保存为一个整体文件
tf.keras.Model(params).save() tf.keras.Model(params).save_weight()
pb格式服务器部署模型
tf.keras.models.save_model(params)
加载
只加载模型参数:load_weight(filepath,by_name=False)
同时加载模型参数和网络结构:tf.keras.models.load_model(filepath,custom_objects=None,compile=True)



