python - Keras model.fit() 给出 TypeError: 'NoneType' object is not callable
问题描述
我正在尝试用 Keras 来实现连体网络来实现一次性人脸识别模型。但是我遇到了一个我无法理解的错误,需要一些帮助。
我使用的模型是一个编码器模型,它接收(299,299,3)
图像(锚图像、正图像以及负图像)并输出1000
每个图像的维度编码向量。这类似于带有分类头的 InceptionV3 模型。我也在使用自定义的三元组损失函数。我的模型如下:
class SiameseNet(tf.keras.layers.Layer):
def __init__(self, model):
self.model = model # This is the image feature extraction model (similar to InceptionV3)
super().__init__()
def call(self, feat):
feats = self.model(feat[0])
nfeats = self.model(feat[1])
return [feats, nfeats]
损失函数如下
def triplet_loss(y_true, y_pred, alpha=1e-2):
return max(tf.reduce_sum((y_pred[0]-y_true)**2 - (y_pred[0]-y_pred[1])**2) + alpha, 0)
有三个名为images
(anchor images) 和negatives
(negative images) 的数组,它们都具有 shape (500,299,299,3)
(其中 500 是训练示例的数量)和positives
(正图像特征)具有 shape (500,1000)
。所有这些都是numpy数组。
我的型号代码如下图
image_input = tf.keras.layers.Input(shape=(299,299,3), name='image_input')
negative_input = tf.keras.layers.Input(shape=(299,299,3), name='negative_input')
siamese = SiameseNet(image_features_extract_model)([image_input, negative_input])
model = tf.keras.Model(inputs=[image_input, negative_input], outputs=siamese)
model.compile(optimizer=tf.keras.optimizers.Adam(), loss=triplet_loss, metrics=['accuracy'])
编译与输出正常工作
Model: "functional_3"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
image_input (InputLayer) [(None, 299, 299, 3) 0
__________________________________________________________________________________________________
negative_input (InputLayer) [(None, 299, 299, 3) 0
__________________________________________________________________________________________________
siamese_net (SiameseNet) [(None, 1000), (None 23851784 image_input[0][0]
negative_input[0][0]
==================================================================================================
Total params: 23,851,784
Trainable params: 23,817,352
Non-trainable params: 34,432
但是在运行时
model.fit([images, negatives], positives, epochs=10, batch_size=8, verbose=2)
我收到以下错误,我需要帮助
Epoch 1/10
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-16-83443f79d005> in <module>()
----> 1 model.fit([images, negatives], positives, epochs=10, batch_size=8, verbose=2)
2 # model.fit(train, epochs=10, verbose=2)
3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in _method_wrapper(self, *args, **kwargs)
106 def _method_wrapper(self, *args, **kwargs):
107 if not self._in_multi_worker_mode(): # pylint: disable=protected-access
--> 108 return method(self, *args, **kwargs)
109
110 # Running inside `run_distribute_coordinator` already.
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
1096 batch_size=batch_size):
1097 callbacks.on_train_batch_begin(step)
-> 1098 tmp_logs = train_function(iterator)
1099 if data_handler.should_sync:
1100 context.async_wait()
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
778 else:
779 compiler = "nonXla"
--> 780 result = self._call(*args, **kwds)
781
782 new_tracing_count = self._get_tracing_count()
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
805 # In this case we have created variables on the first call, so we run the
806 # defunned version which is guaranteed to never create variables.
--> 807 return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable
808 elif self._stateful_fn is not None:
809 # Release the lock early so that multiple threads can perform the call
TypeError: 'NoneType' object is not callable
我在 CPU 上运行 Google Colab 上的代码。
请帮我解决这个问题。谢谢。
解决方案
I would like to answer my own question here because the problem which I was facing was completely different and have been figured out later. The problem specific to my situation was caused because of the triplet_loss
function. The loss function expected computations in terms of Tensors while the code did computations in terms of Numpy Arrays. Changing this fixed the error for me and the code works great now.
The function implementation should have been
def triplet_loss(y_true, y_pred, alpha=0.2):
return tf.maximum(tf.reduce_sum((y_pred[0]-y_true)**2) - tf.reduce_sum((y_pred[0]-y_pred[1])**2)) + tf.constant(alpha), tf.constant(0.0))
and it worked for my case. No other changes were required.
P.S.: Here, alpha needs to be a bigger number than my previously chosen value of 1e-2
and the learning rate needs to be reduced to 1e-5
by using
optimizer = tf.keras.optimizers.Adam(lr=1e-5)
in model.compile()
.
推荐阅读
- java - Eclipse WindowBuilder 中是否有一种方法可以为一个窗口提供多个框架?
- html - 错误:ng:areq Bad Argument Argument 'blockGradeViewCtrl' 不是函数,在 Angularjs 中未定义
- c++ - c++ winrt uwp如何从依赖属性中获取值
- python - 计数停留在 7
- java - 安卓APK安装失败
- java - 如何添加每天的数量并在回收站视图中显示
- python-3.x - 类型错误:makeMove() 缺少 1 个必需的位置参数:'self'
- java - Java JDBC:无法将数据插入数据库
- android - 使用 http 协议在 webview ios 中加载本地文件。(在android和iOS中创建Webview服务器)
- c++ - 在 C++ 字符串中初始化的 char str[700]