AttributeError: ‘Model’ object has no attribute ‘_get_distribution_strategy'[Keras][Tensorboard]

7月 26, 2020

先に解決方法

importの仕方を見直す。

以降だらだらと経緯を書く

kerasでtensorboardを使おうとしたら、AttributeError: 'Model’ object has no attribute '_get_distribution_strategy’ のエラーがでた。
しかし、検索を重ねても解決方法がほとんどでてこない。
色々なサイトを見ると、importの仕方で挙動が変わるということが書いてあったので、試してみた。結果、ヒット。

エラーが出るimportの仕方

import os
import numpy as np
from datetime import datetime
import tensorflow as tf
from keras.layers import Input, Dense
from keras.models import Model

from keras.optimizers import SGD
from keras.callbacks import TensorBoard

num_features = 100
train_x = np.random.rand(40, num_features)
train_y = np.random.randint(2, size=40)

# The input layer
input_layer = Input(shape=(num_features,), name="Input")
output = Dense(10, activation='sigmoid', name="Hidden_1")(input_layer)
output = Dense(1, activation='sigmoid', name="Output")(output)
model = Model(inputs=input_layer, outputs=output)

sgd = SGD(lr=0.01, decay=1e-4, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy',
                     optimizer=sgd,
                      metrics=['accuracy'])

log_dir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = TensorBoard(log_dir)
my_callbacks = [tensorboard_callback]

model.fit(x=train_x, y=train_y,
                  validation_split=.2,
                  epochs=5,
                  callbacks=my_callbacks)
                  

正常に動作するimportの仕方

import os
import numpy as np
from datetime import datetime
# import tensorflow as tf
# from keras.layers import Input, Dense
# from keras.models import Model

# from keras.optimizers import SGD
# from keras.callbacks import TensorBoard

import tensorflow

num_features = 100
train_x = np.random.rand(40, num_features)
train_y = np.random.randint(2, size=40)

# The input layer
input_layer = tensorflow.keras.layers.Input(shape=(num_features,), name="Input")
output = tensorflow.keras.layers.Dense(10, activation='sigmoid', name="Hidden_1")(input_layer)
output = tensorflow.keras.layers.Dense(1, activation='sigmoid', name="Output")(output)
model = tensorflow.keras.models.Model(inputs=input_layer, outputs=output)

sgd = tensorflow.optimizers.SGD(lr=0.01, decay=1e-4, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy',
                     optimizer=sgd,
                      metrics=['accuracy'])

log_dir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tensorflow.keras.callbacks.TensorBoard(log_dir)
my_callbacks = [tensorboard_callback]

model.fit(x=train_x, y=train_y,
                  validation_split=.2,
                  epochs=5,
                  callbacks=my_callbacks)
                  

結局、kerasからではなく、tensorflowからimportするとうまくいったという話。

Uncategorized

Posted by vastee