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

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

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

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

Python

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

解決済

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

eggpol
eggpol

総合スコア0

機械学習

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

Python

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

1回答

0評価

0クリップ

1514閲覧

投稿2019/08/28 07:27

編集2022/01/12 10:58

タイトルの通りです
両方試しましたが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'

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

quickquip
quickquip

2019/08/28 08:53

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

2019/08/28 09:26

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

機械学習

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

Python

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