首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google :混合不同的tf.distribute.Strategy

Google :混合不同的tf.distribute.Strategy
EN

Stack Overflow用户
提问于 2019-11-29 10:04:13
回答 1查看 543关注 0票数 0

我使用Talos和Google TPU来运行Keras模型的超参数调优。请注意,我使用的是Tensorflow 2.0.0和Keras2.2.4-TF。

代码语言:javascript
复制
# pip install --upgrade tensorflow
# pip install --upgrade --force-reinstall tensorflow-gpu

import os
import tensorflow as tf
import talos as ta
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

tf.compat.v1.disable_eager_execution()

def iris_model(x_train, y_train, x_val, y_val, params):

    # Specify a distributed strategy to use TPU
    resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
    tf.config.experimental_connect_to_host(resolver.master())
    tf.tpu.experimental.initialize_tpu_system(resolver)
    strategy = tf.distribute.experimental.TPUStrategy(resolver)

    # Use the strategy to create and compile a Keras model
    with strategy.scope():
      model = Sequential()
      model.add(Dense(32, input_dim=4, activation=params['activation']))
      model.add(Dense(3, activation='softmax'))
      model.compile(optimizer=params['optimizer'], loss=params['losses'])

    # Convert the train set to a Dataset to use TPU
    dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    dataset = dataset.cache().shuffle(1000, reshuffle_each_iteration=True).repeat().batch(params['batch_size'], drop_remainder=True)

    # Fit the Keras model on the dataset
    out = model.fit(dataset, 
                    batch_size=params['batch_size'], 
                    epochs=params['epochs'],
                    validation_data=[x_val, y_val],
                    verbose=0,
                    steps_per_epoch=4)

    return out, model
代码语言:javascript
复制
x, y = ta.templates.datasets.iris()

# Create a hyperparameter distributions 
p = {'activation': ['relu', 'elu'],
       'optimizer': ['Nadam', 'Adam'],
       'losses': ['logcosh'],
       'batch_size': (20, 50, 5),
       'epochs': [10, 20]}

# Use Talos to scan the best hyperparameters of the Keras model
scan_object = ta.Scan(x, y, model=iris_model, params=p, fraction_limit=0.1, experiment_name='first_test')

在使用tf.data.Dataset,将火车集转换为数据集后,当使用out = model.fit对模型进行拟合时,会出现以下错误

代码语言:javascript
复制
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/distribute/distribute_lib.py in _wrong_strategy_scope(strategy, context)
    218     raise RuntimeError(
    219         "Mixing different tf.distribute.Strategy objects: %s is not %s" %
--> 220         (context.strategy, strategy))
    221 
    222 

RuntimeError: Mixing different tf.distribute.Strategy objects: <tensorflow.python.distribute.tpu_strategy.TPUStrategy object at 0x7f9886506c50> is not <tensorflow.python.distribute.tpu_strategy.TPUStrategy object at 0x7f988aa04080>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-09 17:51:48

TensorFlow 2.0.0发行版不支持TPU培训。不过,这在TensorFlow 2.2中不应该是一个问题。我对您的代码做了一些小的修正,并让它在Colab上运行:

  • 使用Talos 1.0 (pip install git+https://github.com/autonomio/talos@1.0)
  • tf.config.experimental_connect_to_host(resolver.master())替换为tf.config.experimental_connect_to_cluster(resolver)
  • 使用tf.data.Dataset进行验证数据。
代码语言:javascript
复制
%tensorflow_version 2.x
import os
import tensorflow as tf
import talos as ta
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

def iris_model(x_train, y_train, x_val, y_val, params):

    # Specify a distributed strategy to use TPU
    resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
    tf.config.experimental_connect_to_cluster(resolver)
    tf.tpu.experimental.initialize_tpu_system(resolver)
    strategy = tf.distribute.experimental.TPUStrategy(resolver)

    # Use the strategy to create and compile a Keras model
    with strategy.scope():
      model = Sequential()
      model.add(Dense(32, input_dim=4, activation=params['activation']))
      model.add(Dense(3, activation='softmax'))
      model.compile(optimizer=params['optimizer'], loss=params['losses'])

    # Convert the train set to a Dataset to use TPU
    dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    dataset = dataset.cache().shuffle(1000, reshuffle_each_iteration=True).repeat().batch(params['batch_size'], drop_remainder=True)
    val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val)).batch(params['batch_size'], drop_remainder=True)

    # Fit the Keras model on the dataset
    out = model.fit(dataset, 
                    batch_size=params['batch_size'], 
                    epochs=params['epochs'],
                    validation_data=val_dataset,
                    verbose=0,
                    steps_per_epoch=4)

    return out, model
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59102657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档