クラスを用いたNNのモデル作りに慣れおらず、
すっきりしたコーディングを身に付けるため、本を読みながら勉強しています。
ですが、詳解ディープラーニングP.171からのDNNのモデルをクラス化するところで躓いてしまいました。
少しコードは変えているのですが、本ではドロップアウトを用いているのをやめただけで、基本忠実に書きました。
大分省略しますが、最後のmodel.evaluate()のところで、
'function' object has no attribute 'eval'
というエラーが出てしまいます。
クラス内のevaluate関数の中で違う関数(accuracy)を呼び出し.evalで値を出すことにエラーが出ているようなのですが、どのようにすれば実現できますでしょうか??
python
1class MLP: 2 def __init__(self, input_n, output_n, hidden_n, func_n): 3 #... 4 def weight_variable(self, shape): 5 #... 6 def bias_variable(self, shape): 7 #... 8 def inference(self, x): 9 #... 10 def loss(self, y, t): 11 #... 12 def accuracy(self, y, t): 13 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1)) 14 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 15 return accuracy 16 def fit(): 17 #...モデル学習 18 def evaluate(self, X_test, Y_test): 19 return self.accuracy.eval(session=self._sess, feed_dict={ 20 self._x : X_test, 21 self._t : Y_test 22 }) 23 24model = MLP(input_n=784, output_n=10, hidden_n=[500, 300, 100], func_n=[0, 0, 0]) 25model.fit(X_train, Y_train, epochs=50, batch_size=200) 26accuracy = model.evaluate(X_test, Y_test) 27print('accuracy:', accuracy)
クラス内のコードの全文です。
Tensorflow
1 2# activation = [0, 1, 0 ,1] 3# 0 : ReLU, 1 : sigmoid 4class MLP(object): 5 def __init__(self, input_n, output_n, hidden_n, func_n): 6 self.input_n = input_n 7 self.output_n = output_n 8 self.hidden_n = hidden_n 9 self.weights = [] 10 self.biases = [] 11 self.func_n = func_n 12 self._x = None 13 self._t = None 14 self._sess = None 15 self._history = { 16 'accuracy' : [], 17 'loss' : [] 18 } 19 20 21 def weight_variable(self, shape): 22 initial = tf.Variable(tf.random_normal(shape, stddev=0.01)) 23 return initial 24 25 def bias_variable(self, shape): 26 initial = tf.Variable(tf.zeros(shape)) 27 return initial 28 29 def function(self, x, func): 30 if func == 0: 31 return tf.nn.relu(x) 32 if func == 1: 33 return tf.nn.sigmoi(x) 34 35 def inference(self, x): 36 # input-layer - hidden-layer, hidden-layer - hidden-layer 37 for i, hidden in enumerate(self.hidden_n): 38 if i == 0: 39 inp = x 40 input_dim = self.input_n 41 else: 42 inp = output 43 input_dim = self.hidden_n[i-1] 44 45 self.weights.append(self.weight_variable([input_dim, hidden])) 46 self.biases.append(self.bias_variable([hidden])) 47 48 h = tf.matmul(inp, self.weights[-1]) + self.biases[-1] 49 output = self.function(h, self.func_n[i]) 50 51 self.weights.append(self.weight_variable([self.hidden_n[-1], self.output_n])) 52 self.biases.append(self.bias_variable([self.output_n])) 53 54 y = tf.nn.softmax(tf.matmul(output, self.weights[-1]) + self.biases[-1]) 55 56 return y 57 58 59 def loss(self, y, t): 60 loss = tf.reduce_mean(-tf.reduce_sum( 61 t * tf.log(tf.clip_by_value(y, 1e-10, 1.0)), reduction_indices=[1])) 62 return loss 63 64 def training(self, loss): 65 optimizer = tf.train.GradientDescentOptimizer(0.01) 66 train_step = optimizer.minimize(loss) 67 return(loss) 68 69 def accuracy(self, y, t): 70 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1)) 71 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 72 return accuracy 73 74 def fit(self, X_train, Y_train, epochs=100, batch_size=100): 75 x = tf.placeholder(tf.float32, [None, self.input_n]) 76 t = tf.placeholder(tf.float32, [None, self.output_n]) 77 78 # save for evaluate() 79 self._x = x 80 self._t = t 81 82 y = self.inference(x) 83 loss = self.loss(y, t) 84 train_step = self.training(loss) 85 accuracy = self.accuracy(y, t) 86 87 init = tf.global_variables_initializer() 88 sess = tf.Session() 89 sess.run(init) 90 91 # save for evaluate() 92 self._sess = sess 93 94 N_train = len(X_train) 95 n_batches = N_train // batch_size 96 97 for epoch in range(epochs): 98 X_, Y_ = shuffle(X_train, Y_train) 99 100 for i in range(n_batches): 101 start = i * batch_size 102 end = start + batch_size 103 104 sess.run(train_step, feed_dict={ 105 x : X_train[start:end], 106 t : Y_train[start:end] 107 }) 108 loss_ = loss.eval(session=sess, feed_dict={ 109 x : X_train, 110 t : Y_train 111 }) 112 accuracy_ = accuracy.eval(session=sess, feed_dict={ 113 x : X_train, 114 t : Y_train 115 }) 116 117 # save to _history 118 self._history['loss'].append(loss_) 119 self._history['accuracy'].append(accuracy_) 120 121 return self._history 122 123 124 def evaluate(self, X_test, Y_test): 125 return self.accuracy.eval(session=self._sess, feed_dict={ 126 self._x : X_test, 127 self._t : Y_test 128 })
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/22 14:40
2018/10/22 14:46
2018/10/22 15:00
2018/10/22 15:44
2018/10/23 07:53