Python 未在具有costum层的分销策略范围内创建变量
我正试图用TPU在Google colaboratory上微调一个伯特模型。但我总是会遇到以下错误: ValueError:变量(tf.Variable'bert_layer_module/bert/encoder/layer_10/attention/output/LayerNorm/beta:0'shape=(768,)dtype=float32)未在(0x7F6A1FAD390处的tensorflow.python.distribute.tpu_strategy.TPUStrategyV1对象)的分发策略范围内创建。 这很可能是因为并非所有层或模型或优化器都是在分发策略范围之外创建的。尝试确保您的代码与以下代码类似 使用strategy.scope(): 模型=_创建_模型() model.compile(…) 我的代码是基于!我针对我的具体问题修改了它,显然我试图在TPU上运行它 我有一个肋骨层,显然是在范围之外创建的:Python 未在具有costum层的分销策略范围内创建变量,python,tensorflow,keras,google-colaboratory,tpu,Python,Tensorflow,Keras,Google Colaboratory,Tpu,我正试图用TPU在Google colaboratory上微调一个伯特模型。但我总是会遇到以下错误: ValueError:变量(tf.Variable'bert_layer_module/bert/encoder/layer_10/attention/output/LayerNorm/beta:0'shape=(768,)dtype=float32)未在(0x7F6A1FAD390处的tensorflow.python.distribute.tpu_strategy.TPUStrategyV1
class-BertLayer(tf.keras.layers.Layer):
定义初始层(自、n微调层=10,**kwargs):
self.n_fine_tune_layers=n_fine_tune_layers
self.trainable=True
self.output_size=768
超级(BertLayer,self)。\uuuuu初始值(**kwargs)
def构建(自我,输入_形状):
self.bert=hub.Module(
贝特路,
可培训=可自我培训,
name=“{}\u模块”。格式(self.name)
)
可训练变量=self.bert.variables
#删除未使用的层
可培训变量=[可培训变量中变量的变量,如果不是“/cls/”在var.name中]
#选择要微调的层数
可训练变量=可训练变量[-self.n\u微调层:]
#增加可训练重量
对于可培训变量中的变量:
自身可训练重量附加(var)
#添加不可训练的权重
对于self.bert.variables中的var:
如果var不在自身可训练重量中:
自身重量。非可训练重量。附加(var)
超级(BertLayer,self).构建(输入_形状)
def呼叫(自我,输入):
输入=[K.cast(x,dtype=“int32”)表示输入中的x]
输入标识、输入屏蔽、段标识=输入
bert_输入=dict(
输入标识=输入标识,输入标识=输入标识,段标识=段标识
)
结果=self.bert(输入=bert\u输入,签名=“令牌”,如\u dict=True)[
“合并的_输出”
]
返回结果
def计算输出形状(自身、输入形状):
返回(输入形状[0],自输出大小)
模型创建在此处完成:
def构建模型(最大长度):
输出\u类=列\u标签[0]。形状
#构建模型
in_id=tf.keras.layers.Input(shape=(max_seq_length),name=“Input_id”)
in_mask=tf.keras.layers.Input(shape=(max_seq_length),name=“Input_masks”)
in_segment=tf.keras.layers.Input(shape=(max_seq_length),name=“segment_id”)
bert_输入=[在_id中,在_掩码中,在_段中]
#实例化上面定义的自定义层
bert_输出=BertLayer(n_微调层=10)(bert_输入)
#构建分类器的其余部分
稠密=tf.keras.layers.density(256,activation='relu')(bert_输出)
pred=tf.keras.layers.density(序列标签形状[1],激活='sigmoid')(密集)
模型=tf.keras.models.model(输入=bert_输入,输出=pred)
回归模型
调用model.compile时出错
strategy = tf.distribute.experimental.TPUStrategy(
tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS))
with strategy.scope():
model = build_model(256)
opt = tf.train.AdamOptimizer(0.001)
model.compile(loss='binary_crossentropy', optimizer=opt)
据我所知,BertLayer确实是在这个范围内创建的,但我对keras和tensorflow比较陌生,所以我很高兴您的帮助。我正在研究tensorflow 1.14考虑在策略范围内指定模型输入的形状,您可以尝试以下方法之一: 1.创建模型后调用
model.build()
。
2.在\uuuu init\uuuuu()
中定义模型第一层的input\u shape
。
3.创建模型后,使用实张量(1、0等)调用模型(张量)
无论如何,请指定模型输入的形状。这对我有用。
希望这将对您有所帮助。考虑在策略范围内指定模型输入的形状,您可以尝试以下方法之一: 1.创建模型后调用
model.build()
。
2.在\uuuu init\uuuuu()
中定义模型第一层的input\u shape
。
3.创建模型后,使用实张量(1、0等)调用模型(张量)
无论如何,请指定模型输入的形状。这对我有用。
希望这对你有帮助