Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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
Python &引用;层未连接,没有要返回的输入;尝试使用tensorflow自定义回调获取中间层预测时出错_Python_Tensorflow_Keras - Fatal编程技术网

Python &引用;层未连接,没有要返回的输入;尝试使用tensorflow自定义回调获取中间层预测时出错

Python &引用;层未连接,没有要返回的输入;尝试使用tensorflow自定义回调获取中间层预测时出错,python,tensorflow,keras,Python,Tensorflow,Keras,我尝试在训练期间使用自定义回调访问模型中间层的预测。下面的实际代码的精简版本演示了这个问题 import tensorflow as tf import numpy as np class Model(tf.keras.Model): def __init__(self, input_shape=None, name="cus_model", **kwargs): super(Model, self).__init__(name=name, **kw

我尝试在训练期间使用自定义回调访问模型中间层的预测。下面的实际代码的精简版本演示了这个问题

import tensorflow as tf
import numpy as np

class Model(tf.keras.Model):
    def __init__(self, input_shape=None, name="cus_model", **kwargs):
        super(Model, self).__init__(name=name, **kwargs)
        
    def build(self, input_shape):
        self.dense1 = tf.keras.layers.Dense(input_shape=input_shape, units=32)
        
    def call(self, input_tensor):
        return self.dense1(input_tensor)

class CustomCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        get_output = tf.keras.backend.function(
            inputs = self.model.layers[0].input,
            outputs = self.model.layers[0].output
        )
        print("Layer output: ",get_output.outputs)

X = np.ones((8,16))
y = np.sum(X, axis=1)

model = Model()
model.compile(optimizer='adam',loss='mean_squared_error', metrics='accuracy')
model.fit(X,y, epochs=8, callbacks=[CustomCallback()])
回调是按照本文中的建议编写的。获取以下错误:

<ipython-input-3-635fd53dbffc> in on_epoch_end(self, epoch, logs)
     12     def on_epoch_end(self, epoch, logs=None):
     13         get_output = tf.keras.backend.function(
---> 14             inputs = self.model.layers[0].input,
     15             outputs = self.model.layers[0].output
     16         )
.
.
AttributeError: Layer dense is not connected, no input to return.
in on_epoch_end(self、epoch、logs)
12个def在epoch结束时(self、epoch、logs=None):
13 get_output=tf.keras.backend.function(
--->14输入=self.model.layers[0]。输入,
15个输出=self.model.layers[0]。输出
16         )
.
.
AttributeError:层未连接,没有要返回的输入。

这是什么原因造成的?如何解决此问题?

我运行此命令没有问题:

import tensorflow as tf
import numpy as np

X = np.ones((8,16))
y = np.sum(X, axis=1)


class CustomCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        get_output = tf.keras.backend.function(
            inputs = self.model.layers[0].input,
            outputs = self.model.layers[1].output # return output of first dense
        )
        print("\nLayer output: ", get_output(X))


inp = tf.keras.layers.Input((16,))
dense1 = tf.keras.layers.Dense(units=32)(inp)
dense2 = tf.keras.layers.Dense(units=20)(dense1)
model = tf.keras.Model(inp, dense2)

model.compile(optimizer='adam',loss='mean_squared_error', metrics='accuracy')
model.fit(X,y, epochs=8, callbacks=[CustomCallback()])

我也无法获取
self.layers[0]。由于相同的错误,输入
,但是您可以直接调用
Model
中定义的函数,如下所示:

class Model(tf.keras.Model):
    def __init__(self, input_shape=None, name="cus_model", **kwargs):
        super(Model, self).__init__(name=name, **kwargs)
        if not input_shape:
            input_shape = (10,)
        self.dense1 = tf.keras.layers.Dense(input_shape=input_shape, units=32)
        self.dev_dataset = np.ones((8,16))

    def call(self, input_tensor):
        return self.dense1(input_tensor)


class CustomCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        self.model.call(self.model.dev_dataset)


X = np.ones((8,16))
y = np.sum(X, axis=1)

model = Model()
model.compile(optimizer='adam',loss='mean_squared_error', metrics='accuracy')
model.fit(X,y, epochs=1, callbacks=[CustomCallback()])

我猜函数API和子类化
tf.keras.Model
之间有一些区别。重写
密集的
也是必要的。至少,它现在起作用了。任何知道原因的人请解释

将tensorflow导入为tf
将numpy作为np导入
类别模型(tf.keras.Model):
定义初始化(self,输入=None,name=“cus_model”,**kwargs):
超级(模型,自我)。\uuuuu初始(名称=名称,**kwargs)
自我输入=输入
自输出尺寸=8
def构建(自我,输入_形状):
#tf.keras.layers.Dense(输入形状=输入形状,单位=32)
self.dense1=self.add_weight(name='weight'u vector',shape=(input_shape[1],self.output_dim),
初始值设定项class='glorot_uniform',可训练=True,
正则化器=无)
def调用(自、输入张量):
返回tf.matmul(self.dense1,输入张量)
类CustomCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self、epoch、logs=None):
get_output=tf.keras.backend.function(
输入=self.model.layers[0]。输入,
输出=self.model.layers[0]。输出
)
打印(“图层输出:”,获取输出。输出)
X=np.一((10,8,16))
y=np.和(X,轴=1)
打印(X形、y形)
inp=tf.keras.layers.inp输入((8,16))
模型=模型(inp)
#compile(优化器='adam',loss='mean_squared_error',metrics='accurity')
#fit(X,y,epochs=8,callbacks=[CustomCallback()])
优化器=tf.keras.optimizers.Adam(学习率=0.001)
loss\u fn=tf.keras.loss.BinaryCrossentropy(from\u logits=False)
对于范围内的i(X.shape[0]):
使用tf.GradientTape()作为磁带:
out=模型(X[i,:])
label=tf.cast(y[i],dtype=tf.float32)
损耗=损耗\u fn(标签,外)
梯度=胶带.梯度(损失,模型.可训练重量)
优化器。应用梯度(zip(梯度、模型、可训练的权重))
打印(“步骤:,i,“丢失:,loss.numpy())

由@Marco Cerliani提出的功能性方法似乎很好,但我想知道问题中提出的子分类方法有什么问题。