关于tensorflow中Sequential与Model的模型输入与输出

看了网上很多关于Tensorflow的Sequential与Model的讲解,绝大部分都是照搬官方说明讲一遍。不想想要是官方说明说的清还会来看你的讲解?

两者简单说明

tf.keras.Sequential是通过序列层来构建模型的,其本身返回的还是一个继承tf.keras.Model的实例。
tf.keras.Model是一个模型类,作用就是来构建模型的。

输入与输出

对于任何模型,最关键的就是其输入与输出,Tensorflow从设计上就通过类的参数来强势让你自己先理清什么是输入与输出。

对于tf.keras.Sequential:

如果输入的是一个层,则返回模型内部层处理后"最后的层",
如果输入的是一个"具体的值",则返回该值经过模型内部层处理后的"最后值"

import tensorflow as tf

model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer((28,28,3)))
model.add(tf.keras.layers.Dense(100,activation='relu'))
model.add(tf.keras.layers.Dense(32,activation='relu'))
model.add(tf.keras.layers.Dense(16,activation='relu'))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))

输入一个层,返回输出最后一个层结果,可以看见,输入shape要求是(,28,28,3),输出变成(,28,28,1)与最后一个Dense层的输出保持一致。

m1 = model(tf.keras.layers.Input(shape=(28,28,3)))
m1
#<tf.Tensor 'sequential/dense_3/Sigmoid:0' shape=(None, 28, 28, 1) dtype=float32>

输入一个值,则返回该值经过Sequential内部一些列层后得到的最终值.

value = tf.random.normal((3,28,28,3))
value.shape
#TensorShape([3, 28, 28, 3])

m2 = model(value)
m2
#
<tf.Tensor: shape=(3, 28, 28, 1), dtype=float32, numpy=
array([[[[0.51777893],
         [0.5383248 ],
         [0.5338475 ],
         ...,
         [0.52277124],
         [0.51066947],
         [0.50479525]],

        [[0.5285166 ],
         [0.61327916],
         [0.52412134],
         ...,
         [0.5799711 ],
         [0.5148077 ],
         [0.5191372 ]],

        [[0.5803058 ],
         [0.5223268 ],
         [0.53054047],
         ...,
         [0.5593277 ],
         [0.5683962 ],
         [0.5282355 ]],
show more (open the raw output data in a text editor) ...

         [0.6011244 ],
         [0.51908755],
         ...,
         [0.5288701 ],
         [0.5402269 ],
         [0.52987367]]]], dtype=float32)>
对于tf.keras.Model:

它是用来构建模型的,有两种方式构建:
一种是直接通过Model构造函数直接构建,
一种是通过继承Model类来构建。
这里主要说一下通过构造函数直接构建模型,因为这个是比较让人迷惑的方式。该方法为:

model = Model(inputs,outputs)

说明:
Model只有两个参数,第一个是输入,第二个是输出,每个参数可以是一个列表或tuple,也可以是一个元素。
这里Model()跟我们常见的输入因得到果这个思路不一样。它的参数既需要输入元素,同时又需要最终输出结果。即想要构建一个模型,你既要告诉我输入具体是什么,还得告诉我具体的输出是什么。它就像一个功能工具,比如说炒锅,你要告诉它输入是 鸡蛋+米饭,要得到蛋炒饭,它才会给你做一个蛋炒饭而不是鸡蛋锅巴。你告诉它输入是 鸡蛋+水,要得到水煮蛋,它才会给你弄个水煮蛋而不是鸡蛋汤。
将完整的Inputs与Outputs传入Model的整个过程才算是模型的构建。

注意Sequential与Model的混合使用

如果不理解Sequential与Model的机制,这种组合构建模型是最让人迷惑的地方。
只需要记住两句话:
1.如果要使用tf.keras.Model的构造方法来直接构造模型,输入与输出必须是"层",
2.此时通过tf.keras.Sequential来构建的必然是最终的输出层,用来给Model作为其Outputs的.

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TensorFlow是一个强大的机器学习库,可以用于构建和训练各种深度学习模型。在训练完一个模型后,我们通常会将模型保存到磁盘上以备将来使用。TensorFlow提供了一种简单的方法来保存和加载模型。 在 TensorFlow ,我们可以使用 `tf.saved_model` API 将模型保存到一个文件夹。该文件夹包含了模型的图和变量等信息。保存模型时,我们可以指定要保存的内容,例如只保存变量或只保存图等等。 以下是一个保存和加载模型的示例: ```python import tensorflow as tf from tensorflow import keras # 构建一个简单的模型 model = keras.Sequential([ keras.layers.Dense(64, activation='relu', input_shape=(784,)), keras.layers.Dense(10, activation='softmax') ]) # 训练模型 model.compile(optimizer=tf.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) # 保存模型 export_path = './saved_model' tf.saved_model.simple_save( keras.backend.get_session(), export_path, inputs={'input_image': model.input}, outputs={t.name: t for t in model.outputs}) # 加载模型 with tf.Session(graph=tf.Graph()) as sess: tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], export_path) graph = tf.get_default_graph() inputs = graph.get_tensor_by_name('input_image:0') outputs = graph.get_tensor_by_name('dense_1/Softmax:0') result = sess.run(outputs, feed_dict={inputs: x_test}) print(result) ``` 在上面的示例,我们首先构建了一个简单的神经网络模型并训练了它。然后我们使用 `tf.saved_model.simple_save` 将模型保存到一个文件夹。在保存模型时,我们指定了模型输入输出。最后,我们使用 `tf.saved_model.loader.load` 方法加载模型并运行它。 值得注意的是,在加载模型时,我们需要使用 `tf.Session` 和 `tf.Graph` 来创建一个新的计算图,并使用 `tf.saved_model.loader.load` 方法从文件夹加载模型。在加载模型后,我们可以使用 `tf.get_default_graph` 方法获取默认的计算图,并使用 `graph.get_tensor_by_name` 方法获取输入输出张量的引用。 这就是 TensorFlow 保存和加载模型的基本方法。当我们需要在生产环境使用模型时,我们可以使用保存的模型轻松地加载和运行它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值