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