Pytorch60分钟教程学习笔记
基本概念Tensortensor是的含义是张量,简单的理解可以将其当成三维矩阵,pytorch中的张量是对数据的一种封装,也是数据结构中最核心的部分之一。对于pytorch中的张量,数组可能是更好的理解方法。
Tensor的定义
直接定义矩阵,使用torch.Tensor(shape)方法定义未初始化的张量,使用torch.rand(shape)或torch.randn(shape)定义随机张量1234567891011121314151617import torch as ptx = pt.Tensor(2,4)print(x)# 1.00000e-23 *# 0.0000 0.0000 1.2028 0.0000# 0.0000 0.0000 1.1517 0.0000# [torch.FloatTensor of size 2x4]x = pt.rand(5,3)# 0.7609 0.5925 0.5840# 0.1949 0.6366 0.3763# 0.1802 0.8529 0.9373# 0.6013 0.9685 0. ...
ROM乘法器
基本算法ROM乘法器的算法比较简单,即使用一个ROM保存乘法的结果,在需要运算的时候直接到相应的地址去查表即可。例如计算两个4位二进制数的乘法a*b,那么需要一个八位输入八位输出的ROM存储计算结果即可,其地址与存储数据的关系为:地址{a,b}(位拼接)存储a*b(例如地址为8'b00010010存储的结果就是0001*0001=8'b00000010)这种情况下使用的ROM比较大,所以在时序要求不严格的时候可以用时钟换面积,例如对于8位8位的ROM乘法器,我们将其拆成乘数1高4位,低4位和乘数2高4位低4位两两相乘。高四位和高四位相乘后结果向左位移4位,高四位和低四位相乘结果往左移2位,低四位和低四位相乘结果不变累加(就是手算乘法常用的套路)可得在四个(最少)时钟周期后得到结果,使用的ROM可由16\16降到4*4
单个ROM乘法器Python生成器单个ROM在Verilog中可以使用case语句模拟,手写这种重复化很高的case语句无疑是一种效率很低的方法,本次使用Python语句生成1234567891011121314151617181920 ...
全并行流水移位相加乘法器
基本算法与分时复用的移位相加类似,取消分时复用,使用面积换时间,使用流水线设计,流水线填满后可以一个时钟周期计算出一个结果
分别计算乘数的移位结果,并与被乘数对应位相与
使用加法树将结果相加
RTL代码移位部分固定移位单元代码如下,当被乘数第n位为1时,输出乘数移位向左移位n位的结果123456789101112131415161718192021222324252627module shift_unit # ( parameter WIDTH = 4, parameter SHIFT_NUM = 0)( input clk, // Clock input rst_n, // Asynchronous reset active low input shift_valid, input shift_mask, input [WIDTH - 1:0]shift_din, output reg [2 * WIDTH - 1:0]shift_dout);wire [2 * WIDTH - 1:0]shift_din_ext ...
分时复用的移位相加乘法器
基本算法移位相加即是日常我们使用的手算算法,移位相加的描述如下
设置积的初值为0
若乘数的最低位为0,则积不变,否则累加被乘数
若乘数的第一位为0,则积不变,否则累加向左移位一位的被乘数
…
若乘数的第n位(最高位)为0,则积不变,否则累加向左移位n位的被乘数RTL代码12345678910111213module serial_shiftadder_multipcation # ( parameter WIDTH = 4)( input clk, // Clock input rst_n, // Asynchronous reset active low input multiplier_valid, input [WIDTH - 1:0]multiplier1, input [WIDTH - 1:0]multiplier2, output reg product_valid, output reg [2 * WIDTH - 1:0]product);
接口定义部分,采用参数化设计,WIDTH为乘数/被乘数的位宽,mult ...
基于Python的Rosenblatt感知机模型
Rosenblatt感知器Rosenblatt感知器是一种最简单的感知器模型,即输出值为输入与对应权值相乘后取和再累加并加上偏置后通过符号函数的结果,即:Output = sgn(w0 * x0 + w1 * x1 + ... + wn * xn + bias)。训练时,使用有监督学习,当输出值与真实值不同时,对应的weight与该次输入数据与真实值和学习率的乘积相加,或可以描述为weight += input * (d - o) * n其中,input为输入值,d为真实值,o为输出值,n为学习率
Python实现Rosenblatt神经元的实现通过Rosenblatt感知器的数学模型,可以很简单的使用numpy库实现感知机功能123456789101112131415161718192021import numpy as npclass Rosenblatt(object): """docstring for Rosenblatt""" def __init__(self, InputNum): s ...
基于OpenCv-Python的视频组合
step0:概述
动机:手头有数个20秒左右的短视频(守望先锋最佳镜头),期望能组合成一个长视频
技术路线:opencv+python(opencv在Python中的封装库是cv2,依赖于numpy)step1:打开并显示视频要组合视频,首先需要打开视频并获取每一帧的图像,在opencv中可以使用VideoCapture这个类来打开视频,打开的视频也存在于这个类中,使用.read()方法也可以获得每一帧的图像,该方法的用法类似于生成器,每调用一次都会返回下一帧的图像。其中.waitKey()方法是延迟并获取键盘输入,传入参数是延迟时间数,单位是1/60s且必须是整数,因为原视频是60帧,所以间隔为1时是常速播放123456789101112import cv2capture = cv2.VideoCapture( "../leviathan's highlight_17-08-16_00-52-33.mp4")if capture.isOpened(): while True: ret, prev ...
基于Python的运动计费管理系统
动机 小伙伴们最近迷恋上羽毛球,组织了个小群,办了公用的运动卡用于开场,考虑不是每次活动都是全员参与,需要一个计费的系统来计算每个人需要交的费用。商讨后决定采用“预充-扣费”的方式,则需要一个系统进行计费和扣费。
技术路线规划
模块名
语言
备注
管理核心
Python
使用JSON存储信息
Web后端
Python
Flask框架
Web前端
HTML
Jinja框架渲染
实现核心模块——用户状态管理该部分是整个计费系统的核心,用于管理每个用户的余额。使用一个类表示用户,需要的属性为
状态列表(用户名,ID,使用次数,余额)
需要的方法有:
创建用户(创建新的JSON文件)
读取用户状态(从已有的JSON文件中)
扣费(使用次数增加1,余额减小)
充值(余额增加)
保存状态(将现有的状态写入JSON文件)
代码如下1234567891011121314# -*- coding: utf-8 -*-import jsonimport osclass UserHanlde(object): """docstri ...
JavaScript入门笔记6
标准对象正则对象正则表达式是一种处理文本信息的神器,在JavaScript中可以方便的使用正则对象对文本进行处理。JavaScript中声明正则对象可以使用var name = /.../和var name = new RegExp("..."),第二种方法个人是不推荐的,要处理一系列的文本转义,正则表达式定以后可以使用.test()方法检验是否有匹配和.exec()方法分组12345678var re_test = /\w+@\w+\.\w+/console.log(re_test) ///\w+@\w+\.\w+/console.log(re_test.test("avbd@163.com")) //trueconsole.log(re_test.test("adfasd")) //falsevar group_test = /(\w+)@(\w+)\.\w+/console.log( ...
JavaScript入门笔记5
函数
函数就是最基本的一种代码抽象的方式
函数的声明与调用JavaScript中声明函数的方法有两种
声明一个有名称的函数,使用类似C语言的function name(arguments) {}
声明一个匿名函数,再将该函数赋值给一个变量,使用var i = function (arguments) {};函数的调用方法与C和Python都很相似,使用name(arguments)的方式调用123456789function add(a,b) { return a + b}console.log(add(4,8)) //12var add = function(a,b) { return a + b}console.log(add(4,9)) //13
函数的参数JavaScript中的参数传递方式很灵活,可以使用arguments和rest关键字获取动态数量的参数
arguments关键字指向所有传入的参数,arguments是一个对象,不能使用for ...
JavaScript入门笔记4
MapMap的定义
Map是一组键值对的结构,具有极快的查找速度。
Map是JavaScript中更像字典的一种数据结构,使用new Map()定义,可选的在定义中传入使用二维数组存储的键值对,即new Map([...,[key,value],...])1234var black_map = new Map()console.log(black_map) //Map {}var test_map = new Map([["javascript",0],["python",1],["verilog",3]])console.log(test_map) //Map { 'javascript' => 0, 'python' => 1, 'verilog' => 3 }
Map的访问
使用Map.has(key)可以确定当前Map中是否 ...