Python代码转MATLAB常见问题(深度学习)

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);