为什么Keras API在第一层需要输入形状,因为没有它实际上可以很好地工作?

时间:2018-07-16 06:25:27

标签: tensorflow keras

我正在使用TensorFlow 1.9.0中的tf.keras。似乎在构建input_shape模型时无需在第一层中指定Sequential的情况下一切正常:

import tensorflow as tf
from tensorflow import keras
import numpy as np

X_train = np.random.randn(1000, 10)
y_train = np.random.randn(1000)

model = keras.models.Sequential([
    keras.layers.Dense(32, activation="relu"),
    keras.layers.Dense(1),
])
optimizer = tf.train.MomentumOptimizer(0.01, 0.9)
model.compile(loss="mse", optimizer=optimizer)
model.fit(X_train, y_train, epochs=10)

这对我来说很有意义,因为Keras可以轻松地从输入(X_train)中获得输入形状。我还尝试使用PyPI Keras,它也可以正常工作(使用TensorFlow 1.9.0后端)。

所以我有两个问题:

  1. 为什么官方Keras API require会在第一层中指定输入形状?是不是因为TensorFlow以外的后端有必要?
  2. 即使Keras API并未正式支持此行为,tf.keras是否已正式支持该行为?换句话说,如果我不关心其他后端,这样做是否合法(不指定输入形状),或者在将来的版本中会损坏?

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为指南中的单词选择(强调我的意思)

  

模型需要知道它应该期望的输入形状。

可能有点不幸,作为指南,不应被视为规范。

Keras可以接受input_shape部分(None, n)或完全(None, None)未知的input_shape。实际上,需要后者来创建可随输入大小扩展的FCN网络。

因此,您知道您不知道输入形状,因此建议您明确提供这样的部分/完全未定义的<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="#000" android:gravity="center" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:scaleType="fitXY" android:layout_marginTop="5dp" android:layout_marginBottom="60dp" android:src="@drawable/lwt_placeholder" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:visibility="visible" android:id="@+id/imageView" android:layout_centerInParent="true"/></RelativeLayout> 。它使自文档代码声称输入形状是未知的,而不是对该参数是否丢失提出了一些疑问。