python - 在 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 代码创建它时,我收到错误
进料口外的占位符
但是如果没有顺序代码中的占位符,我也无法运行它,或者有没有办法做到这一点?
解决方案
为什么需要用占位符实例化 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)
...
推荐阅读
- java - 使用 JUnit5 的集成测试用例不适用于获取 URL 中带有花括号的请求
- rust - 为什么 RefCell 的 `into_inner` 需要移动?
- javascript - 如何限制复选框
- android - 如何从房间数据库中获取多个计数?
- java - 使用java从Oauth2 rest api获取访问令牌
- c++ - collect2:错误:ld 返回 1 退出状态未定义的引用
- c++ - c++程序如何返回我的数组或写入全局变量
- angular - 当我使用搜索过滤我的列表时,它给了我过滤值。当我的搜索栏为空时,它不会在 ionic 中将我的原始列表返回给我
- spring-boot - rabbitMQ 创建两个独立的消费者,他们从同一服务中的两个不同集群消费
- javascript - 用百吉反应传单标记导致循环