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()

你可能感兴趣的:(深度学习,tensorflow,神经网络,深度学习)