Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 没有为任何可变/自定义损失提供梯度_Tensorflow_Keras_Neural Network_Gradient_Loss Function - Fatal编程技术网

Tensorflow 没有为任何可变/自定义损失提供梯度

Tensorflow 没有为任何可变/自定义损失提供梯度,tensorflow,keras,neural-network,gradient,loss-function,Tensorflow,Keras,Neural Network,Gradient,Loss Function,好的,我正在尝试实现我在一篇论文中读到的这个自定义丢失,这是我的第一个自定义丢失,所以我可能遗漏了一些明显的东西,但是我得到了如下所示的错误。从其他帖子中,我推测我的损失张量可能与其他tf变量“分离”了?但我仍然无法修复它。有什么想法吗?谢谢 将numpy导入为np 导入tensorflow作为tf 从tensorflow进口keras 从tensorflow.keras导入图层 从keras.utils.vis_utils导入plot_模型 输入数学 #填充数组 输入_padding_cat

好的,我正在尝试实现我在一篇论文中读到的这个自定义丢失,这是我的第一个自定义丢失,所以我可能遗漏了一些明显的东西,但是我得到了如下所示的错误。从其他帖子中,我推测我的损失张量可能与其他tf变量“分离”了?但我仍然无法修复它。有什么想法吗?谢谢

将numpy导入为np
导入tensorflow作为tf
从tensorflow进口keras
从tensorflow.keras导入图层
从keras.utils.vis_utils导入plot_模型
输入数学
#填充数组
输入_padding_categories=[[0表示范围内的i(38)]表示范围内的j(42)]
输出_padding=[0表示范围(19)中的i]
#用于测试的随机数据生成
随机输入
数据大小=7537
输入=[[[random.randint(0,1)表示范围(38)中的i]表示范围(42)中的j]表示范围(数据大小)]
打印(“输入图形”)
打印(透镜(输入))
打印(len(输入[0]))
打印(len(输入[0][0]))
输出=[[random.randint(0,1)表示范围内的i(19)]表示范围内的j(数据大小)]
打印(“输出图形”)
打印(镜头(输出))
打印(len(输出[0]))
批次=32
时间步长=42
训练单位=0.85
切割点=整数(长度(输入)*训练单位)
x_序列,x_测试=输入[:切割点],输入[切割点:]
y_序列,y_测试=输出[:切割点],输出[切割点:]
温度=0
当温度
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.utils.vis_utils import plot_model
import math

#padding arrays
input_padding_categories = [[0 for i in range(38)] for j in range(42)]
output_padding = [0 for i in range(19)]

# random data generation for testing
import random
data_size = 7537

inputs = [[[random.randint(0, 1) for i in range(38)] for j in range(42)] for k in range(data_size)]
print("inputs_gen shape")
print(len(inputs))
print(len(inputs[0]))
print(len(inputs[0][0]))

outputs = [[random.randint(0, 1) for i in range(19)] for j in range(data_size)]
print("outputs_gen shape")
print(len(outputs))
print(len(outputs[0]))

batch = 32
timesteps = 42
training_units = 0.85

cutting_point = int(len(inputs)*training_units)
x_train, x_test = inputs[:cutting_point], inputs[cutting_point:]
y_train, y_test = outputs[:cutting_point], outputs[cutting_point:]

temp = 0
while temp < len(x_train):
    temp += 32
while len(x_train) < temp:
    x_train.append(input_padding_categories)
    y_train.append(output_padding)
temp = 0
while temp < len(x_test):
    temp += 32
while len(x_test) < temp:
    x_test.append(input_padding_categories)
    y_test.append(output_padding)
x_train = np.array(x_train)
x_test = np.array(x_test)
y_train = np.array(y_train)
y_test = np.array(y_test)

def custom_loss_comprende(y, yhat):
    loss = [0.0 for i in range(y.shape[0])]
    for i in range(y.shape[0]):
        loss[i] -= np.dot(y[i] , [math.log(z,10) for z in [x + 1/10**9 for x in yhat[i]]])
        loss[i] -= np.dot([1 + x for x in y[i]] , [math.log(z,10) for z in [1 - x + 1/10**9 for x in yhat[i]]])
    loss = tf.convert_to_tensor(loss)
    return loss

input_layer = keras.Input(shape=(timesteps,38),batch_size=batch)
hidden_layer_1 = layers.LSTM(units=150, batch_input_shape=(batch,timesteps,42) , activation="sigmoid", return_sequences=True)(input_layer)
hidden_layer_2 = layers.LSTM(150, activation="sigmoid", return_sequences=False)(hidden_layer_1)
output_layer = layers.Dense(19, activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model")
model.summary()
plot_model(model, show_shapes=True, show_layer_names=True)

model.compile(
    loss=custom_loss_comprende,
    optimizer=keras.optimizers.Adam(),
    metrics=["accuracy"],
    run_eagerly=True
)

h = model.fit(x_train, y_train, epochs=20, validation_data=(x_test, y_test), shuffle=True)