[英]When and where are the "shape" and weights of a keras / tensorflow layer determined and stored?
两个具体问题:
为什么 keras Dense
层不知道它的input_shape
和output_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.