Python代码转MATLAB常见问题(深度学习)
在师哥师姐的帮助下刚完成了导师安排的一个任务,即用Python的keras深度学习框架完成的Unet网络代码转为MATLAB去实现,不能用MATLAB去调用Python里的包,所以说网络的底层都需要自己去实现,比如一维卷积层,一维池化层以及上采样层,还要加载训练好的网络参数等等,在实现过程中遇到的一些问题,拿出来写一写。
(看完有问题的小伙伴随时联系随时更新奥~)
- reshape函数 ,这个是遇到最苟的问题,一直没想到是reshape函数出了问题
MATLAB中 的reshape函数是按照列的顺序进行读取转换的,也就是第一列读完,读第二列,如下面例子即依次读取 a 的每一列数据,存的时候也是按列进行存放,按顺序依次存放到目标矩阵的每一列得到 b ,也就是所谓的 按列读取按列存放 。
a = [1:6]
b = reshape(a, 2, 3)
c = reshape(a, 3, 2)
反观 Python 中的reshape函数,这里以numpy的reshape示例,与MATLAB相反,它是 按行读取按行存放 的,这是很容易出错的地方,使用的时候一定要注意!
import numpy as np
a = np.linspace(1,6,6)
b = np.reshape(a, [2, 3])
c = np.reshape(a, [3, 2])
print('a = \n', a)
print('b = \n', b)
print('c = \n', c)
Tips:无论用哪种语言的reshape,在使用时都要注意 数据维度问题 奥,维度不匹配也会出现错误,如果不确定维度或者懒得去想可以用以下方式解决:
MATLAB:
b = reshape(a, 3, []) % 未知维度用中括号顶替,结果是一样的,会自动补齐维度
c = reshape(a, [], 2)
Python:
b = np.reshape(a, [3, -1]) # 未知维度参数设为-1,reshape结果也是一样的
print('b = \n', b)
c = np.reshape(a, [-1, 2])
print('c = \n', c)
如果想让俩种语言实现效果一致,比如用MATLAB实现的Python的reshape,可以通过先用reshape得到原目标矩阵的转置矩阵,然后再求转置:
a = [1:6]
b = reshape(a, 2, 3)
b = b' % 此时b为目标矩阵,维度为3*2,与上述Python结果一致
- 索引问题
这个算比较常见的,MATLAB的索引是从1开始的,而Python的索引是从0开始的:
MATLAB:
a = [1:6]
b = a(1)
Python:
import numpy as np
a = np.linspace(1,6,6)
b = a[1]
print('a = \n', a)
print('b = \n', b)
可以看出取出a[1]的数据,但MATLAB取的是数组里的第一个数,而python取的是第二个数,这便是索引起始位置不同引起的差异。
看一下两种代码 获取相同数据 的即视感:
MATLAB:
seg_len = floor(test_flat(i)/sig_length);
for j = 1:seg_len
label = tmp_states((j-1)*sig_length+1:j*sig_length);