Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于模型搭建中的一些问题 #28

Open
aroudblack opened this issue Apr 4, 2022 · 3 comments
Open

关于模型搭建中的一些问题 #28

aroudblack opened this issue Apr 4, 2022 · 3 comments

Comments

@aroudblack
Copy link

最近在学习语音情感分析的相关知识,前段时间一直在配置这个模型,目前已完成语音特征提取。
遇到的问题:
(1)在运行train.py时,发现20的epochs数,每次运行的时间居然只有3ms/step。
(2)在cnn.py中,
from tensorflow.python.keras.layers import Dense, Dropout, Flatten, Conv1D, Activation, BatchNormalization, MaxPooling1D
这句有报错:cannot import name 'BatchNormalization' from 'tensorflow.python.keras.layers'

关于问题(1):
我只能认为数据完全没有跑,一般来说即使用1200句的casia,也至少应该跑4个小时以上才对。所有我去对models里的py文件逐行debug,
于是有了问题(2):
没有BatchNormalization的接口。
我自己去读了tensorflow.python.keras.layers下的__init__.py文件,发现根本没有BatchNormalization的接口,只有tensorflow\python\layers(不在Keras中)中有normalization.py文件。
我自己是在豆瓣源上下载的TensorFlow2.8,其各个版本和其他源上的我都试过,都没有BatchNormalization。不知道TensorFlow2.8中BatchNormalization的位置,或者是否已删除或用其他接口代替。

个人看了一下,估计目前最大的问题就在模型的搭建上,希望了解一下大致训练多长时间,accuracy和loss在哪个范围内是正常的。还有就是您用的TensorFlow属于哪个版本,获取途径是什么。被这个折磨了快有两天多了,希望能解答一下疑惑,非常感谢。

@aroudblack
Copy link
Author

关于问题(2)自问自答一下:
今天尝试根据Keras提供的layer分类排查一下,看看有没有BN相关的layer,然后发现了这个:

_class VersionAwareLayers(object):
"""Utility to be used internally to access layers in a V1/V2-aware fashion.

When using layers within the Keras codebase, under the constraint that
e.g. layers.BatchNormalization should be the BatchNormalization version
corresponding to the current runtime (TF1 or TF2), do not simply access
layers.BatchNormalization since it would ignore e.g. an early
compat.v2.disable_v2_behavior() call. Instead, use an instance
of VersionAwareLayers (which you can use just like the layers module).
"""_

def getattr(self, name):
serialization.populate_deserializable_objects()
if name in serialization.LOCAL.ALL_OBJECTS:
return serialization.LOCAL.ALL_OBJECTS[name]
return super(VersionAwareLayers, self).getattr(name)

大概就是说TensorFlow2.8中一些接口已经不再使用,其中就包括BatchNormalization,然后可以使用这个VersionAwareLayers接口来代替那些接口使用。最后就是这个接口具体怎么用还不清楚,正在找版本的说明文档。

@Renovamen
Copy link
Owner

  1. TensorFlow 和 Keras

    我在 cnn.py 里用的是 tensorflow.keras 而不是 tensorflow.python.keras

    from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv1D, \
    Activation, BatchNormalization, MaxPooling1D

    参考这个 issuetensorflow.python 只是 TensorFlow 的开发团队使用的,我们并不应该使用 tensorflow.python 下的任何东西。因此你应该考虑 tensorflow.keras 而不是 tensorflow.python.keras

    tensorflow.keras 的源码在另一个仓库 keras-team/keras 里维护,而显然 keras.layers 里的 __init__.py 是有 BatchNormalization 的(这里)。

    同时,你也应该考虑直接参考 Keras 的 API 文档

  2. 训练时长

    我的训练耗时也非常短,我没有深究这有没有什么问题(并且我现在已经不做这个了)。如果你发现了什么问题,还请告知我一下,谢谢!

  3. acc 和 loss

    我用 LSTM 在 1200 个音频的 CASIA 上跑 20 个 epoch,结束时的 loss 和 acc:

    Epoch 20/20
    30/30 [==============================] - 0s 10ms/step - loss: 0.0187 - accuracy: 0.9969 - val_loss: 0.5956 - val_accuracy: 0.8375
    

    CNN 的 acc 和 loss 也差不多。

@aroudblack
Copy link
Author

aroudblack commented May 7, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants