我实现了具有多个批处理归一化层的模型。
然后,在使用tensorflow.map_fn
的MAML实现(https://arxiv.org/pdf/1703.03400.pdf)中调用此模型。
运行代码会产生以下错误:
TypeError: Incompatible types: <dtype: 'resource'> vs. int64. Value is 0
。
一种可能的解决方案是将批处理规范化层包装在tf.keras.layers.TimeDistributed
中,但是由于我将其用于MAML实现,即不同的步骤不是时间步骤,而是不同的任务,因此我不确定这是否是正确的方法。
这是显示问题的更简单的代码摘录(不是完整的MAML实现)
import tensorflow as tf
from tensorflow import keras
mod_l1 = keras.layers.Input(shape=(10,10,3),dtype=tf.float32)
mod_l2 = keras.layers.Conv2D(
10,(2,2),strides=2,padding='valid',data_format='channels_last',activation=None,use_bias=True
)
mod_l3 = keras.layers.BatchNormalization()
mod_l4 = keras.layers.Dense(3)
mod_out = mod_l2(mod_l1)
mod_out = mod_l3(mod_out)
mod_out = mod_l4(mod_out)
mod = keras.Model(inputs=mod_l1,outputs=mod_out)
def bla(my_in):
in1,curr_labels = my_in
loss = keras.losses.categorical_crossentropy(
mod4(in1),curr_labels,from_logits=False,label_smoothing=0
)
return tf.reduce_mean(loss)
bla_out = tf.map_fn(
bla,[
tf.placeholder(shape=(None,None,dtype=tf.float32),tf.placeholder(shape=(None,dtype=tf.float32)
],tf.float32
)
opt = tf.train.AdamOptimizer()
loss = tf.reduce_sum(bla_out)
train = opt.minimize(loss,var_list=mod.trainable_weights)
您是否有避免此错误消息的建议,或者仅使用TimeDistributed
是正确的方法?
谢谢。