def loss(theta1, theta2, angles_rad, phase_rad, TE, TR): T = len(angles_rad) x1 = epg.FSE_signal( angles_rad, phase_rad, TE, theta1['T1'], theta1['T2']) * (1 - exp(-(TR - T * TE) / theta1['T1'])) x2 = epg.FSE_signal( angles_rad, phase_rad, TE, theta2['T1'], theta2['T2']) * (1 - exp(-(TR - T * TE) / theta2['T1'])) return 0.5 * np.linalg.norm(x1, ord=2)**2 + 0.5 * np.linalg.norm( x2, ord=2)**2 - 0.5 * np.vdot(x1.ravel(), x2.ravel()) - 0.5 * np.vdot( x2.ravel(), x1.ravel())
def normalized_loss(theta1, theta2, angles_rad, phase_rad, TE, TR): T = len(angles_rad) x1 = epg.FSE_signal( angles_rad, phase_rad, TE, theta1['T1'], theta1['T2']) * (1 - exp(-(TR - T * TE) / theta1['T1'])) x2 = epg.FSE_signal( angles_rad, phase_rad, TE, theta2['T1'], theta2['T2']) * (1 - exp(-(TR - T * TE) / theta2['T1'])) x1 = x1 / np.linalg.norm(x1, ord=2) x2 = x2 / np.linalg.norm(x2, ord=2) return -0.5 * (np.vdot(x1.ravel(), x2.ravel()) + np.vdot(x2.ravel(), x1.ravel()))
def loss_prime(theta1, theta2, angles_rad, phase_rad, TE, TR, excitation_dict=None, inversion_dict=None): T = len(angles_rad) x1 = epg.FSE_signal(angles_rad, phase_rad, TE, theta1['T1'], theta1['T2'], excitation_dict=excitation_dict, inversion_dict=inversion_dict).ravel() * ( 1 - exp(-(TR - T * TE) / theta1['T1'])) x2 = epg.FSE_signal(angles_rad, phase_rad, TE, theta2['T1'], theta2['T2'], excitation_dict=excitation_dict, inversion_dict=inversion_dict).ravel() * ( 1 - exp(-(TR - T * TE) / theta1['T1'])) T = len(angles_rad) alpha_prime = np.zeros((T, )) angle_e_prime = 0. angle_TI_prime = 0. for i in range(T): x1_prime = sig_prime_i(theta1, angles_rad, phase_rad, i).ravel() * ( 1 - exp(-(TR - T * TE) / theta1['T1'])) x2_prime = sig_prime_i(theta2, angles_rad, phase_rad, i).ravel() * ( 1 - exp(-(TR - T * TE) / theta2['T1'])) M1 = 0.5 * (np.vdot(x1, x1_prime) + np.vdot(x1_prime, x1)) M2 = 0.5 * (np.vdot(x2, x2_prime) + np.vdot(x2_prime, x2)) M3 = 0.5 * (np.vdot(x2_prime, x1) + np.vdot(x1, x2_prime)) M4 = 0.5 * (np.vdot(x1_prime, x2) + np.vdot(x2, x1_prime)) alpha_prime[i] = np.real(M1 + M2 - M3 - M4) return alpha_prime
def plot_vals(self, thetas): plt.subplot(2, 1, 1) plt.plot(range(self.T), RAD2DEG(self.angles_rad), 'o-') plt.xlim((0, self.T)) plt.subplot(2, 1, 2) for theta in thetas: plt.plot( range(self.T), epg.FSE_signal(self.angles_rad, self.phase_rad, self.TE, theta['T1'], theta['T2'])) plt.xlim((0, self.T)) plt.ylim((0, 1))
def forward(self, theta): return epg.FSE_signal(self.angles_rad, self.phase_rad, TE, theta['T1'], theta['T2']).ravel()
angles = 150 * np.ones((T, )) angles = read_angles('../data/flipangles.txt.408183520') TT = len(angles) if TT < T: T = TT else: angles = angles[:T] phases = np.zeros(angles.shape) angles_rad = DEG2RAD(angles) phase_rad = DEG2RAD(phases) S = epg.FSE_signal(angles_rad, phase_rad, TE, T1, T2) S2 = abs(S) theta1 = {'T1': 1000e-3, 'T2': 20e-3} theta2 = {'T1': 1000e-3, 'T2': 100e-3} t1 = time.time() NG = numerical_gradient(theta1, theta2, angles_rad, phase_rad, TE, TR) t2 = time.time() LP = loss_prime(theta1, theta2, angles_rad, phase_rad, TE, TR) t3 = time.time() NG_time = t2 - t1 LP_time = t3 - t2 print 'Numerical Gradient\t(%03.3f s)\t' % NG_time, NG