Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1. import lasagne
  2. import theano
  3. import theano.tensor as T
  4. from lxml import etree
  5. from sklearn.feature_extraction.text import CountVectorizer
  6.  
  7. file1='bank_train_2016.xml'
  8. file2='banks_test_etalon.xml'
  9.  
  10. def parse(filename):
  11. X = []
  12. y=[]
  13. tree = etree.parse(filename)
  14. banknames=['sberbank','vtb','gazprom','alfabank','bankmoskvy','raiffeisen','uralsib','rshb']
  15. useless=['id','twitid','date']
  16. aa= tree.xpath('database/table')
  17. for a in aa:
  18. for node in a:
  19. if node.get('name')not in useless:
  20. if node.get('name') not in banknames:
  21. X.append(node.text)
  22. else:
  23. if node.text != 'NULL':
  24. y.append(node.text)
  25. break
  26. return X, y
  27.  
  28. X_train, y_train =parse(file1)
  29. X_test, y_test =parse(file2)
  30.  
  31. cv = CountVectorizer()
  32. X_train = cv.fit_transform(X_train)
  33. vocab_size=len(cv.vocabulary_.values())
  34. print(vocab_size)
  35.  
  36.  
  37.  
  38. def build_mlp(input_var=None):
  39. # Входной слой, определяющий размерность данных
  40. # (переменный размер minibatch'a, 1 канал, 28 строк и 28 столбов)
  41. # Мы можем передать тензорную переменную для входных данных,
  42. # или же она будет создана для нас
  43. network = lasagne.layers.InputLayer(
  44. shape=(None, 1, 1, vocab_size),
  45. input_var=input_var)
  46.  
  47. # Полносвязный слой на 800 нейронов и ReLU в качестве нелинейности
  48. # также инициализируем веса методом, предложенным Xavier Glorot и Yoshua Bengio
  49. network = lasagne.layers.DenseLayer(
  50. network,
  51. num_units=800,
  52. nonlinearity=lasagne.nonlinearities.rectify,
  53. W=lasagne.init.GlorotUniform())
  54.  
  55. # И ещё один полносвязный слой
  56. network = lasagne.layers.DenseLayer(
  57. network,
  58. num_units=800,
  59. nonlinearity=lasagne.nonlinearities.rectify)
  60.  
  61. # Наконец, добавим классификатор на 10 классов:
  62. network = lasagne.layers.DenseLayer(
  63. network,
  64. num_units=3,
  65. nonlinearity=lasagne.nonlinearities.softmax)
  66.  
  67. return network
  68.  
  69. input_var = T.tensor4('inputs')
  70. target_var = T.ivector('targets')
  71.  
  72. # воспользуемся функцией из предыдущего листинга
  73. network = build_mlp(input_var)
  74.  
  75. # эта функция вернёт нам граф вычислений, соответствующий сети
  76. prediction = lasagne.layers.get_output(network)
  77. # зададим функцию потерь
  78. loss = lasagne.objectives.categorical_crossentropy(prediction, target_var).mean()
  79. # Сюда также можно добавить L1 или L2 регуляризацию, см. lasagne.regularization.
  80.  
  81. # Этот метод позволит получить список параметров сети
  82. # он также принимает keyword аргумент, позволяющий выбрать параметры по тегу
  83. # наиболее часто употребимые это trainable и regularizable
  84. params = lasagne.layers.get_all_params(network, trainable=True)
  85. # используем метод стохастического градиентного спуска с моментом Нестерова
  86. updates = lasagne.updates.nesterov_momentum(
  87. loss,
  88. params,
  89. learning_rate=0.01,
  90. momentum=0.9)
  91.  
  92. # Также создадим выражение для функции потерь на валидации.
  93. # Главное отличие тут заключается в аргументе deterministic=True,
  94. # который отключает dropout
  95. test_prediction = lasagne.layers.get_output(network, deterministic=True)
  96. test_loss = T.nnet.categorical_crossentropy(test_prediction,
  97. target_var).mean()
  98. # Заодно посчитаем точность классификатора
  99. test_acc = T.mean(
  100. T.eq(T.argmax(test_prediction, axis=1), target_var),
  101. dtype=theano.config.floatX)
  102. # скомпилируем функцию для обучения
  103. train = theano.function(
  104. inputs=[input_var, target_var],
  105. outputs=loss,
  106. updates=updates)
  107.  
  108. # и вторую — для валидации
  109. # оптимизатор Theano тут поймёт, что для вычисления функции потерь и точности
  110. # можно переиспользовать большую часть графа
  111. validate = theano.function(
  112. inputs=[input_var, target_var],
  113. outputs=[test_loss, test_acc])
  114.  
  115. print("| Epoch | Train err | Validation err | Accuracy | Time |")
  116. print("|------------------------------------------------------------------------|")
  117.  
  118. try:
  119. for epoch in range(100):
  120. # Каждую эпоху будем проходить по всей обучающей выборке
  121. train_err = 0
  122. train_batches = 0
  123. start_time = time.time()
  124. for batch in iterate_minibatches(X_train, y_train, 500, shuffle=True):
  125. inputs, targets = batch
  126. train_err += train(inputs, targets)
  127. train_batches += 1
  128.  
  129. # И по всей валидационной
  130. val_err = 0
  131. val_acc = 0
  132. val_batches = 0
  133. for batch in iterate_minibatches(X_val, y_val, 500, shuffle=False):
  134. inputs, targets = batch
  135. err, acc = validate(inputs, targets)
  136. val_err += err
  137. val_acc += acc
  138. val_batches += 1
  139.  
  140. print("|{:05d} | {:4.5f} | {:16.5f} | {:10.2f} | {:7.2f} |".format
  141. (epoch,
  142. train_err / train_batches,
  143. val_err / val_batches,
  144. val_acc / val_batches * 100,
  145. time.time() - start_time))
  146. except KeyboardInterrupt:
  147. print("The training was interrupted on epoch: {}".format(epoch))
  148.  
  149. # Сохраняем веса
  150. savez('model.npz', *lasagne.layers.get_all_param_values(network))
  151.  
  152. network = build_mlp()
  153. # И загружаем, когда потребуется:
  154. with np.load('model.npz') as f:
  155. param_values = [f['arr_%d' % i] for i in range(len(f.files))]
  156. lasagne.layers.set_all_param_values(network, param_values)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement