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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2732閲覧

MNISTでの損失関数は二乗誤差かクロスエントロピーかどちらが適しているのか?

eggpol

総合スコア60

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/28 07:27

編集2019/08/29 10:11

タイトルの通りです。
両方試しましたがAccuracyはそれほど変わりませんでした。
使用コードは↓です。実行すれば確認できます。
二乗誤差とクロスエントロピーどちらがが適しているか数学的に説明してもらえると助かります。

import numpy as np # keras.utilsからnp_utilsをインポート from keras.utils import np_utils # MNISTデータセットをインポート from keras.datasets import mnist # MNISTデータセットの読み込み (x_train, y_train), (x_test, y_test) = mnist.load_data() # 訓練データ # 60000x28x28の3次元配列を60000×784の2次元配列に変換 x_train = x_train.reshape(60000, 784) # 訓練データをfloat32(浮動小数点数)型に変換 x_train = x_train.astype('float32') # データを255で割って0から1.0の範囲に変換 x_train = x_train / 255 # 正解ラベルの数 correct = 10 # 正解ラベルを1-of-K符号化法で変換 y_train = np_utils.to_categorical(y_train, correct) # テストデータ # 10000x28x28の3次元配列を10000×784の2次元配列に変換 x_test = x_test.reshape(10000, 784) # テストデータをfloat32(浮動小数点数)型に変換 x_test = x_test.astype('float32') # データを255で割って0から1.0の範囲に変換 x_test = x_test / 255 # 正解ラベルを1-of-K符号化法で変換 y_test = np_utils.to_categorical(y_test, correct) # ニューラルネットワークの構築 # keras.modelsからSequentialをインポート from keras.models import Sequential # keras.layersからDense、Activationをインポート from keras.layers import Dense, Activation # keras.optimizersからAdamをインポート from keras.optimizers import Adam model = Sequential() # Sequentialオブジェクトの生成 model.add(Dense(200, # 隠れ層のニューロン数は200 input_dim=784, # 入力層のニューロン数は784 activation='relu' # 活性化関数はReLU )) model.add(Dense(10, # 出力層のニューロン数は10 activation='sigmoid' # 活性化関数はsigmoid )) model.compile( # オブジェクトのコンパイル loss='categorical_crossentropy', # 損失の基準は交差エントロピー誤差 \\\\\\ optimizer=Adam(), # 学習方法をAdamにする metrics=['accuracy'] # 学習評価として正解率を指定 ) model.summary() # ニューラルネットワークのサマリー(概要)を出力 # 学習を行って結果を出力 import time startTime = time.time() history = model.fit(x_train, # 訓練データ y_train, # 正解ラベル epochs=5, # 学習を繰り返す回数 batch_size=100, # 勾配計算に用いるサンプル数 verbose=1, # 学習の進捗状況を出力する validation_data=( x_test, y_test # テストデータの指定 )) # テストデータで学習を評価するデータを取得 score = model.evaluate(x_test, y_test, verbose=0) # テストデータの誤り率を出力 print('Test loss:', score[0]) # テストデータの正解率を出力 print('Test accuracy:', score[1]) # 処理にかかった時間を出力 print("Time:{0:.3f} sec".format(time.time() - startTime)) # 損失(誤り率)、正解率をグラフにする import numpy as np import matplotlib.pyplot as plt # 訓練データの損失(誤り率)をプロット plt.plot(history.history['loss'], label='training', color='black') # テストデータの損失(誤り率)をプロット plt.plot(history.history['val_loss'], label='test', color='red') plt.ylim(0, 1) # y軸の範囲 plt.legend() # 凡例を表示 plt.grid() # グリッド表示 plt.xlabel('epoch') # x軸ラベル plt.ylabel('loss') # y軸ラベル plt.show() # 訓練データの正解率をプロット plt.plot(history.history['acc'], label='training', color='black') # テストデータの正解率をプロット plt.plot(history.history['val_acc'], label='test', color='red') plt.ylim(0.5, 1) # y軸の範囲 plt.legend() # 凡例を表示 plt.grid() # グリッド表示 plt.xlabel('epoch') # x軸ラベル plt.ylabel('acc') # y軸ラベル plt.show()
loss='categorical_crossentropy' loss='mean_squared_error'

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/08/28 08:53

「適している」の定義が要りそうです。(同じように問題が解ける場合に「適している」をどういう意味で使うのですか?)
eggpol

2019/08/28 09:26

適しているの定義ですね。 同じように問題が解けるという考えが思いついていませんでした。 この場合だと、どちらが精度を上げられることに適しているのかということを知りたいです。 どのような場合に二乗誤差を用いることが推奨され どのような場合にクロスエントロピーを用いるのが推奨されるのかということが最終的には知りたいです。 よろしくお願いします。
guest

回答1

0

ベストアンサー

比較の対象は確率分布です。
したがってクロスエントロピーが適しています。

投稿2019/08/29 13:03

WathMorks

総合スコア1582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eggpol

2019/09/17 12:58

ありがとうございます 後で自分で調べたのですが 分類だとクロスエントロピー 回帰だと二乗誤差を使うことが定石らしいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問