pickle.dump报错 TypeError: cannot pickle ‘_thread.RLock’ object

找到的解决办法是加两个函数,具体如链接
自己的源代码如下:

  1. import pickle
  2. def save_network(network):
  3. object_file = open(network.name + '.obj', 'wb')
  4. pickle.dump(network, object_file)

自己加上去后代码贴下来:

  1. import pickle
  2. from tensorflow.keras.models import Sequential, Model
  3. from tensorflow.keras.layers import Dense
  4. from tensorflow.python.keras.layers import deserialize, serialize
  5. from tensorflow.python.keras.saving import saving_utils
  6. def unpack(model, training_config, weights):
  7. restored_model = deserialize(model)
  8. if training_config is not None:
  9. restored_model.compile(
  10. **saving_utils.compile_args_from_training_config(
  11. training_config
  12. )
  13. )
  14. restored_model.set_weights(weights)
  15. return restored_model
  16. # Hotfix function
  17. def make_keras_picklable():
  18. def __reduce__(self):
  19. model_metadata = saving_utils.model_metadata(self)
  20. training_config = model_metadata.get("training_config", None)
  21. model = serialize(self)
  22. weights = self.get_weights()
  23. return (unpack, (model, training_config, weights))
  24. cls = Model
  25. cls.__reduce__ = __reduce__
  26. def save_network(network):
  27. make_keras_picklable()
  28. with open(network.name + '.obj', 'wb') as f:
  29. pickle.dump(network, f)

在用tensorflow创建模块时,创建失败

try 失败,返回 -1

  1. def build_model(self):
  2. model = Sequential() # create model
  3. for block in self.block_list:
  4. for layer in block.get_layers(): # build model
  5. try:
  6. layer.build_layer(model)
  7. except:
  8. print("\nINDIVIDUAL ABORTED, CREATING A NEW ONE\n")
  9. return -1
  10. return 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.Sessionslim.arg_scope()slim.conv2dtf.nn.sparse_softmax_cross_entropy_with_logitstf_slim以及搜索这个错误信息等等,找到了很多相关的东西,也学了大概的tf_slim的使用方式,由于前期感觉tensorflow的官网看不懂(。。。),就找的其他教程,结果。。。
主要原因是这个方法输入两个tensor值

  1. tf.nn.sparse_softmax_cross_entropy_with_logits(
  2. labels, logits, name=None
  3. )

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,果然就出现了相同的错误,哇。。。就反应过来最后一层全连接的输出应该是分类的类别数,改过来就好了,因为之前都是按照源代码写的。还是没有理解代码的作用才犯错

网络似乎没在训练

网络结构不变

  1. 使用Cifar10数据集,使用SparseCategoricalCrossentropy损失函数,结果:
    1. 由于batch_size没变,epoch数没变,而数据变多了,一次遍历要使用更多的step

image.png
image.png
训练在变化

  1. 使用bees_ants数据,只有几百张。使用CategoricalCrossentropy损失函数,只把网络的最后输出改成分类数后

image.png
这个算在训练吗?

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

RuntimeError: CUDA error: no kernel image is available for execution on the device

版本原因吗:

  1. GPU: GeForce FT 730
  2. CUDA version: 11.3
  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.1conda 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’

    1. pip uninstall Pillow
    2. pip 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就可以了