繁体   English   中英

何时何地确定和存储 keras/tensorflow 层的“形状”和权重?

[英]When and where are the "shape" and weights of a keras / tensorflow layer determined and stored?

两个具体问题:

为什么 keras Dense层不知道它的input_shapeoutput_shape ,即使在模型运行之后?

为什么该层在输入一些训练数据之前不知道它的参数计数?

我训练了一个简单的 keras / tensorflow 模型,但是当我尝试查看模型的层时,我得到了如下错误:

“AttributeError:该层从未被调用过,因此没有定义的输入形状。”

或者,我的问题的简短版本:这里发生了什么?

我确信在某种技术意义上“该层从未被调用过”并且“没有定义的输入形状”,但是,由于该层已经过训练(并用于评估),它“从未被调用过”是什么意思?被称为”?

(我真正需要的是关于 keras 架构的概述——我还没有找到——以及对引擎盖下发生的事情的易于理解的介绍。你好 keras 大师!)

具体来说,我运行 tensorflow 教程中的第一个模型:

https://www.tensorflow.org/tutorials/

这是我运行的教程示例代码:

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

在运行(即,构建、编译、拟合和评估)模型之后,我调用,例如:

model.layers[1].input_shape

并得到:

文件 "\\python\\keras\\engine\\base_layer.py", line 1338, in input_shape raise AttributeError('The layer never be called ' AttributeError: The layer has never been called and 因此没有定义的输入形状。

与此相关的是,如果在运行model.fit()之前,但在运行model.compile() ,我调用:

model.layers[1].count_params()

我得到:

ValueError:您尝试在count_params上调用count_params ,但未构建该层。 您可以通过以下dense_3.build(batch_input_shape)手动构建: dense_3.build(batch_input_shape)

如果我在调用count_params()之后调用model.fit()我会得到 401920。(感谢您抽出时间回答我的问题。)(这个值等于 785 x 512 -- 我本来期望是 784 x 512,但我假设这足够接近......)

我可能天真地认为“编译”模型会设置包含要优化的模型参数的各种数据结构,但是,当您第一次通过模型抽取一轮训练数据时,这看起来像是即时发生的。

好的,那么, model.compile()做了什么?

(这是在 Windows 上使用 tensorflow 1.12.0 和 python 3.7.2。)

在 TensorFlow 中,张量有两种不同类型的形状:动态形状静态形状 考虑名为my_tensor的张量的静态和动态形状。

静态形状仅当您在创建张量时定义它时才可用,如果它可以从具有定义形状的图中的其他张量推断出来。 如果已定义,则可以随时使用my_tensor.get_shape()找到它。

动态形状仅在运行时可用,并且必须与静态形状相称。 在运行时,可以将一个节点添加到图中,使用tf.shape返回一个包含动态形状的张量,即编写my_shape=tf.shape(my_tensor)并在会话中运行my_shape节点。

我看到我链接和引用的教程代码已修改为在Flatten层中包含input_shape 现在是这样写的:

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
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(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

(链接仍然是https://www.tensorflow.org/tutorials

此代码更新部分回答了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM