theano 编程细节

  • Theano中的theano.shared()与C++中的std::shared_ptr<>()

面向对象深度神经网络

构造函数(也即\__init__)的使命是搭建舞台(该神经网络一共多少层,这些层的输入与输出,激励函数,每一层的属性),构造整个Architecture,它不负责运算,优化事宜。

theano_rng vs numpy_rng

import numpy
import theano
from theano.tensor.shared_randomstreams import RandomStreams

numpy_rng = numpy.random.RandomState(23455)
theano_rng = RandomStreams(numpy_rng.randint(2**30))

嵌入梯度下降

T.grad(cost, wrt)

第一个参数表示代价函数(是一个符号型函数,而非一个标量),第二个参数(with respect to)表示函数所关于的参数。

def get_cost_update(self, corruption_level, eta):
    tilde_x = self.get_corrupted_input(self.x, corruption_level)
    y = self.get_hidden_values(tilde_x)
    z = self.get_reconstructed_input(y)
    L = -T.sum(self.x*T.log(z)+(1-self.x)*T.log(1-z), axis=1)
    cost = T.mean(L)
    gparams = T.grad(cost, self.params)
            # self.params = [self.W, self.b, self.b_prime]
    updates = [(param, param-eta*gparam) for param, gparam in zip(self.params, gparams)] 
    return (cost, updates)

mnist数据的加载

def load_data(dataset):
    with gzip.open(dataset, 'rb') as fp:
        train_set, valid_set, test_set = pickle(fp, encoding='latin1')
    def shared_datd(data_xy, borrow=True):
        data_x, data_y = data_xy
        shared_x = theano.shared(
            numpy.asarray(data_x, dtype=theano.config.floatX), borrow=borrow
        )
        shared_y = theano.shared(
            numpy.asarray(data_y, dtype=theano.config.floatX), borrow=borrow
        )
        return  shared_x, T.cast(shared_y, 'int32')
    train_set_x, train_set_y = shared_data(train_set)
    valid_set_x, valid_set_y = shared_data(valid_set)
    test_set_x, test_set_y = shared_data(test_set)
    rval = [(train_set_x, train_set_y), (valid_set_x, valid_set_y), (test_set_x, test_set_y)]
    return rval

每一个layer的输入

for i in range(self.nlayers):
    if i == 0:
        input_size = nins
    else:
        input_size = hidden_layers_size[i-1]

简单的二分支的判断,自然可以使用python下的三目运算符进行简化,也即:

for i in range(self.nlayers):
    input_size = nins if i == 0 else hidden_layers_size[i-1]

层间的输入输出关系

这段代码见于SdA

self.sigmoid_layers = []
self.params = []
self.dA_layers = []

for i in range(self.nlayers):
    input_size = nins if i == 0 else hidden_layers_size[i-1]
    layer_input = self.x if i == 0 else self.sigmoid_layers[-1].output
    sigmoid_layer = HiddenLayer(...)
    self.sigmoid_layers.append(sigmoid_layer)
                    # 一段精彩的逻辑
    self.params.extend(sigmoid_layer.params)
                    # self.params += sigmoid_layer.params
    dA_layer = dA(...)
    self.dA_layers.append(dA_layer)

type/dtype

dtype:data type

>> x = T.matrix()
>> x.type
TensorType(float64, matrix)

>> x.dtype
'float64'

numpy 下的多维数组到 theano.shared

Place the data into shared variables. This allows theano to copy the data to the GPU, if one is available.

def load_data_shared(filename='./data/mnist.pkl.gz'):
    with gzip.open(filename) as fp:
        training_data, valid_data, test_data = pickle.load(fp)
    def shared_data(data):
        shared_x = theano.shared(
                np.asarray(data[0], dtype=theano.config.floatX), borrow=True)
        shared_y = theano.shared(
                np.asarray(data[1], dtype=theano.config.floatX), borrow=True)
        return shared_x, share_y
    return shared_data(training_data), shared_data(valid_data), shared_data(test_data)

theano.function 的参数

def function(inputs, outputs=None, mode=None, updates=None, givens=None,
             no_default_updates=False, accept_inplace=False, name=None,
             rebuild_strict=True, allow_input_downcast=None, profile=None,
             on_unused_input=None):
                         # 常用的一般为 inputs,outputs,updates,givens

theano.tensor.var.TensorVariable

>> import theano.tensor as T
>> inpt = T.tensor4(name='inpt')

>> type(inpt)
theano.tensor.var.TensorVariable

>> inpt.ndim
4

>> inpt.dtype
'float64'

所谓 theano.config.floatX

>> type(theano.config.floatX)
str
>> theano.config.floatX
'float64'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值