質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

解決済

Python,class,インスタンスからメンバー追加したが、AttribureErrorが発生する

Por
Por

総合スコア40

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

2回答

0リアクション

0クリップ

855閲覧

投稿2021/02/06 05:30

前提・実現したいこと

よろしくお願いいたします。

インスタンスへのメンバー追加とクラスへのメンバー追加の違い
メンバー追加の正しい方法
を確認したいと思っております。
ご教授いただけますと幸いです。

発生している問題・エラーメッセージ

AttributeError: 'WindowGenerator' object has no attribute 'example'

該当のソースコード

Python3.6.9

# -*- coding: utf-8 -*- import os import datetime import IPython import IPython.display import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import tensorflow as tf mpl.rcParams['figure.figsize'] = (12,9) mpl.rcParams['axes.grid'] = False import requests from PIL import Image from io import BytesIO def image(url): req = requests.get(url) return Image.open(BytesIO(req.content)) import pandas_datareader.data as pdr df = pdr.DataReader('aapl', 'yahoo', '2018/01/01') df['Date Time'] = df.index df.reset_index(inplace=True) date_time = pd.to_datetime(df.pop('Date Time'), format='%d.%m.%Y %H:%M:%S') df.drop(columns='Date', inplace=True) # converting it to seconds: timestamp_s = date_time.map(datetime.datetime.timestamp) # del print day = 24*60*60 year = (365.2425)*day df['Day sin'] = np.sin(timestamp_s * (2*np.pi/day)) df['Day cos'] = np.cos(timestamp_s * (2*np.pi/day)) df['Year sin'] = np.sin(timestamp_s * (2*np.pi/year)) df['Year cos'] = np.cos(timestamp_s * (2*np.pi/year)) # plt.plot(np.array(df['Day sin'])) # # plt.plot(np.array(df['Day cos'])) # plt.xlabel('Time [h]') # plt.title('Time of day signal') """## Split data""" column_indices = {name:i for i, name in enumerate(df.columns)} n = len(df) train_df = df[0:int(n*0.7)] val_df = df[int(n*0.7):int(n*0.9)] test_df = df[int(n*0.9):] num_features = df.shape[1] train_mean = train_df.mean() train_std = train_df.std() train_df = (train_df - train_mean) / np.maximum(train_std, 1e-12) val_df = (val_df - train_mean) / np.maximum(train_std, 1e-12) test_df = (test_df - train_mean) / np.maximum(train_std, 1e-12) df_std = (df - train_mean) / np.maximum(train_std, 1e-12) df_std = df_std.melt(var_name='Column', value_name='Normalized') """# Data windowing""" class WindowGenerator(): def __init__(self, input_width, label_width, shift, train_df=train_df, val_df=val_df, test_df=test_df, label_columns=None): self.train_df = train_df self.val_df = val_df self.test_df =test_df # for column indices of 'Label' self.label_columns = label_columns if label_columns is not None: self.label_columns_indices = {name:i for i,name in enumerate(label_columns)} self.column_indices = {name:i for i,name in enumerate(label_columns)} # for window params self.input_width = input_width self.label_width = label_width self.shift = shift self.total_window_size = input_width + shift self.input_slice = slice(0, input_width) self.input_indices = np.arange(self.total_window_size)[self.input_slice] self.label_start = self.total_window_size - self.label_width self.label_slice = slice(self.label_start, None) self.label_indices = np.arange(self.total_window_size)[self.label_slice] def __repr__(self): return '\n'.join([ f'Total window size: {self.total_window_size}', f'Input indices: {self.input_indices}', f'Label indices: {self.label_indices}', f'Label column name(s): {self.label_columns}' ]) # 2 samples w1 = WindowGenerator(input_width=24, label_width=1, shift=1, label_columns=['Adj Close']) w1 w2 = WindowGenerator(input_width=6, label_width=1, shift=1, label_columns=['Adj Close']) w2 def split_window(self, features): inputs = features[:, self.input_slice, :] labels = features[:, self.label_slice, :] if self.label_columns is not None: labels = tf.stack( [labels[:, :, self.column_indices[name]] for name in self.label_columns], axis=-1) inputs.set_shape([None, self.input_width, None]) labels.set_shape([None, self.label_width, None]) return inputs, labels WindowGenerator.split_window = split_window # stack 3 slices,, exam_window = tf.stack([ np.array(train_df[:w2.total_window_size]), np.array(train_df[100:100+w2.total_window_size]), np.array(train_df[200:200+w2.total_window_size]) ]) exam_inputs, exam_labels = w2.split_window(exam_window) print('All shapes: (batch, time, features)') print(f'Window shape: {exam_window.shape}') print(f'Inputs shape: {exam_inputs.shape}') print(f'Labels shape: {exam_labels.shape}') w2.example = exam_inputs, exam_labels def plot(self, model=None, plot_col='Adj Close', max_subplot=3): inputs, labels = self.example plt.figure(figsize=(12,8)) plot_col_index = self.column_indices[plot_col] max_n = min(max_subplot, len(inputs)) for n in range(max_n): plt.subplot(3, 1, n+1) plt.ylabel(f'{plot_col} [normed]') plt.plot(self.input_indices, inputs[n, :, plot_col_index], label='Inputs', marker='.', zorder=-10) if self.label_columns: label_col_index = self.label_columns_indices.get(plot_col, None) else: label_col_index = plot_col_index if label_col_index is None: continue plt.scatter(self.label_indices, labels[n, :, label_col_index], edgecolors='k', label='Labels', c='#2ca02c', s=64) if model is not None: predictions = model(inputs) plt.scatter(self.label_indices, predictions[n, :, label_col_index], marker='X', edgecolors='k', label='Predictions', c='#ff7f0e', s=64) if n==0: plt.legend() plt.xlabel('Time [h]') WindowGenerator.plot = plot def make_dataset(self, data): data = np.array(data, dtype=np.float32) ds = tf.keras.preprocessing.timeseries_dataset_from_array( data=data, targets=None, sequence_length=self.total_window_size, sequence_stride=1, shuffle=True, batch_size=32, ) ds = ds.map(self.split_window) return ds WindowGenerator.make_dataset = make_dataset @property def train(self): return self.make_dataset(self.train_df) @property def val(self): return self.make_dataset(self.val_df) @property def test(self): return self.make_dataset(self.test_df) WindowGenerator.train = train WindowGenerator.val = val WindowGenerator.test = test for exam_inputs, exam_labels in w2.train.take(1): print(f'Inputs shape (batch, time, features): {exam_inputs.shape}') print(f'Labels shape (batch, time, features): {exam_labels.shape}') # by Dense MAX_EPOCHS = 20 def compile_and_fit(model, window, patience=2): early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=patience, mode='min') model.compile(loss=tf.losses.MeanSquaredError(), optimizer=tf.optimizers.Adam(), metrics=[tf.metrics.MeanAbsoluteError()]) history = model.fit(window.train, epochs=MAX_EPOCHS, validation_data=window.val, callbacks=[early_stopping]) return history dense = tf.keras.Sequential([ tf.keras.layers.Dense(units=64, activation='relu'), tf.keras.layers.Dense(units=64, activation='relu'), tf.keras.layers.Dense(units=1) ]) CONV_WIDTH = 20 conv_window = WindowGenerator( input_width=CONV_WIDTH, label_width=1, shift=1, label_columns=['Adj Close'] ) multi_step_dense = tf.keras.Sequential([ # Shape: (time, features) => (time*features) tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=32, activation='relu'), tf.keras.layers.Dense(units=32, activation='relu'), tf.keras.layers.Dense(units=1), # Add back the time dimension. # Shape: (outputs) => (1, outputs) tf.keras.layers.Reshape([1, -1]), ]) history = compile_and_fit(multi_step_dense, conv_window) conv_window.plot() # AttributeError: 'WindowGenerator' object has no attribute 'example'

試したこと

インスタンスから組み込み関数dirで、メンバーを抽出できることを調べ
上記'example'がメンバーとして表示されていることを確認しました。

WindowGeneratorクラスからw2インスタンスを作成
w2.exampleと記述し、WindowGeneratorクラスへメンバーが追加できる
と認識しておりますが、、
どこか間違っているのでしょうか。

こちらのコードを参考
https://www.tensorflow.org/tutorials/structured_data/time_series
にさせていただき、何度か確認いたしましたが
こちらは
WindowGeneratorクラスへではなく、インスタンスへexampleメンバーを追加することで
その後のplot()メソッドも実行できておりました。

その違いがわからずとなっており
ご教授いただけますと幸いです。

補足情報(FW/ツールのバージョンなど)

python3.6.9
Google Colab

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。