Keras训练报错ValueError: No variables to save,求问题原因与解决方法
解决Keras训练时出现的"ValueError: No variables to save"问题
我之前踩过完全一样的坑!看你的报错堆栈就能直接定位问题——问题出在TensorBoard回调的embeddings_freq参数设置上。你把它写成了字符串'batch',这是不符合参数要求的用法。
为什么会触发这个错误?
Keras的TensorBoard回调里,embeddings_freq要求传入整数,用来指定每隔多少个epoch保存一次嵌入向量数据。当你传入字符串'batch'时,回调内部的逻辑会混乱:它尝试创建TensorFlow的Saver对象来保存嵌入变量,但因为参数格式错误,找不到任何可被保存的有效变量,最终就抛出了No variables to save的异常。
怎么解决?
有两种处理方式,根据你的需求选:
- 如果需要记录嵌入数据:把
embeddings_freq改成整数,比如1表示每个epoch都保存,5表示每5个epoch保存一次 - 如果不需要记录嵌入数据:直接删掉
embeddings_freq参数就行,它的默认值是0,也就是不保存嵌入数据
修改后的代码示例
# 方案1:保留嵌入记录,修正参数为整数 tensorboard_callback = TensorBoard(log_dir=log_path, write_graph=True, embeddings_freq=1) # 方案2:不需要嵌入记录的话,直接写成这样 # tensorboard_callback = TensorBoard(log_dir=log_path, write_graph=True) es_min_valLoss = EarlyStopping(monitor='val_loss', patience=15, mode='min') model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) train_history=model.fit(x=trainData, y=trainLabels, validation_split=validation_split, epochs=epochs, batch_size=batch_size, verbose=2, callbacks=[tensorboard_callback, es_min_valLoss])
补充说明
如果你确实需要按批次来记录嵌入数据,Keras原生的TensorBoard回调是不支持这个功能的,你可能需要自己写一个自定义回调来实现,但绝大多数场景下,按epoch频率记录就足够满足需求了。
内容的提问来源于stack exchange,提问作者miko daisuke
相关产品推荐
相关产品推荐

