首页 > 解决方案 > 在 TPU 上运行 Keras 函数式 API

问题描述

我想将 create_model 函数重写Keras 功能 API。在 TPU 上运行它,但是当我翻译它时,它给了我一个关于在 create_method 函数中使用占位符的错误。在原始示例中,作者没有将显式占位符放入 create_method 函数中。我正在使用 Keras 输入函数,因为我需要实例化一个 Keras 张量才能开始,显然这是一个占位符。有没有办法摆脱我的 create_method 函数中的占位符?

这是我的代码片段:

def create_model(data_format):

  if data_format == 'channels_first':
    input_shape = [1, 28, 28]
  else:
    assert data_format == 'channels_last'
    input_shape = [28, 28, 1]

  l = tf.keras.layers
  m = tf.keras.models
  b = tf.keras.backend
  v = tf.contrib.layers

  # The model consists of a sequential chain of layers, so tf.keras.Sequential
  # (a subclass of tf.keras.Model) makes for a compact description.

  input = l.Input(shape=(28, 28, 1))

  visible = l.Reshape(target_shape=input_shape, input_shape=(28*28,))(input)

当我从提供的 MNIST TPU 代码创建它时,我收到错误

进料口外的占位符

但是如果没有顺序代码中的占位符,我也无法运行它,或者有没有办法做到这一点?

标签: pythontensorflowkerasdeep-learninggoogle-cloud-tpu

解决方案


为什么需要用占位符实例化 Keras 张量?如果您只需要在 Keras 中使用的模型,您可以使用以下代码片段:

NUM_CLASSES = 10

def mnist_model(input_shape):
  """Creates a MNIST model."""
  model = tf.keras.models.Sequential()
  model.add(
      tf.keras.layers.Conv2D(
          32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
  model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
  model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
  model.add(tf.keras.layers.Dropout(0.25))
  model.add(tf.keras.layers.Flatten())
  model.add(tf.keras.layers.Dense(128, activation='relu'))
  model.add(tf.keras.layers.Dropout(0.5))
  model.add(tf.keras.layers.Dense(NUM_CLASSES, activation='softmax'))
  return model


def main():
  ...
  input_shape = (28, 28, 1)
  model = mnist_model(input_shape)
  ...

推荐阅读