タイトルの通りです。
両方試しましたが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ページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
quickquip
2019/08/28 17:53
「適している」の定義が要りそうです。(同じように問題が解ける場合に「適している」をどういう意味で使うのですか?)
eggpol
2019/08/28 18:26
適しているの定義ですね。
同じように問題が解けるという考えが思いついていませんでした。
この場合だと、どちらが精度を上げられることに適しているのかということを知りたいです。
どのような場合に二乗誤差を用いることが推奨され
どのような場合にクロスエントロピーを用いるのが推奨されるのかということが最終的には知りたいです。
よろしくお願いします。