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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

解決済

tf.keras.denseで、loss計算や評価計算がnanになってしまうため、学習させるコードを確認したい

Por
Por

総合スコア40

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

1回答

0評価

0クリップ

3755閲覧

投稿2021/02/05 04:56

編集2021/02/05 13:06

前提・実現したいこと

①時系列データから②いくつかのトレーニング期間とラベル期間を指定して学習③アンサンブルする
このようなモデルを作成したく、コードを書いています。

参考はこちらを参照させていただいています。
https://www.tensorflow.org/tutorials/structured_data/time_series

loss計算や評価計算がnanになってしまうため、学習させるコードを確認したく
質問させていただきました。

tensorflow version : 2.4.1
keras version : 2.4.3

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

参考先で与えられているデータ

zip_path = tf.keras.utils.get_file( origin='https://storage.googleapis.com/tensorflow/tf-keras- # 文字数の関係で一部省略

では発生しなかったのですが

私が取得したデータ

import pandas_datareader.data as pdr df = pdr.DataReader('aapl', 'yahoo', '2018/01/01') # 一部省略

では

モデル内で採用する損失関数や評価指標
tensorflow.keras.Sequential.Dense(losses=MeanSquaredError(),metrics=MeanAbsoluteError())
が欠損値nanになってしまいます。

該当のソースコード

Python

# -*- 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) / train_std val_df = (val_df - train_mean) / train_std test_df = (test_df - train_mean) / train_std df_std = (df - train_mean) / train_std 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) # nan event '''====== Epoch 1/20 17/17 [==============================] - 1s 34ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan Epoch 2/20 17/17 [==============================] - 0s 12ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan [ ] ======='''

試したこと

これらを修正するために
こちら https://teratail.com/questions/299561
こちら https://teratail.com/questions/295771 を参考にさせていただき
前処理方法から着手してみましたが
変化がなく困っております。

私が取得したデータについて、なぜ欠損値になってしまうのでしょうか。
学習できるようにするにはどの視点からコードを修正したらよいでしょうか。

教えていただけると幸いです。

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

Google Colab
chrome webbrowser

<参考>
1.[TensorFlow時系列分析]
https://www.tensorflow.org/tutorials/structured_data/time_series
2.[tensorflow.keras _ 損失関数や評価指標メトリックについて]
https://keras.io/api/metrics/

<ゴール>
最終的にはこちら https://teratail.com/questions/299561 のようなアンサンブルにできる
モデル生成器をを完成させたいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

toast-uz
toast-uz

2021/02/05 10:44 編集

実行してみましたが、特にエラーが出ませんでした。以下実行結果です。tensorflow 2.4.1 date_time 0 2018-01-02 1 2018-01-03 2 2018-01-04 3 2018-01-05 4 2018-01-08 ... 774 2021-01-29 775 2021-02-01 776 2021-02-02 777 2021-02-03 778 2021-02-04 Name: Date Time, Length: 779, dtype: datetime64[ns] timestamp_s 0 1.514819e+09 1 1.514905e+09 2 1.514992e+09 3 1.515078e+09 4 1.515337e+09 ... 774 1.611846e+09 775 1.612105e+09 776 1.612192e+09 777 1.612278e+09 778 1.612364e+09 Name: Date Time, Length: 779, dtype: float64 2021-02-05 19:40:33.325196: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set 2021-02-05 19:40:33.325562: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. All shapes: (batch, time, features) Window shape: (3, 7, 10) Inputs shape: (3, 6, 10) Labels shape: (3, 1, 1) 2021-02-05 19:40:33.449907: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2) Inputs shape (batch, time, features): (32, 6, 10) Labels shape (batch, time, features): (32, 1, 1) Epoch 1/20 17/17 [==============================] - 1s 33ms/step - loss: 1.0240 - mean_absolute_error: 0.6482 - val_loss: 1.3410 - val_mean_absolute_error: 1.0566 Epoch 2/20 17/17 [==============================] - 0s 6ms/step - loss: 0.1235 - mean_absolute_error: 0.2698 - val_loss: 2.0220 - val_mean_absolute_error: 1.2964 Epoch 3/20 17/17 [==============================] - 0s 5ms/step - loss: 0.0547 - mean_absolute_error: 0.1808 - val_loss: 1.8565 - val_mean_absolute_error: 1.2506
Por
Por

2021/02/05 11:55

ありがとうございます。 datetimeやdfのLength:779、shapeを拝見させていただく限り、間違いなくinputしたいデータで試していただいており、 また関数の計算もされているようです。 確認と教えていただき、ありがとうございます。 私のほうで 1. tensorflowのバージョン確認を改めて 2. 確認させていただきます。 また差し支えなければ、ご質問させてください。
Por
Por

2021/02/05 13:12 編集

toast_uz様 教えていただきありがとうございました。 tfのバージョン、toast_uz様と同じでした。 また(念の為)Colabのノートブックに影響を受けているのか、とも思い 一つのセルで実行しましたが、おそらくまた欠損になり学習されていないようです。 ===== All shapes: (batch, time, features) Window shape: (3, 7, 10) Inputs shape: (3, 6, 10) Labels shape: (3, 1, 1) Inputs shape (batch, time, features): (32, 6, 10) Labels shape (batch, time, features): (32, 1, 1) Epoch 1/20 17/17 [==============================] - 1s 20ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan Epoch 2/20 17/17 [==============================] - 0s 12ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan ======\nEpoch 1/20\n17/17 [==============================] - 1s 34ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan\nEpoch 2/20\n17/17 [==============================] - 0s 12ms/step - loss: nan - mean_absolute_error: nan - val_loss: nan - val_mean_absolute_error: nan\n[ ]\n======= ===== またお時間ありましたら、ご教授いただけますと幸いです。
toast-uz
toast-uz

2021/02/05 13:44

私の方は、colabではなく、ローカルのPython3.8で実行しています。
toast-uz
toast-uz

2021/02/05 14:00 編集

確かにcolabだとnan - val_mean_absolute_errorとかとか出ますね。何でしょう・・。
Por
Por

2021/02/05 22:07 編集

試験いただきまして、感謝申し上げます。 わかりました。ColabのPythonは3.6.9だったはずですので 私の方で次に ・3.8のColab ・3.8のローカル を確認します。 一旦3.8で動くか確認してみます。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。