确定和存储角膜/张量流层的“形状”和重量的时间和位置是什么?

时间:2019-01-25 17:22:13

标签: python tensorflow keras

两个具体问题:

为什么即使在模型运行后,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”,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结合使用的方法。)

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

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