Ошибка атрибута: объект ‘AxesSubplot’ не имеет атрибута ‘rowNum’

#python #matplotlib

Вопрос:

Мой фрагмент кода, который уже работал без каких-либо проблем, теперь вызывает

 Traceback (most recent call last):
  File "~/PycharmProjects/RL/DNN_NSL_CalifHou.py", line 131, in <module>
    df1.plot(ax=axes[0,0])
  File "~AppDataLocalProgramsPythonPython37libsite-packagespandasplotting_core.py", line 794, in __call__
    return plot_backend.plot(data, kind=kind, **kwargs)
  File "~AppDataLocalProgramsPythonPython37libsite-packagespandasplotting_matplotlib__init__.py", line 62, in plot
    plot_obj.generate()
  File "~AppDataLocalProgramsPythonPython37libsite-packagespandasplotting_matplotlibcore.py", line 284, in generate
    self._adorn_subplots()
  File "~AppDataLocalProgramsPythonPython37libsite-packagespandasplotting_matplotlibcore.py", line 472, in _adorn_subplots
    sharey=self.sharey,
  File "~AppDataLocalProgramsPythonPython37libsite-packagespandasplotting_matplotlibtools.py", line 307, in _handle_shared_axes
    layout[ax.rowNum, ax.colNum] = ax.get_visible()
AttributeError: 'AxesSubplot' object has no attribute 'rowNum' 
 

что соответствует

 fig, axes = plt.subplots(nrows=2, ncols=2)
df1 = pd.DataFrame(history.history)
df1.plot(ax=axes[0,0])
axes[0,0].set_title('model')
 

Что-нибудь сломано в matplotlib?

Вот выполнимый фрагмент:

 import pandas as pd
import matplotlib.pyplot as plt
import os
import time

import tensorflow as tf

from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split


root_logdir = os.path.join(os.curdir, "my_California_housing_logs")

def get_run_logdir():
    run_id = time.strftime("run_%Y_%m_%d-%H_%M_%S")
    return os.path.join(root_logdir, run_id)

run_logdir = get_run_logdir()

#############################################################

housing = fetch_california_housing()

X_train_full, X_test, y_train_full, y_test = train_test_split(
    housing.data, housing.target)

X_train, X_valid, y_train, y_valid = train_test_split(
    X_train_full, y_train_full)

scaler = StandardScaler()

X_train = scaler.fit_transform(X_train)
X_valid = scaler.fit_transform(X_valid)
X_test = scaler.fit_transform(X_test)

model = tf.keras.models.Sequential([
    tf.keras.layers.InputLayer(input_shape=X_train.shape[1:]),
    tf.keras.layers.BatchNormalization(momentum=0.999),
    tf.keras.layers.Dense(48, tf.keras.activations.selu, kernel_initializer="lecun_normal"),
    tf.keras.layers.BatchNormalization(momentum=0.999),
    tf.keras.layers.Dense(48, tf.keras.activations.selu, kernel_initializer="lecun_normal"),
    tf.keras.layers.BatchNormalization(momentum=0.999),
    tf.keras.layers.Dense(1, kernel_initializer="lecun_normal")
])

model.compile(loss=tf.keras.losses.mean_squared_error,
              optimizer=tf.keras.optimizers.Adam(learning_rate = 0.0003, beta_1=0.9, beta_2=0.999),
              metrics=[tf.keras.metrics.MeanAbsoluteError()])

def exponential_decay(lr0, s):
    def exponential_decay_fn(epoch):
        return lr0 * 0.1 ** (epoch / s)
    return exponential_decay_fn

exponential_decay_fn = exponential_decay(lr0=0.01, s=20)

lr_scheduler_cb = tf.keras.callbacks.LearningRateScheduler(exponential_decay_fn)

checkpoints_cb = tf.keras.callbacks.ModelCheckpoint("my_keras_model.h5",
                                                    save_best_only=True)
early_stopping_cb = tf.keras.callbacks.EarlyStopping(patience=10,
                                                    restore_best_weights=True)

tensorboard_cb = tf.keras.callbacks.TensorBoard(run_logdir)

history = model.fit(X_train, y_train, epochs=1,
                    validation_data=(X_valid, y_valid),
                    callbacks=[checkpoints_cb, early_stopping_cb, tensorboard_cb, lr_scheduler_cb])

fig, axes = plt.subplots(nrows=2, ncols=2)
df1 = pd.DataFrame(history.history)
df1.plot(ax=axes[0,0])
axes[0,0].set_title('model')

plt.show()
 

Редактировать:

Вот также то, что я получаю из буфера обмена:

 loss  mean_absolute_error  val_loss  val_mean_absolute_error    lr
0  0.673669             0.596114  2.244989                 1.277523  0.01
 

добавление df1.head().to_clipboard(sep='\s ', index=True) .

Комментарии:

1. Вероятно , вам следует просто включить df1.head().to_clipboard(sep='\s ', index=True) , так как, чтобы добраться до history любого, кто хочет помочь, необходимо keras / tensorflow установлено.

2. @TrentonMcKinney: Пожалуйста, проверьте примененное редактирование.

3. .head() должно быть 5 рядов. Если вы сделали .head() это и получили только 1 строку, то, вероятно, это проблема. Однако даже с 1 строкой данных я могу запустить создание графика без проблем. Какая версия pandas и matplotlib установлены?

4. Похоже, вы не используете среду Anaconda, поэтому я бы обновил pandas pip update pandas ее . Текущая версия 1.3.2

5. @TrentonMcKinney: Большое спасибо, что указали на это! Ошибка исчезла при использовании последней версии pandas .