第一节,基础知识之第一步:代数

先声明:theano模块的内容大都是参考来源于网上,并亲手实践复现一遍,也有部分内容是自己补充

本文会列出所参考文章,如有版权问题,请联系我,我会及时删除

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 23 13:33:20 2018

@author: zy
"""

‘‘‘
x= T.dscalar(‘x‘)
y= T.dscalar(‘y‘)
z = x + y
f = theano.function([x,y],z)
调用re = f(2,3)
函数输出的结果re:每个元素的类型,一般和该函数输入传入的符号变量类型(x,y)一致 并且该结果的类型为numpy.ndarray
函数f传入参数时可以传入比float64长度小的数据类型,比如int32
但是反过来不行 x= T.iscalar(‘x‘) f(2.2,3)会报错
‘‘‘

‘‘‘
Theano2.1.2-基础知识之第一步:代数
http://www.cnblogs.com/shouhuxianjian/p/4590234.html
‘‘‘

import theano.tensor as T
import theano

‘‘‘
一.两个标量相加
‘‘‘
#在学习theano开始,首先来感受下它是怎么工作的,让我们定义一个简单的相加函数
x= T.dscalar(‘x‘)
y= T.dscalar(‘y‘)
z = x + y
f = theano.function([x,y],z)

#然后我们就可以开始使用创建好的函数了
print(f(2,3))                 #5.0  5.0为float64数据类型dscalar一致
print(type(f(1.0,2.3)))       #<class ‘numpy.ndarray‘>
print(f(1.0,2.3))             #3.3    

‘‘‘
这里首先把上面部分进行分布介绍,首先定义连个符号(变量),表示你想要相加的数。注意从现在开始,我们将会
使用变量(variable)来表示‘符‘(换句话说,就是x,y,z都是变量对象),函数f就是一个有着0维的numpy.ndarray

如果你想要一个整数,你可能会发现在执行function的时候有轻微的延时,这是一位将函数f编译为C代码
‘‘‘

#第一步
x = T.dscalar(‘x‘)
y = T.dscalar(‘y‘)

‘‘‘
在theano中,所有的符号都必选手动输入。具体来说,T.dscalar就是我们分配给‘doubles类型(d)的0维数组(scalar)‘
类型,这就是一个theano类型。

dscalar不是一个类,所以x,y都不是dscalar的实例。他们是TensorVariable的实例,正如你所看到的
‘‘‘
print(type(x))             #<class ‘theano.tensor.var.TensorVariable‘>
print(x.type)              #TensorType(float64, scalar)
print(T.dscalar)           #TensorType(float64, scalar)

‘‘‘
通过一个字符串参数来调用T.dscalar,可以创建一个变量便是一个给定名字下的一个浮点标量。如果不提供参数,
该符号将会是一个未命名的。虽然名字不是必须的,但是却有助于调试。
‘‘‘

#第二步
‘‘‘
结合x与y得到他们的和z
‘‘‘
z = x + y

#z是另一个变量,同来表示x与y的和,你可以使用pp函数打印出与z关联的计算结果
from theano import pp
print(pp(z))      #(x + y)

#第三步
‘‘‘
创建一个函数,将x与y作为输入,然后通过z作为输出
function():http://deeplearning.net/software/theano/library/compile/function.html#module-function
‘‘‘
f = theano.function([x,y],z)

‘‘‘
function第一个参数是变量的列表,用来作为输入提供给函数。第二个参数是一个单一的变量或者一个变量列表。
在其它情况下,第二个参数就是我们想要的输出。然后f可以被和普通python函数一样的是用了

note:作为了一个快捷方式,你就可以跳过第三步,只使用一个变量的eval方法。eval()方法没有function()这么灵活,
不过却能做教程中的任何事情。如果你不需要import function()的额外的福利,下面就是eval()工作的过程
‘‘‘
w = z.eval({x:16.3,y:12.1})
print(w)    #28.4

‘‘‘
我们给eval()传递一个dict,将符号theano遍历映射成值从而来取代他们。然后对表达式计算返回数值
val() 在第一次调用的时候可能会比较慢,因为它需要调用 function() 来计算场景后面的表达式。之后对
eval() 以同样的变量上的调用将会很快,因为变量已经将编译后的函数进行缓存了。
‘‘‘

‘‘‘
二.两个矩阵相加
‘‘‘

#你可能已经猜到如何来作了,确实这里和之前的唯一的区别在于你需要实例化x与y,然后使用矩阵类型
x= T.dmatrix(‘x‘)
y= T.dmatrix(‘y‘)
z = x + y
f = theano.function([x,y],z)
print(x.type)          #TensorType(float64, matrix)  

#dmatrix是doubles类型的矩阵,然后我们就能在2D数组上使用新的函数了
a1 = [[1,2],[3,4]]
b1 = [[10,20],[30,40]]
re = f(a1,b1)
print(re)              #[[ 11.  22.],[ 33.  44.]]
print(type(re))        #<class ‘numpy.ndarray‘>
print(re.dtype)        #float64

#输出值f是一个numpy.ndarray数组,我们可以直接使用numpy.ndarray作为输入
import numpy as np
re=f(np.array([[1,2],[3,4]]),np.array([[10,20],[20,40]]))
print(re)              #[[ 11.  22.],[ 33.  44.]]
print(type(re))        #<class ‘numpy.ndarray‘>
print(re.dtype)        #float64

‘‘‘
计算矩阵加标量,矩阵加向量,向量加标量都是可以的,这都要归功于braodcasting:http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-tensor-broadcastable

下面的类型都是可用的:
byte: bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4
16-bit integers: wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4
32-bit integers: iscalar, ivector, imatrix, irow, icol, itensor3, itensor4
64-bit integers: lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4
float: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4
double: dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4
(
float32: scalar, vector, matrix, row, col, tensor3, tensor4
float32: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4
double(float64): dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4
)
complex: cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4
上面的列表不够详尽,针对使用Numpy数组来兼容所有类型的更详细文档可以看: tensor creation:http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-tensor-creation

‘‘‘

‘‘‘
三.练习
‘‘‘

a1 = T.vector()                   #定义一个变量
print(a1.type)                    #TensorType(float32, vector)
out1 = a1 + a1**2                 #表达式
f1 = theano.function([a1],out1)   #编译函数
r1 = f1([0,1,2])
print(r1,r1.dtype)                 #[ 0.  2.  6.] float32

a2 = T.fvector()                    #定义一个变量
print(a2.type)                      #TensorType(float32, vector)
out2 = a2 + a2**2                   #表达式
f2 = theano.function([a2],out2)     #编译函数
r2 = f2([0,1,2])
print(r2,r2.dtype)                 #[ 0.  2.  6.] float32

a3 = T.dvector()                    #定义一个变量
print(a3.type)                      #TensorType(float64, vector)
out3 = a3 + a3**2                   #表达式
f3 = theano.function([a3],out3)     #编译函数
r3 = f3([0,1,2])
print(r3,r3.dtype)                 #[ 0.  2.  6.] float64

‘‘‘
从上面练习可以看出

float32: scalar, vector, matrix, row, col, tensor3, tensor4
float32: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4
double(float64): dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4

‘‘‘

a4 = T.iscalar(‘x‘) #TensorType(int32, scalar)
print(a4.type)
b4 = T.scalar(‘y‘) #TensorType(float32, scalar)
print(b4.type)
out4 = a4*b4
f4 = theano.function([a4,b4],out4)
r4 = f4(10,12)
print(r4) #120.0
print(r4.dtype) #float64
‘‘‘
我们可以看到乘积的类型变成了float64
‘‘‘

 

原文地址:https://www.cnblogs.com/zyly/p/8631256.html

时间: 2024-11-09 02:13:46

第一节,基础知识之第一步:代数的相关文章

BurpSuite学习第一节--基础知识

一.BurpSuite的用处 Burp Suite是进行Web应用安全测试集成平台.在安全人员常用工具表(https://sectools.org/),burp suite排在第十三位 二.功能模块 Burp suite的模块几乎包含整个安全测试过程,从最初对目标程序的信息采集,到漏洞扫描及其利用 主要模块: Target(目标)--- Proxy(代理)---是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人.允许拦截,查看,修改在两个方向上的原始数据流 Spide

Bash编程基础知识学习第一节

Bash编程基础知识学习 一.bash的由来 1 .什么是Bash 什么是Shell Bash 是GNU Bourne-Again SHell,是目前大多数Linux发行版采用的Shell. Shell 是*nix提供给用户使用的界面.一个操作系统的底层是独立运行的, 用户界面和底层分开,可以最大限度的保证系统稳定.Shell就是一个特殊的程序,负责接受用户的命令,并把系统的响应返回给用户. Bash Shell 一般不需要自己安装,在安装发行版的同时都会安装好. Shell的存在是和登陆相关的

wpf(第一章 基础知识)

wpf第一章基础知识:通过vs2015创建wpf程序会在引用里面多出3个核心程序集PresentationCore.PresentationFramework.WindowsBase.并且会在解决方案中生成如下的结构: 1.程序起始相关的资源:2.与整个wpf相关的后台代码:3.窗体界面:4.窗体界面的后台代码. 在app.xaml中 1.Application的后台类:2.启动窗体:3.系统资源区域 除此之外可以在MainWindow.xaml中自定义窗体设置属性,拖拉控件在里面.

unix环境高级编程基础知识之第一篇

陆陆续续看完了圣经第一章,熟悉了unix的整个编程流程,c语言的用处在这里得到伸张. 从unix的体系结构,原来操作系统包括内核及一些其他软件,我们常常误称为linux内核为操作系统,这俨然成为一种共识.基本熟悉了shell的介绍,主流的是bash(Bourne-again shell),unix的文件的基本操作,出错处理,用户ID,信号(感觉类似windows的消息),时间值,最后还有系统调用和库函数的区别. 自己把这篇的所有代码用vim的敲完了,主要前期是熟悉unix的基本命令编程,大致了解

【读书笔记】《Python基础教程》第一章 基础知识

第一章 基础知识 实现两个数整除:使用命令开关 -Qnew (?): 使用双斜线. from future import division 执行向计算器那样的普通除法. 幂(乘方)运算符: 2 ** 3 (8),用函数代替 pow(2,3),内建函数 长整数型:在数字结尾加L.eg:10000000000000L 获取用户输入 input("提示信息 :") eg: x = input("x: ") .输入的是合法的python表达式 raw_input("

Kubernetes 第一章 基础知识

Kubernetes 第一章 基础知识 Kubernetes是一个开源容器编排引擎,用于自动化容器化应用程序的部署,扩展和管理.开源项目由Cloud Native Computing Foundation(CNCF)托管. Kubernetes是一个可移植,可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明性配置和自动化.它拥有庞大,快速发展的生态系统.Kubernetes服务,具有广泛的工具和支持可用. 发展历程 传统部署时代: 早期,组织在物理服务器上运行应用程序.无法为物理服务器中

基础知识回顾第一章servlet的学习和理解

前言:关于servlet相信学过java的都不会陌生,我最近又把这些基础知识整理一遍,便于自已能更好的理解ssm或者ssh,下面开始 1:Servlet接口 servlet有5个方法下面分别简单的介绍每个方法的作用 1.1:public void init(ServletConfig config) 在servlet被实例化以后,servlet容器会调用init方法来初始化该对象,这个方法主要是完成在请求前的一些初始化工作,比喻调用数据库连接,实例化对象等 1.2:public void ser

HTML第一课——基础知识普及【2】

关注公众号:自动化测试实战 img标签 我们先看一下文档结构: 这里我们文件当前位置就是lesson.html,所以现在我们img属性src给的值要进入imgs文件夹,所以我们可以用相对路径来表示,看代码: <!DOCTYPE html><html>    <head>        <title>第一节课</title>        <meta charset="UTF-8"/>    </head>

汇编语言--第一章--基础知识

基础知识 D(decimal)10 B(binary)2 H(hexadecimal)16 O(octal)8 二进制数和十进制数的转换 十进制转换为二进制: 1.降幂法 2.除法:多用除法 把要转换的十进制数的整数部分不断除以2,并记下余数,知道商为0为止.从下向上写. 对于被转换的十进制数的小数部分则应不断乘以2,并记下其整数部分,直到结果的小数部分为0为止.从上向下写. 为了便于对二进制数的描述,应该选择一种易于与二进制数相互转换的数制. 计算机中常用的字符是采用8位二进制数组成的一个字节