Tensorflow搭建神经网络(API及相关参数解析)
神经网络八股
用Tensorflow API:tf.keras搭建网络八股
 
六步法
- import引入相关模块
- train, test告知要喂入网络的输入集以及测试集
- model = tf.keras.models.Sequential搭建网络结构,逐层描述网络结构,相当于走了一遍前向传播
- model.compile配置训练方法,选择优化器,损失函数,评测指标
- model.fit执行训练过程,告知训练集和测试集的输入特征和标签,告知batch的大小,告知要进行多少次迭代
- model.summary打印出网络的结构和参数统计
model = tf.keras.models.Sequential([网络结构])
 
Sequential相当于一个容器,封装了一个神经网络
网络结构举例:
拉直层: tf.keras.layers.Flatten()
 拉直层不含计算,仅有形状转换,把输入特征变为一维数组
全连接层: tf.keras.layers.Dense(神经元个数, activation='激活函数',
 kernel_regularizer=哪种正则化)
activation(字符串给出)可选择的有: relu, softmax, sigmoid, tanh
kernel_regularizer可选: tf.keras.regularizers.l1(), tf.keras.regularizers.l2()
卷积层: tf.keras.layers.Conv2D(filters = 卷积核个数, kernel_size = 卷积核尺寸,
 strides=卷积步长, padding="valid"or"same")
LSTM层: tf.keras.layers.LSTM()
model.compile(optimizer=优化器, loss=损失函数, metrics=["准确率"])
 
optimizer可选:
‘sgd’ or tf.keras.optimizers.SGD(lr=学习率, momentum=动量参数)
‘adagrad’ or tf.keras.optimizers.Adagrad(lr=学习率)
‘adadelta’ or tf.keras.optimizers.Adadelta(lr=学习率)
‘adam’ or tf.keras.optimizers.Adam(lr=学习率, beta_1=0.9, beta_2=0.999)
loss可选:
‘mse’ or tf.keras.losses.MeanSquaredError()
‘sparse_categorical_crossentropy’ or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) # 参数在询问输入是不是原始输入(有没有经过概率分布处理过)
Metrics可选:
‘accuracy’: y_和y都是数值,如y_=[1] y=[1]
‘categorical_accuracy’: y_和y都是独热码(概率分布),如y_=[0, 1, 0] y=[0.256, 0.695, 0,048]
‘sparse_catagorical_accuracy’: y_是数值,y是独热码(概率分布),如y=[1] y=[0.256, 0.695, 0,048]
model.fit
model.fit(训练集的输入特征, 训练集的标签, batch_size= , epochs= ,
 validation_data=(测试集的输入特征, 测试集的标签),
 validation_split=从训练集划分多少比例给测试集,
 validation_freq=多少次epoch测试一次)
代码测试
import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist # 调用了mnist里的fashion测试集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 将0~255之间的灰度值转化为0~1之间的灰度值,把输入值变小更易于神经网络的吸收
model = tf.keras.models.Sequential([ # 定义网络结构
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])
model.compile( # 设置训练参数
    potimizer='adadela',
    loss='sparse_categorical_crossentropy',
    metrics=['sparse_categorical_accuracy']
)
model.fit(x_train, y_train, epochs=30, validation_data=(x_test, y_test), validation_freq=2) # 模型训练
model.summary()
搭建网络八股Class
用Sequential只能搭建出上层输出就是下层输入的神经网络结构,没有办法搭建出带有跳连等复杂结构的神经网络,这时我们可以选择用类class搭建神经网络结构
- import引入相关模块
- train, test告知要喂入网络的输入集以及测试集
- class MyModel(Model) model = MyModel
- model.compile配置训练方法,选择优化器,损失函数,评测指标
- model.fit执行训练过程,告知训练集和测试集的输入特征和标签,告知batch的大小,告知要进行多少次迭代
- model.summary打印出网络的结构和参数统计
可以用class封装一个神经网络结构
class MyModel(Model): # Model表示继承了TensorFlow的Model类
  def __init__(self):
    super(MyModel, self).__init__()
    # 这里定义网络结构块
   def call(self, x):
    # 这里调用网络结构块,实现前向传播
    return y
model = MyModel()
举个例子:
class IrisModel(Model):
  def __init__(self):
    super(IrisModel, self).__init__()
    self.d1 = Dense(3) # d1是对这一层起的名字,每一层都用self.引导
    
  def call(self, x):
    y = self.d1(x)
    return y
model = IrisModel()
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号