Tensorflow2.0学习——常用层和三种建模方式

常用层

  • tf.nn
  • tf.keras.layers
    主要就是上面的两个模块。tf.nn:底层的函数库,其他各种库可以说都是基于这个底层库来进行扩展的。
    tf.keras.layers:如果说 tf.nn 是轮子,那么 tf.keras.layers可以说是汽车。 tf.keras.layers 是基于 tf.nn 的高度封装。
tf.keras.layers.LSTM(100)
tf.keras.layers.Dense(10)
tf.keras.layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l1(0.01))
tf.nn.softmax(b)
tf.keras.layers.Dense(64, activation=tf.nn.relu)

三种建模方式

Sequential model(不推荐使用)

第一种方式

from tensorflow.keras import layers
import tensorflow as tf
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation='relu'))#第一层
model.add(layers.Dense(64, activation='relu'))#第二层
model.add(layers.Dense(10))#第三层

第二种方式

model = tf.keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(32,)),#第一层
layers.Dense(64, activation='relu'),#第二层
layers.Dense(10)#第三层
    #。。。。。
])
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

import numpy as np
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

model.fit(data, labels, epochs=10, batch_size=32)

Functional model(初学推荐使用)

复杂模型怎么办?
– 多输入模型
– 多输出模型
– 具有共享图层(同一图层被调用多次)的模型,
– 具有非顺序数据流的模型(例如,残余连接)。
– 训练模型和 tf.keras.Sequential
函数式模型是一种创建模型的方法,该模型比tf.keras.Sequential更灵活。函数式模型可以处理具有非线性拓扑的模型,具有共享层的模型以及具有多个输入或输出的模型等等。
深度学习模型通常是层的有向无环图(DAG)的主要思想。因此,函数式模型是一种构建层图的方法。
比如模型如果是具有多输入和多输出的时候,使用Functional model的方式来搭建模型就会更方便一些。


正常情况

inputs = tf.keras.Input(shape=(32,))  
# inputs = tf.keras.Input(shape=(32,))  
x = layers.Dense(64, activation='relu')(inputs) #第一层
x = layers.Dense(64, activation='relu')(x) #第二层
predictions = layers.Dense(10)(x) #第三层

model = tf.keras.Model(inputs=inputs, outputs=predictions)


model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

import numpy as np
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
model.fit(data, labels, batch_size=32, epochs=5)

多输入的情况

inputs1 = tf.keras.Input(shape=(32,))  #输入1
inputs2 = tf.keras.Input(shape=(32,))  #输入2
x1 = layers.Dense(64, activation='relu')(inputs1) #第一层
x2 = layers.Dense(64, activation='relu')(inputs2) #第一层
x = tf.concat([x1,x2],axis=-1)
x = layers.Dense(64, activation='relu')(x) #第二层
predictions = layers.Dense(10)(x) #第三层

model = tf.keras.Model(inputs=[inputs1,inputs2], outputs=predictions)

model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

import numpy as np
data1 = np.random.random((1000, 32))
data2 = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
model.fit((data1,data2), labels, batch_size=32, epochs=5)

Subclassing model(推荐使用)

Subclassing model的模型搭建方式与Pytorch非常的像。拥有更高的自由度。
– 通过子类化 tf.keras.Model 和定义自己的前向传播模型来构建完全可定制的模型。
– 和 eager execution 模式相辅相成。

class MyModel(tf.keras.Model):

    def __init__(self, num_classes=10):
        super(MyModel, self).__init__(name='my_model')
        self.num_classes = num_classes
        # 定义自己需要的层
        self.dense_1 = layers.Dense(32, activation='relu') #
        self.dense_2 = layers.Dense(num_classes)

    def call(self, inputs):
        #定义前向传播
        # 使用在 (in `__init__`)定义的层
        x = self.dense_1(inputs)
        x = self.dense_2(x)
        return x
model = MyModel(num_classes=10)
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
import numpy as np
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
#Trains for 5 epochs.
model.fit(data, labels, batch_size=32, epochs=5)

发表评论

您的电子邮箱地址不会被公开。