Здравствуйте!Хочу дать статью где тестировал фреймворк Theano.
Скачал так (старый)(через анаконду):
>python -m pip install theano=1.0.0.
У меня были установлены переменные среды для Cpp компиляторов, но их запуск давал ошибку.Надо было затирать переменные среды
такие, я код удалил из theano/configdefaults.py и вообще не надо писать в .theanorc, которая вычисляется как
import os;os.expanduser('~')->str/.theanorc.
Работает на символьном программировании.Может вычислять производные(градиеты).
Основы:
Пакет theano.tensor содержит наиболее часто употребляемые типы тензоров.
При несовпадении типов Theano выбросит исключение. Исправить
можно, передав конструктору обьекта function аргумент allow_input_downcast=True, показано в app3.py
В app4.py может работать оптимизатор.
theano - общая переменная. Theano Shared Variable.
Общие переменные, означающие, что этими переменными можно обмениваться и постоянно обновлять(!) значения в арифметическом процессе. определяется в том случае, когда веса и смещение, и будут необходимы такие переменные.
Показано в app5.py
Мы можем сбросить значение состояния, вызовите метод set_value.Показано в app.6.py:.
Посчитаем градиент для функции x**2 в точке 4.Показано в app7.py.
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # app.py
import theano
from theano import tensor
"""
Вычислим значение по точке 10
"""
a=tensor.lscalar()
exp=1+2*a+a**2
f=theano.function(inputs=[a], outputs=exp)
print('f(10)', f(10)) # 121 |
|
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # app2.py
import matplotlib.pyplot as plt
import theano
import theano.tensor as T
import numpy as np
"""
Построим и сохраним график по точкам (от -10 до 10) для выражения exp
"""
a = T.lvector()
exp = 1 + 2 * a + a ** 2
f = theano.function(
inputs=[a],
outputs=exp
)
arg = np.arange(-10, 10) # шаг 1
res = f(arg)
plt.plot(arg, res, c='m', linewidth=3.)
plt.savefig('gr.png')
# На рис. 1 |
|
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| import theano
import theano.tensor as T
import numpy as np
"""
Сложим матрицу и вектор хотя они разные через аргумент allow_input_downcast=True
"""
x = T.dmatrix('x')
v = T.fvector('v')
z = v + x
f = theano.function(
inputs=[x, v],
outputs=z,
allow_input_downcast=True
)
f_fail = theano.function(
inputs=[x, v],
outputs=z
)
print('f', f(np.ones((3, 4), dtype=float), np.ones((4,), dtype=float)))
"""
->f_fail [[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]
"""
print(f_fail(np.ones((3, 4), dtype=float), np.ones((4,), dtype=float)))
"""
->v = T.fvector('v')
TensorType(float32, vector) cannot store a value of dtype float64 without risking loss of precision.
If you do not mind this loss, you can: 1) explicitly cast your data to float32, or 2)
set "allow_input_downcast=True" when calling "function". Value: "array([1., 1., 1., 1.])
""" |
|
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #app4.py
import theano
import theano.tensor as T
import numpy as np
x = T.lscalar('x')
y = T.lscalar('y')
square = T.square(x + y) # сложение и возведение в квадрат
sqrt = T.sqrt(x + y) # сложение и корень
f = theano.function(
inputs=[x, y],
outputs=[square, sqrt]
)
print(f(5, 4))
print(f(2, 2))
"""
>>> [array(81), array(3.0)]
>>> [array(16), array(2.0)]
""" |
|
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| #app5.py
import theano
import theano.tensor as T
import numpy as np
state = theano.shared(0) # инициализируем
i = T.iscalar('i')
inc = theano.function([i], # вход
state, # выход
# обновим разделяемую переменную
updates=[(state, state+i)])
dec = theano.function([i],
state,
updates=[(state, state-i)]
print('inc(1)', inc(1))
print('state.get_value()', state.get_value())
print('inc(1)', inc(1))
print('state.get_value()', state.get_value())
print('inc(1)', inc(1))
print('state.get_value()', state.get_value())
"""
->
inc(1) 0
state.get_value() 1
inc(1) 1
state.get_value() 2:
inc(1) 2
state.get_value() 3
""" |
|
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #app6.py
import theano
import theano.tensor as T
import numpy as np
state = theano.shared(0) # инициализируем
i = T.iscalar('i')
acc = theano.function([i], # вход
state, # выход
# обновим переменную state
updates=[(state, state+i)])
dec = theano.function([i],
state,
updates=[(state, state-i)])
state.set_value(-1)
acc(3)
print(state.get_value())
"""
->
2
""") |
|
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # app6.py
import numpy
import theano
import theano.tensor as T
from theano import pp
"""
Посчитаем градиент для функции x**2 в точке 4
"""
x = T.dscalar('x')
y = x ** 2
gy = T.grad(y, x)
print(pp(gy)) # отпечатаем градиент
# ->'((fill((x ** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x ** (TensorConstant{2} - TensorConstant{1})))'
f = theano.function([x], gy)
print('f(4)', f(4))
# -> (8.0) |
|
Рис. 1.
|