两个具体问题:
为什么即使在模型运行后,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”,1338年,在input_shape中 引发AttributeError('该图层从未被称为' AttributeError:该图层从未调用过,因此没有定义的输入形状。
以类似的方式,如果在运行model.fit()
之前但在运行model.compile()
之后,我打电话:
model.layers[1].count_params()
我得到:
ValueError:您尝试在density_3上调用
count_params
,但未构建该层。您可以通过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结合使用的方法。)
答案 0 :(得分:1)
在TensorFlow中,张量具有two different types的形状:动态形状和静态形状。考虑名为my_tensor
的张量的静态和动态形状。
仅当您在创建张量时定义静态形状,该静态形状才可用,如果可以从图中具有定义形状的其他张量中推断出该张量。如果已定义,则可以随时使用my_tensor.get_shape()
来找到它。
动态形状仅在运行时可用,并且必须与静态形状相对应。在运行时,可以使用tf.shape
将一个节点添加到该图,以返回包含动态形状的张量,即在您的会话中编写my_shape=tf.shape(my_tensor)
并运行my_shape
节点。
答案 1 :(得分:0)
我看到我链接并引用的教程代码
已被修改为在{
input_shape
层。现在显示为:
Flatten
(链接仍为https://www.tensorflow.org/tutorials)
此代码更新部分回答了我的问题。