简体   繁体   English

tf.tape.gradient() 为我的数值 function model 返回 None

[英]tf.tape.gradient() returns None for my numerical function model

I'm trying to use tf.GradientTape() .我正在尝试使用tf.GradientTape() But the problem is tape.gradient returns None , so that the error output ( TypeError: unsupported operand type(s) for *: 'float' and 'NoneType' ) popped up.但问题是tape.gradient返回None ,因此弹出错误 output ( TypeError: unsupported operand type(s) for *: 'float' and 'NoneType' )。 As you can see in my code, dloss_dparams = tape.gradient(Cost, [XX,YY]) returns none.正如您在我的代码中看到的那样, dloss_dparams = tape.gradient(Cost, [XX,YY])没有返回值。 I don't know What is the problem.我不知道有什么问题。 Does anyone why it behaves like this?有人为什么会这样吗?

import tensorflow as tf
import math
import numpy as np
from numpy import loadtxt
import scipy.integrate as inte
from numpy import asarray
from numpy import savetxt

DPA_l=7.68e+5 #Displacements/ion/cm
Na = 6.10e+22 # atomic density atoms/cm3
c=0.0424
S = math.pi*(0.05)**2
rmax=0.23#cm
rmin=-0.23
m=100
n=100
Ndpa =1
Ninitial=1
dx = (rmax-rmin)/m
dy = (rmax-rmin)/n

dfInd = loadtxt('intensity_2c_re2.csv', delimiter =',')
dfRi = loadtxt('p2c_t,ri,sd_re3.csv', delimiter =',')
Fnd = np.full((len(dfInd),m+1,n+1),np.nan)
DPAnd = np.full((len(dfInd),m+1,n+1),np.nan)
Lnd = np.full((len(dfInd),m+1,n+1),np.nan)

def I_V(bb):
    return 2.2e-8+bb*1e-9
def T_D(aa):
    return 7.9e-2 +aa*1e-3

Vnd = np.full((len(dfInd),m+1,n+1),np.nan)
And = np.full((len(dfInd),m+1,n+1),np.nan)
A2nd = np.full((len(dfInd),m+1,n+1),np.nan)
f_x = np.full((len(dfInd),1),np.nan)
f_y = np.full((len(dfInd),1),np.nan)
SSB = np.full((len(dfInd),1),0)
F0nd =np.full((len(dfInd),2),np.nan)

#initial value
for i in range(len(dfInd)): 
    F0nd[i,1] = (0.762*dfInd[i,2]*dfInd[i,0]/S)*0.1*np.sqrt(2)/(2*(np.sqrt(math.pi))*math.erf(1/(5*c*2**2.5))*c)
    F0nd[i,0]= dfInd[i,0]
 
f_x[0,0] = inte.quad(lambda x : np.math.exp((-(x-(rmax))**2)/(2*c**2)),0,rmax-rmin)[0]
f_y[0,0] = inte.quad(lambda y : np.exp((-(y-(rmax))**2)/(2*c**2)),0,rmax-rmin)[0]
F0nd[0,1] = (0.762*dfInd[0,2]*dfInd[1,0]/S)*0.1*math.sqrt(2)/(2*(math.sqrt(math.pi))*math.erf(1/(5*c*2**2.5))*c) ###추가 12/29
DPAnd[0,:,:] = 0
Lnd[0,:,:] = 0
Vnd[0,:,:] = 0

for j in range(m+1):
    for k in range(n+1):
        Fnd[0,j,k] = math.sqrt(F0nd[0,1])*np.math.exp(-(((j*dx-(rmax))**2)/(2*c**2)))*math.sqrt(F0nd[0,1])*np.exp(-(((k*dy-(rmax))**2)/(2*c**2)))
        And[0,j,k] = ((np.exp((-(j*dx-(rmax))**2)/(2*c**2))+np.exp((-((j+1)*dx-(rmax))**2)/(2*c**2)))*0.5*dx/f_x[0])*((np.exp((-(k*dy-(rmax))**2)/(2*c**2))+np.exp((-((k+1)*dy-(rmax))**2)/(2*c**2)))*0.5*dy/f_y[0])
        A2nd[0,j,k] = (1-Vnd[0,j,k])*And[0,j,k]


def predictions(XX,YY):
    i=0
    v=1
    aa=0.0
    bb=0.0
    
    f_x[i+1,0] = inte.quad(lambda x : np.exp((-(x-(rmax-XX))**2)/(2*c**2)),0,rmax-rmin)[0]  #f_x[1,0] #f_x[21,0]
    f_y[i+1,0] = inte.quad(lambda y : np.exp((-(y-(rmax-YY))**2)/(2*c**2)),0,rmax-rmin)[0]  #f_y[1,0] #f_y[21,0]
    for j in range(m+1):
        for k in range(n+1):
            Fnd[i+1,j,k] = F0nd[i+1,1]*np.exp(-(((j*dx-(rmax-XX))**2)/(2*c**2)))*np.exp(-(((k*dy-(rmax-YY))**2)/(2*c**2)))
            And[i+1,j,k] = ((np.exp((-(j*dx-(rmax-XX))**2)/(2*c**2))+np.exp((-((j+1)*dx-(rmax-XX))**2)/(2*c**2)))*0.5*dx/f_x[i+1])*((np.exp((-(k*dy-(rmax-YY))**2)/(2*c**2))+np.exp((-((k+1)*dy-(rmax-YY))**2)/(2*c**2)))*0.5*dy/f_y[i+1])
            DPAnd[i+1,j,k] = DPAnd[i,j,k] + DPA_l*Fnd[i,j,k]/Na
                
            if  DPAnd[i+1,j,k] < T_D(aa) :
                Lnd[i+1,j,k] = DPAnd[i+1,j,k]/(T_D(aa))
            elif DPAnd[i+1,j,k]>=T_D(aa) :
                Lnd[i+1,j,k] = 1.0
                    
            if Lnd[i+1,j,k]<1:
                A2nd[i+1,j,k] = (1.0-Lnd[i+1,j,k])*And[i+1,j,k]*0.79 + 1.0*And[i+1,j,k]*0.21
            elif Lnd[i+1,j,k]==1.0:
                A2nd[i+1,j,k] = (1.0-Lnd[i+1,j,k])*And[i+1,j,k]
                    
    SSB = I_V(bb)*(((A2nd).sum(axis=2)).sum(axis=1))
    loss = (SSB[v]-dfRi[v-1,1])
    return loss


XX = tf.Variable(0.1)
YY = tf.Variable(0.1)
learning_rate = 0.01
for j in range(100):
    with tf.GradientTape() as tape:
        tape.watch([XX,YY])
        Cost = tf.reduce_mean(tf.square(predictions(XX,YY)))
        print('Cost=',Cost)
    dloss_dparams = tape.gradient(Cost, [XX,YY])
    print('dloss_dparams[0] =',dloss_dparams[0],', dloss_dparams[1] =',dloss_dparams[1])
    XX.assign_sub(learning_rate * dloss_dparams[0])
    YY.aasign_sub(learning_rate * dloss_dparams[1])

    if i%10 ==0 :
        print("{:5} I {:10.4f} I {:10.4} I {:10.6f}".format(i, XX.numpy(), YY.numpy(), cost))    

output is that output 是那个

Cost= tf.Tensor(2.803658208007937e-17, shape=(), dtype=float64)
dloss_dparams[0] = None , dloss_dparams[1] = None
Traceback (most recent call last):
File "C:/Users/USER/Downloads/tensorflow_gradient descent14.py", line 103, in <module>
XX.assign_sub(learning_rate * dloss_dparams[0])
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'

the relation plot with Variables(XX,YY) and Cost is below, just in case. plot 与变量(XX,YY)和成本的关系如下,以防万一。 在此处输入图像描述

You are doing calculations outside of TensorFlow.您正在 TensorFlow 之外进行计算。 That will result in a gradient of None, see the guide: Getting a gradient of None这将导致无梯度,请参阅指南: 获取无梯度

The tape can't record the gradient path if the calculation exits TensorFlow.如果计算退出 TensorFlow,磁带将无法记录梯度路径。 For example:例如:

 x = tf.Variable([[1.0, 2.0], [3.0, 4.0]], dtype=tf.float32) with tf.GradientTape() as tape: x2 = x**2 # This step is calculated with NumPy y = np.mean(x2, axis=0) # Like most ops, reduce_mean will cast the NumPy array to a constant tensor # using `tf.convert_to_tensor`. y = tf.reduce_mean(y, axis=0) print(tape.gradient(y, x))

will print将打印

None没有任何

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM