我是个Fortran新手。我试图为矩阵运算编写fortran代码,但在设计我的函数的原型(接口)时却陷入了困境。
我的C/C++编程经验告诉我,要编写适用于所有维数的矩阵的代码,需要将数组和维数分别传递给函数。示例(可能不是最好的):
int * matx_op(int *mat_a, int arows, int acols, int *mat_b, int brows, int bcols);
但在fortran中,matmul()函数似乎是自动执行此操作的。想要了解它是如何做到的。
print *, 'Enter 16 elements of matrix A
我尝试通过本征库使用2000*2000矩阵乘法实现将代码从Fortran重写为C++。我发现Eigen中的for循环比Fortran中的do循环慢得多(>3倍)。代码如下所示:
test.f90
program main
implicit none
integer :: n,i,j,k
integer :: tic,toc
real(8),ALLOCATABLE ::a(:,:),b(:,:),c(:,:)
real(8) :: s
n = 2000
allocate(a(n,n),b(n,n),c(n,n))
do i=1,n
do j =1,n
a(j,i)
我试图使用tf.matmul()来执行稀疏矩阵乘法。
然而,与密集矩阵乘法相比,推理速度要慢得多。
根据tf.sparse_matmul()中的描述:
在一个平台上使用这个与密集矩阵相乘的盈亏平衡是稀疏矩阵中30%的零值。
因此,我用7/8的零值来构造稀疏矩阵。
这是我的代码:
import tensorflow as tf
import numpy as np
import time
a = tf.Variable(np.arange(1000).reshape(250,4) ,dtype=tf.float32) #dense matrix
b = tf.Variable(np.
在tensorflow关于的指南中,有一段代码如下:
import time
def measure(x, steps):
# TensorFlow initializes a GPU the first time it's used, exclude from timing.
tf.matmul(x, x)
start = time.time()
for i in range(steps):
x = tf.matmul(x, x)
_ = x.numpy() # Make sure to execute op and not just enq
我在OpenCV中有两个Mat图像:
Mat ft = Mat::zeros(src.rows,src.cols,CV_32FC1);
Mat h = Mat::zeros(src.rows,src.cols,CV_32FC1);
这两个图像都是相同的维数,并且是从单个源图像计算的。
我想把这两幅图像相乘,但我试过使用这两种方法。
Mat multiply1 = h*ft;
Mat multiply2;
gemm(h,ft,1,NULL,0,multiply2);
但这两种情况都会导致以下断言失败:
OpenCV错误:断言失败(a_size.width == len)在未知函数中,文件..
在Fortran中,可以对数组进行操作,但是如何将派生类型的索引也视为数组的一部分呢?代码可以解释我最想做的事情:
type mytype
integer :: b(3,3)
real :: c(4)
endtype
integer :: a(3,3)
real :: d(2,4)
type(mytype) :: mat(2)
!do stuff so that 'mat' gets values
....
!usually one does this
a = matmul(mat(1)%b, transpose(mat(2)%b))
!multiply
我是fortran的新手,我必须用MATMUL()将不同形状的矩阵相乘,结果并不是我所期望的……
下面是我的fortran代码:
integer, dimension(3,2) :: a
integer, dimension(2,2) :: b
integer :: i, j
a = reshape((/ 1, 1, 1, 1, 1, 1 /), shape(a))
b = MATMUL(a,TRANSPOSE(a))
do j = 1, 2
do i = 1, 2
print*, b(i, j)
end do
end do
朱莉娅()主页上的基准测试结果显示,在"rand_mat_mul“基准测试中,Fortran比Julia/Numpy慢约4倍。
我不明白为什么fortran在从同一个fortran库(BLAS)??调用时速度更慢。
我还对矩阵乘法进化的fortran、julia和numpy进行了简单的测试,得到了类似的结果:
朱莉娅
n = 1000; A = rand(n,n); B = rand(n,n);
@time C = A*B;
运行时间: 0.069577896秒(分配了7MB)
IPython中的Numpy
from numpy import *
n = 1000;
当我阅读tensorflow官方指南时,有一个例子显示了操作的显式设备布局。在这个例子中,为什么CPU执行的时间少于GPU?更常见的是,哪种操作在GPU上执行得更快?
import time
def time_matmul(x):
start = time.time()
for loop in range(10):
tf.matmul(x, x)
result = time.time()-start
print("10 loops: {:0.2f}ms".format(1000*result))
# Force execution on CPU
我有以下TensorFlow代码:
layer_1 = tf.add(tf.matmul(tf.cast(x, tf.float32), weights['h1']), biases['b1'])
但是抛出了以下错误:
ValueError: Shape must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul') with input shapes: [?,5741,20000], [20000,128].
它说x的形状是(?,5741,20000)。如何将x的形状转换为(57
我在学习神经网络。
下面是完整的代码:
当我转换特性时,我得到以下输出:
import torch
def activation(x):
return 1/(1+torch.exp(-x))
### Generate some data
torch.manual_seed(7) # Set the random seed so things are predictable
# Features are 5 random normal variables
features = torch.randn((1, 5))
# True weights for our data, rando
我在理解C编程语言给出的示例1.7时遇到了困难。本书将下面的程序描述为这样的程序:“由于C没有像Fortran中的**那样的求幂运算符,让我们通过编写一个函数的幂(m,n)来说明函数定义的机制。也就是说,幂(2,5)的值是32。这个函数不是一个实用的求幂例程,因为它只处理小整数的正幂,但对于说明来说已经足够了。”这是下面的C代码块:
#include <stdio.h>
int power(int m, int n); /*function prototype */
int main() {
/* test power function */
int i;
for(i = 0;
我有一个有输出神经元的神经网络,我想用训练过的权重进行线性缩放,然后再进行软匹配。
我有10个输出,我想要10个权重乘以每一个输出在输出是软最高。所以每输出一次重量。
但是我不断地得到错误的Shape must be rank 2 but is rank 1 for 'MatMul_2,它告诉我我的形状是[?,10], [10]
在我的代码
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.s
我刚刚开始学习Python/NumPy。我想写一个函数,它将应用一个具有2个输入和1个输出的操作,以及一个给定的权重矩阵,即两个形状为(2,1)的NumPy数组,并且应该使用tanh返回形状为(1,1)的NumPy数组。这是我想出来的: import numpy as np
def test_neural(inputs,weights):
result=np.matmul(inputs,weights)
print(result)
z = np.tanh(result)
return (z)
x = np.array([[1],[1]])
y = np.arr
我试图在fortran中优化以下类型的数组乘法:
do i = 1, n
do j = 1, n
do k = 1, n
do i1 = 1, n
do j1 = 1, n
do k1 = 1, n
B(k1,j1,i1) = B(k1,j1,i1) + &
A(k,j,i)*v1(k,k1)*v2(j,j1)*v3(i,i1)
enddo
enddo
当im试图使用tf.matmul将形状为41、22、512和512的两个矩阵相乘时,我得到以下错误:
ValueError: Shape must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul')
with input shapes: [41,22,512], [512]..
我通常认为这样的乘法输出一个形状为41,22,1或41,22的张量。
在学习完教程后,我正在尝试学习tensorflow,但我不想使用mnist数据库,所以我可以学习python中的数据库管理(我是新手,从c++/java到它是一个艰难的学习曲线)。
所以,这是我的代码。我尝试过打印形状、值和所有类型的东西,但似乎都不起作用。注意:如果x的形状为0,100,权重为100,0,matmul的误差就会消失,但结果的形状是0,0,并且不能添加到偏差中。我100%确定这是一个新手错误,但我将感谢您的任何帮助。提前谢谢。
import tensorflow as tf
import pandas as pd
data = pd.read_csv('trainin
稀疏张量与自身或稠密张量的乘法在TensorFlow中似乎不起作用。下面的示例
from __future__ import print_function
import tensorflow as tf
x = tf.constant([[1.0,2.0],
[3.0,4.0]])
y = tf.SparseTensor(indices=[[0,0],[1,1]], values=[1.0,1.0], shape=[2,2])
z = tf.matmul(x,y)
sess = tf.Session()
sess.run(tf.initialize_all
Tensorflow具有以下功能:
tf.matmul
它将两个向量相乘,并产生一个标量。
但是,我需要执行以下操作:
# dense dim: (?,227)
dense_part = tf.nn.relu(some stuff here)
# softmax matrix dim: (?,227,19) or (?,19,227) or (?,227,227), where I
# ....can slice the last dim down to (?,227,19)
softmax_matrix = tf.matmul(dense_part,softmax_weight_var