.mat转成传入cascade网络的形式
首先配置文件不能少config.yaml
# Model Parameters
network:
num_cascades: 6
num_layers: 5 # Number of layers in the CNN per cascade
num_filters: 64
kernel_size: 3
stride: 1
padding: 1 #A padding of 1 is needed to keep the image in the same size
noise: null #Noise in the measurements. To be used in the data consistency step
#Dataset parameters
dataset:
data_path: 'data1/'
acceleration_factor: 4.0
fraction: 0.8 #train set size
shuffle: 3 #Seed for numpy random generator
sample_n: 10
acq_noise: 0 #acquisation noise
centred: False
norm: 'ortho' #norm: 'ortho' or null. if 'ortho', performs unitary transform, otherwise normal dft
# Training parameters
train:
batch_size: 1
num_epochs: 5
early_stop: 100
# Adam Optimizer Parameters
learning_rate: 0.001
b_1: 0.9
b_2: 0.999
l2: 0.0000001
# Miscellaneous
output_path: 'logs'
cuda: False
单步执行
import os
import torch
import numpy as np
from math import ceil
from helpers_1 import *
from scipy.io import loadmat
from numpy.lib.stride_tricks import as_strided
import yaml
args = yaml.load(open('config.yaml', 'r'), Loader=yaml.FullLoader)
dataset = OCMRDataset(fold=‘train’, **args[‘dataset’])
self.evalset = evalset
self.data_path = data_path
self.acc = acceleration_factor
self.sample_n = sample_n
self.noise = acq_noise
self.centred = centred
self.norm = norm
self.files = os.listdir(self.data_path)
if shuffle: # shuffle=None
np.random.seed(shuffle)
np.random.shuffle(self.files)
if fold == 'train':
self.files = self.files[:int(len(self.files) * fraction)]
def __getitem__(self, idx):
if self.evalset and idx == 0: # evalset=False
np.random.seed(9001)
data = loadmat(os.path.join(self.data_path, self.files[idx]))['xn'] * 1e3
plt.imshow(np.abs(data))
import scipy.io as scio
import matplotlib.pyplot as plt
path_mat = 'data1/fs_0050_1_5T_0_0.mat'
data_mat = scio.loadmat(path_mat)
plt.imshow(np.abs(data_mat['xn']))
plt.show()
‘full’: data_gnd
data = np.expand_dims(data, 0) #扩展维度,np.expand_dims(a,axis=)即在 a 的相应的axis轴上扩展维度
data_gnd = format_data(data)
def format_data(data, mask=False):
if mask:
data = data * (1+1j)
data = complex2real(data)
def complex2real(x):
x_real = np.real(x) #np.real取实部数值
plt.imshow(x_real[0,:,:],cmap=‘Greys’)
x_imag = np.imag(x) # np.imag取虚步数值
plt.imshow(x_imag[0,:,:],cmap=‘Greys’)
y = np.array([x_real, x_imag]).astype(np.float)
if x.ndim >= 3: # x.ndim=3
y = y.swapaxes(0, 1)
return y
def format_data(data, mask=False):
data = complex2real(data)
return data.squeeze(0) #将数组中维度0移除
data_gnd = data.squeeze(0) #2代表频域数据的实部和虚部, 图片的宽高(256 x 256)
‘mask’: mask.transpose(1,2,0)
mask = self.cartesian_mask(data.shape)
def cartesian_mask(self, shape):
N, Nx, Ny = int(np.prod(shape[:-2])), shape[-2], shape[-1]
pdf_x = normal_pdf(Nx, 0.5/(Nx/10.)**2)
shape[:-2]为(1, 256),shape[:-2]为(1,)
np.prod为sum操作
pdf_x:
def normal_pdf(length, sensitivity):
return np.exp(-sensitivity * (np.arange(length) - length / 2)**2)
lmda = Nx/(2.*self.acc) # self.acc = acceleration_factor=4.0, lmda=32
n_lines = int(Nx / self.acc) # 64
# add uniform distribution
pdf_x += lmda * 1./Nx
pdf_x:
if self.sample_n: # sample_n=10
pdf_x[Nx//2-self.sample_n//2:Nx//2+self.sample_n//2] = 0 #pdf_x[123:133]
pdf_x /= np.sum(pdf_x)
n_lines -= self.sample_n #54
pdf_x:
mask = np.zeros((N, Nx))
for i in range(N):
#numpy.random.choice(a, size=None, replace=True, p=None)
#从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
#replace:True表示可以取相同数字,False表示不可以取相同数字
#数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。
idx = np.random.choice(Nx, n_lines, False, pdf_x)
mask[i, idx] = 1
if self.sample_n:
mask[:, Nx//2-self.sample_n//2:Nx//2+self.sample_n//2] = 1 # [123:133] shape(1, 256)
未执行=1时:
执行=1后:
size = mask.itemsize # 8 float64
mask = as_strided(mask, (N, Nx, Ny), (size * Nx, size, 0)) # (1, 256, 256)
plt.imshow(mask[0,:,:],cmap=‘Greys’)
mask = mask.reshape(shape) #(1, 256, 256)
reshape之后可视化条形图没变化
if not self.centred:
mask = ifftshift(mask, axes=(-1, -2))
return mask
plt.imshow(mask[0,:,:],cmap=‘Greys’)
#这句要放到最后,否则后面代码assert x.shape == mask.shape会报错
mask = format_data(mask, mask=True)
def format_data(data, mask=False):
if mask:
data = data * (1+1j)
data = complex2real(data)
return data.squeeze(0)
def complex2real(x):
x_real = np.real(x)
x_imag = np.imag(x)
y = np.array([x_real, x_imag]).astype(np.float)
# re-order in convenient order
if x.ndim >= 3:
y = y.swapaxes(0, 1)
return y
data = complex2real(data)即等于y
mask = data.squeeze(0)
图是一样的, 因为mask * (1+1j),这样实部和虚部数值一样
‘image’&‘k’:首先准备data_und, k_und
data_und, k_und = self.undersample(data, mask)
assert x.shape == mask.shape
# zero mean complex Gaussian noise
noise_power = self.noise # 0
nz = np.sqrt(.5)*(np.random.normal(0, 1, x.shape) + 1j * np.random.normal(0, 1, x.shape)) # nz.shape(1, 256, 256),x.shape(1, 256, 256)
nz = nz * np.sqrt(noise_power)
nz:
nz的可视化图是空白的,因为noise_power=0,所以min、max都是0j
if self.norm == 'ortho':
# multiplicative factor
nz = nz * np.sqrt(np.prod(mask.shape[-2:])) #mask.shape[-2:]:(256, 256), np.prod():65536, np.sqrt():256.0
nz可视化图是空白的,因为上一个nz=0,相乘=0
if self.centred: # centred=False
x_f = fft2c(x, norm=self.norm)
x_fu = mask * (x_f + nz)
x_u = ifft2c(x_fu, norm=self.norm)
return x_u, x_fu
else:
x_f = fft2(x, norm=self.norm) # norm='ortho'
x_fu = mask * (x_f + nz)
x_u = ifft2(x_fu, norm=self.norm)
return x_u, x_fu
plt.imshow(np.log(np.abs(x_f[0,:,:])+1e-7),cmap=‘Greys’)
plt.imshow(np.log(np.abs(x_fu[0,:,:])+1e-7),cmap=‘Greys’)
data_und, k_und = x_u, x_fu
plt.imshow(np.abs(x_u[0,:,:]),cmap=‘Greys’)
plt.imshow(np.abs(data[0,:,:]),cmap=‘Greys’)
上面的流程总结如下:
‘image’: data_und
data_und = format_data(data_und)
def format_data(data, mask=False):
data = complex2real(data)
return data.squeeze(0)
def complex2real(x):
x_real = np.real(x)
x_imag = np.imag(x)
y = np.array([x_real, x_imag]).astype(np.float)
# re-order in convenient order
if x.ndim >= 3:
y = y.swapaxes(0, 1) #由(2,1,256,256)变(1,2,256,256)
return y
data = complex2real(data)即等于y
plt.imshow(x_real[0,:,:],cmap=‘Greys’)
plt.imshow(x_imag[0,:,:],cmap=‘Greys’)
data_und = data.squeeze(0)
‘k’: k_und.transpose(1,2,0)
k_und = format_data(k_und)
def format_data(data, mask=False):
data = complex2real(data)
return data.squeeze(0)
def complex2real(x):
x_real = np.real(x)
x_imag = np.imag(x)
y = np.array([x_real, x_imag]).astype(np.float)
# re-order in convenient order
if x.ndim >= 3:
y = y.swapaxes(0, 1)
return y
plt.imshow(x_real[0,:,:],cmap=‘Greys’)
plt.imshow(x_imag[0,:,:],cmap=‘Greys’)
k_und = data.squeeze(0)
return {
'image': data_und,
'k': k_und.transpose(1,2,0),
'mask': mask.transpose(1,2,0),
'full': data_gnd
}
sample = dataset[0]即4个tensor
第一个tensor。‘image’: data_und
第二个tensor。‘k’: k_und.transpose(1,2,0)
第三个tensor。‘mask’: mask.transpose(1,2,0)
第四个tensor。‘full’: data_gnd
输出:
Sample image shape: (2, 256, 256)
Sample full shape: (2, 256, 256)