deep-learning-from-scratch-2 icon indicating copy to clipboard operation
deep-learning-from-scratch-2 copied to clipboard

common/layersのSoftmaxWithLossの動作について

Open tetsuomiyoshi opened this issue 2 years ago • 0 comments

common/layersのSoftmaxWithLossの動作についてですが、現状のものでは、

forward(x, t)の引数のx, tが例えば、 x = np.array([[1.0, 1.5, 2.0], [1.2, 1.5, 1.7]]) t = np.array([[0, 0, 1], [0, 1, 0]]) または、 x = np.array([[1.0, 1.5, 2.0], [1.2, 1.5, 1.7]]) t = np.array([2, 1]) などのバッチ形式の時は問題ないのですが、

x = np.array([1.0, 1.5, 2.0]) t = np.array([0, 0, 1]) または、 x = np.array([1.0, 1.5, 2.0]) t = np.array(2) などのベクトル形式の場合、エラーになってしまいます。

一応、クラスSoftmaxWithLossを下記のように変更し、

66 class SoftmaxWithLoss: 67 def init(self): 68 self.params, self.grads = [], [] 69 self.y = None # softmaxの出力 70 self.t = None # 教師ラベル 71 72 def forward(self, x, t): 73 self.t = t 74 self.y = softmax(x) 75 76 # 教師ラベルがone-hotベクトルの場合、正解のインデックスに変換 77 if self.y.ndim == 1: # add 78 self.t = self.t.reshape(1, self.t.size) # add 79 self.y = self.y.reshape(1, self.y.size) # add 80 81 if self.t.size == self.y.size: 82 self.t = self.t.argmax(axis=1) 83 84 loss = cross_entropy_error(self.y, self.t) 85 return loss 86 87 def backward(self, dout=1): 88 #batch_size = self.t.shape[0 # delete] 89 batch_size = self.y.shape[0] # modify 90 #print('here1') 91 #print(batch_size) 92 dx = self.y.copy() 93 dx[np.arange(batch_size), self.t] -= 1 94 dx *= dout 95 dx = dx / batch_size 96 97 return dx 98

common.functionsの関数cross_entropy_error()を下記の様に変更すると、

25 def cross_entropy_error(y, t): 26 #print('here2') 27 #if y.ndim == 1: # delete 28 # t = t.reshape(1, t.size) # delete 29 # y = y.reshape(1, y.size) # delete 30 31 # 教師データがone-hot-vectorの場合、正解ラベルのインデックスに変換 32 #if t.size == y.size: # delet 33 # t = t.argmax(axis=1) # delet 34 35 batch_size = y.shape[0] 36 37 return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size 38

ベクトル形式でも問題なく動作してくれる様なのですが、現状のものは引数のxとtに関して これ以外の入力形式を想定して書かれているのでしょうか?その場合、どういった入力形式を 想定しているのか教えて下さい。

tetsuomiyoshi avatar Oct 03 '23 03:10 tetsuomiyoshi