前提・実現したいこと
python初心者です。
https://www.atmarkit.co.jp/ait/articles/1712/11/news134.html
上記の記事をまず動かしてみたいと思いコードを入力しているのですが、エラーが出てしました。
エラーの解決策をご教授お願いいたします。PY
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-31-7b4a94d4e9e4> in <module> 7 # 学習 8 ----> 9 Model = prediction.train(x_train, t_train, batch_size, epochs) 10 # テスト 11 score = Model.evaluate(x_test, t_test, batch_size = batch_size, verbose = 1) <ipython-input-28-6ed012f1521e> in train(self, x_train, t_train, batch_size, epochs) 25 model = self.create_model() 26 model.fit(x_train, t_train, batch_size = batch_size, epochs = epochs, verbose = 1, ---> 27 shuffle = True, callbacks = [early_stopping], validation_split = 0.1) 28 return model ~\Anaconda3\envs\keras-env\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs) 1008 else: 1009 ins = x + y + sample_weights -> 1010 self._make_train_function() 1011 f = self.train_function 1012 ~\Anaconda3\envs\keras-env\lib\site-packages\keras\engine\training.py in _make_train_function(self) 507 training_updates = self.optimizer.get_updates( 508 params=self._collected_trainable_weights, --> 509 loss=self.total_loss) 510 updates = (self.updates + 511 training_updates + ~\Anaconda3\envs\keras-env\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs) 89 warnings.warn('Update your `' + object_name + '` call to the ' + 90 'Keras 2 API: ' + signature, stacklevel=2) ---> 91 return func(*args, **kwargs) 92 wrapper._original_function = func 93 return wrapper ~\Anaconda3\envs\keras-env\lib\site-packages\keras\optimizers.py in get_updates(self, loss, params) 267 # update accumulator 268 new_a = self.rho * a + (1. - self.rho) * K.square(g) --> 269 self.updates.append(K.update(a, new_a)) 270 new_p = p - lr * g / (K.sqrt(new_a) + self.epsilon) 271 ~\Anaconda3\envs\keras-env\lib\site-packages\keras\backend\tensorflow_backend.py in update(x, new_x) 971 The variable `x` updated. 972 """ --> 973 return tf.assign(x, new_x) 974 975 ~\Anaconda3\envs\keras-env\lib\site-packages\tensorflow_core\python\ops\state_ops.py in assign(ref, value, validate_shape, use_locking, name) 226 ref, value, use_locking=use_locking, name=name, 227 validate_shape=validate_shape) --> 228 return ref.assign(value, name=name) 229 230 AttributeError: 'Tensor' object has no attribute 'assign'
該当のソースコード
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import csv from __future__ import print_function from keras.layers.core import Activation from keras.layers.core import Dense from keras.layers.core import Dropout from keras.models import Sequential from keras.utils import np_utils from keras.utils import plot_model from keras.layers.recurrent import LSTM from keras.callbacks import EarlyStopping from keras.initializers import glorot_uniform from keras.initializers import orthogonal from keras.initializers import TruncatedNormal # 学習データ df1 = csv.reader(open('x-data.csv', 'r')) data1 = [ v for v in df1] mat = np.array(data1) mat2 = mat[1:] # 見出し行を外す x_data = mat2[:, 1:].astype(np.float) # 2列目以降を抜き出してfloat変換 print('x_data.shape=', x_data.shape) # ラベルデータ # 1%以上/0%以上/-1%以上/-1%未満 df2 = csv.reader(open('t-data.csv', 'r')) data2 = [ v for v in df2] mat3 = np.array(data2) mat4 = mat3[1:] # 見出し行を外す t_data = mat4[:, 1:].astype(np.float) # 2列目以降を抜き出してfloat変換 print('t_data.shape=', t_data.shape) maxlen = 80 # 入力系列数 n_in = x_data.shape[1] # 学習データ(=入力)の列数 n_out = t_data.shape[1] # ラベルデータ(=出力)の列数 len_seq = x_data.shape[0] - maxlen + 1 data = [] target = [] for i in range(0, len_seq): data.append(x_data[i:i+maxlen, :]) target.append(t_data[i+maxlen-1, :]) x = np.array(data).reshape(len(data), maxlen, n_in) t = np.array(target).reshape(len(data), n_out) print(x.shape, t.shape) # ここからソースコードの後半 n_train = int(len(data)*0.9) # 訓練データ長 x_train,x_test = np.vsplit(x, [n_train]) # 学習データを訓練用とテスト用に分割 t_train,t_test = np.vsplit(t, [n_train]) # ラベルデータを訓練用とテスト用に分割 print(x_train.shape, x_test.shape, t_train.shape, t_test.shape) class Prediction : def __init__(self, maxlen, n_hidden, n_in, n_out): self.maxlen = maxlen self.n_hidden = n_hidden self.n_in = n_in self.n_out = n_out def create_model(self): model = Sequential() model.add(LSTM(self.n_hidden, batch_input_shape = (None, self.maxlen, self.n_in), kernel_initializer = glorot_uniform(seed=20170719), recurrent_initializer = orthogonal(gain=1.0, seed=20170719), dropout = 0.5, recurrent_dropout = 0.5)) model.add(Dropout(0.5)) model.add(Dense(self.n_out, kernel_initializer = glorot_uniform(seed=20170719))) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer = "RMSprop", metrics = ['categorical_accuracy']) return model # 学習 def train(self, x_train, t_train, batch_size, epochs) : early_stopping = EarlyStopping(patience=0, verbose=1) model = self.create_model() model.fit(x_train, t_train, batch_size = batch_size, epochs = epochs, verbose = 1, shuffle = True, callbacks = [early_stopping], validation_split = 0.1) return model n_hidden = 80 # 出力次元 epochs = 100 # エポック数 batch_size = 10 # ミニバッチサイズ # モデル定義 prediction = Prediction(maxlen, n_hidden, n_in, n_out) # 学習 model = prediction.train(x_train, t_train, batch_size, epochs) # テスト score = model.evaluate(x_test, t_test, batch_size = batch_size, verbose = 1) print("score:", score) # 正答率、準正答率(騰落)集計 preds = model.predict(x_test) correct = 0 semi_correct = 0 for i in range(len(preds)): pred = np.argmax(preds[i,:]) tar = np.argmax(t_test[i,:]) if pred == tar : correct += 1 else : if pred+tar == 1 or pred+tar == 5 : semi_correct += 1 print("正答率:", 1.0 * correct / len(preds)) print("準正答率(騰落):", 1.0 * (correct+semi_correct) / len(preds))
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー