- pickle.dump报错 TypeError: cannot pickle ‘_thread.RLock’ object
- 在用tensorflow创建模块时,创建失败
- ImportError: cannot import name ‘to_categorical’ from ‘keras.utils’
- TypeError: can’t pickle weakref objects
- 使用tf.nn.sparse_softmax_cross_entropy_with_logits()时报错:INVALID_ARGUMENT: Received a label value of 2 which is outside the valid range of [0,2)
- 网络似乎没在训练
- RuntimeError: CUDA error: no kernel image is available for execution on the device
- ImportError: cannot import name ‘PILLOW_VERSION’ from ‘PIL’
- ValueError: dictionary update sequence element #0 has length 11; 2 is required
- Import “tensorflow.keras” could not be resolved(reportMissingImports)
pickle.dump报错 TypeError: cannot pickle ‘_thread.RLock’ object
找到的解决办法是加两个函数,具体如链接
自己的源代码如下:
import pickledef save_network(network):object_file = open(network.name + '.obj', 'wb')pickle.dump(network, object_file)
自己加上去后代码贴下来:
import picklefrom tensorflow.keras.models import Sequential, Modelfrom tensorflow.keras.layers import Densefrom tensorflow.python.keras.layers import deserialize, serializefrom tensorflow.python.keras.saving import saving_utilsdef unpack(model, training_config, weights):restored_model = deserialize(model)if training_config is not None:restored_model.compile(**saving_utils.compile_args_from_training_config(training_config))restored_model.set_weights(weights)return restored_model# Hotfix functiondef make_keras_picklable():def __reduce__(self):model_metadata = saving_utils.model_metadata(self)training_config = model_metadata.get("training_config", None)model = serialize(self)weights = self.get_weights()return (unpack, (model, training_config, weights))cls = Modelcls.__reduce__ = __reduce__def save_network(network):make_keras_picklable()with open(network.name + '.obj', 'wb') as f:pickle.dump(network, f)
在用tensorflow创建模块时,创建失败
try 失败,返回 -1
def build_model(self):model = Sequential() # create modelfor block in self.block_list:for layer in block.get_layers(): # build modeltry:layer.build_layer(model)except:print("\nINDIVIDUAL ABORTED, CREATING A NEW ONE\n")return -1return model
改错,原始使用的是 tensorflow 2.3.0版本,升级到 2.4.0 后还是报错,再升到 2.5.0 就可以了。
ImportError: cannot import name ‘to_categorical’ from ‘keras.utils’
改错:讲原始导入代码从 from keras.utils import to_categorical改为 from tensorflow.keras.utils import to_categorical
python 与 tensorflow 的对应版本见链接
TypeError: can’t pickle weakref objects
和前面的pickle问题差不多,只是可能需要把tensorflow的版本调到2.6.0
使用tf.nn.sparse_softmax_cross_entropy_with_logits()时报错:INVALID_ARGUMENT: Received a label value of 2 which is outside the valid range of [0,2)
因为这个错误而找了很多东西,最终在官网的提示下发现了错在哪儿!!
在项目源代码里面用到了这个方法,它深陷在一堆我没有看过的方法中,而且还不能输出数据的具体数值,然后我就按照顺序查了tf.Session、slim.arg_scope()、slim.conv2d、tf.nn.sparse_softmax_cross_entropy_with_logits、tf_slim以及搜索这个错误信息等等,找到了很多相关的东西,也学了大概的tf_slim的使用方式,由于前期感觉tensorflow的官网看不懂(。。。),就找的其他教程,结果。。。
主要原因是这个方法输入两个tensor值
tf.nn.sparse_softmax_cross_entropy_with_logits(labels, logits, name=None)
labels表示正确数据标签,logits表示从网络获得的结果,拿两者进行比对,得出损失
A common use case is to have logits of shape [batch_size, num_classes] and have labels of shape [batch_size], but higher dimensions are supported, in which case the dim-th dimension is assumed to be of size num_classes. logits must have the dtype of float16, float32, or float64, and labels must have the dtype of int32 or int64.
可以输出两个数的shape,其中logits的shape表示[batch_size, num_classes],labels的shape表示[batch_size],由于错误提示的范围[0, 2)和输出的num_classes一致,再结合官网给出的正确示例,然后我就把正确示例复制,更改labels的数值超出num_classes,果然就出现了相同的错误,哇。。。就反应过来最后一层全连接的输出应该是分类的类别数,改过来就好了,因为之前都是按照源代码写的。还是没有理解代码的作用才犯错
网络似乎没在训练
网络结构不变
- 使用Cifar10数据集,使用SparseCategoricalCrossentropy损失函数,结果:
- 由于batch_size没变,epoch数没变,而数据变多了,一次遍历要使用更多的step


训练在变化
- 使用bees_ants数据,只有几百张。使用CategoricalCrossentropy损失函数,只把网络的最后输出改成分类数后

这个算在训练吗?




之后破罐子破摔,把数据重复复制,也只有几百张,增大了epoch为40



RuntimeError: CUDA error: no kernel image is available for execution on the device
版本原因吗:
GPU: GeForce FT 730CUDA version: 11.3算力:3.5
- 换成了
conda install pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cudatoolkit=10.1,还是不行 - 使用1.2.0的可以,但是这个版本很低,一些常用的函数没有
- 想用1.3.1
conda install pytorch==1.3.1 torchvision==0.4.2 cudatoolkit=10.1 -c pytorch,但是安装、重装很多次,一直有问题ImportError: DLL load failed: 找不到指定的程序。,不能使用这个pytorch,艹! - 又装了pytorch 1.4.0,也由于GPU算力的问题不能使用。网上说1.3版本以上就不支持算力3.5及其一下的GPU了
- 所以换成CPU。
conda install pytorch torchvision torchaudio cpuonly -c pytorch。可以用,只不过torch.cuda.is_available() = False,万事大吉!!只要自己电脑可以跑就行。ImportError: cannot import name ‘PILLOW_VERSION’ from ‘PIL’
pip uninstall Pillowpip install Pillow==6.2.2
ValueError: dictionary update sequence element #0 has length 11; 2 is required
在利用copy.deepcopy()进行深拷贝时,出现了这个错误,但是拷贝的双方都是List类型,不是字典。然后由于是把一个对象的属性拷贝给另一个对象中,进行拆分拷贝发现,是由于拷贝过程中涉及的类有__slots__这个对象在最开头,删掉之后就好了。
Import “tensorflow.keras” could not be resolved(reportMissingImports)
是由于tf的版本太新了,一般降到2.7.0就可以了
