簡體   English   中英

如何在 Python Tensorflow-Keras 中腌制弱引用?

[英]How to pickle weakref in Python Tensorflow-Keras?

我寫了一個語音識別python,我用過tenserflow keras model。

當我在運行 200 個 Epoch 后向我的 model 提供輸入時,異常引發,我試圖解決但它不起作用。

我收到此錯誤無法腌制弱引用對象。

異常跟蹤

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Conda\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "G:\code\speaker_identification.py", line 93, in record
    pickle.dump([regressor] ,mf)
TypeError: can't pickle weakref objects

這是我嘗試過的完整代碼

from tkinter import *
from tkinter import filedialog
from keras.layers import *
from keras.models import Sequential
import sounddevice as sd
import pickle
import scipy.io.wavfile as wav
import numpy as np
import speechpy
import os
import time

window=Tk()
window.title('Project')
fs=44100
duration=5
i=[]
def features(fs,signal):
    #fs, signal = wav.read(file_name)
    #signal = signal[:,0]
    
    signal_preemphasized = speechpy.processing.preemphasis(signal, cof=0.98)
    
    frames = speechpy.processing.stack_frames(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01, filter=lambda x: np.ones((x,)), zero_padding=True)
    
    power_spectrum = speechpy.processing.power_spectrum(frames, fft_points=512)
    
    mfcc = speechpy.feature.mfcc(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01, num_filters=40, fft_length=512, low_frequency=0, high_frequency=None)
    mfcc_cmvn = speechpy.processing.cmvnw(mfcc,win_size=301,variance_normalization=True)
    
    mfcc_feature_cube = speechpy.feature.extract_derivative_feature(mfcc)
    
    logenergy = speechpy.feature.lmfe(signal, sampling_frequency=fs, frame_length=0.020, frame_stride=0.01, num_filters=40, fft_length=512, low_frequency=0, high_frequency=None)
    logenergy_feature_cube = speechpy.feature.extract_derivative_feature(logenergy)
    
    return [fs, signal, frames, power_spectrum, mfcc, mfcc_cmvn, mfcc_feature_cube, logenergy, logenergy_feature_cube]

def getSample():
    try:
        with open('names.pickle','rb') as f:
            names=pickle.load(f)
    except:
        names=[]
    n=t1.get('1.0','end-1c')
    if ((n in names) or n==''):
        t10.delete('1.0','end-1c')
        t10.insert(END,'Username Already used')
    else:
        names.append(n)
        with open('names.pickle','wb') as f:
                pickle.dump(names,f)
        train=Tk()
        train.title('Add Sample')
        tl1=Label(train,text='Press The button to record 5 Second sample')
        tl1.grid(row=0,column=0)
        def record():
            global duration,fs
            rec=sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
            sd.wait()
            sd.play(rec,fs)
            sd.wait()
            rec=list(map(float,rec))
            try:
                with open('mat.pickle','rb') as tf:
                    k, feature=pickle.load(tf)
            except:
                k=0
                feature=np.array([])
            k+=1
            s=features(fs,np.array(rec))
            ss=s[-1]
            ss=ss.reshape((498,40,3))
            feature=list(feature)
            feature.append(ss)
            feature=np.array(feature)
            with open('mat.pickle','wb') as tf:
                pickle.dump([k,feature],tf)
            regressor=Sequential()
            regressor.add(Conv2D(32,kernel_size=3,activation='relu',input_shape=(498,40,3)))
            regressor.add(MaxPooling2D(pool_size=(4,4)))
            regressor.add(Conv2D(64,kernel_size=3,activation='relu'))
            regressor.add(MaxPooling2D(pool_size=(4,4)))
            regressor.add(Dense(10))
            regressor.add(Dropout(rate=0.5))
            regressor.add(Dense(5))
            regressor.add(Flatten())
            regressor.add(Dense(k,activation='sigmoid'))
            regressor.compile(optimizer='rmsprop',loss='mean_squared_error')
            ytrain=np.zeros((k,k),int)
            np.fill_diagonal(ytrain,1)
            regressor.fit(x=feature,y=ytrain,batch_size=32,epochs=200)
            with open('model.pickle','wb') as mf:
                pickle.dump([regressor] ,mf)
            t10.delete('1.0','end-1c')
            t10.insert(END,'Username Added and Model Trained')
            train.destroy()
            
        tb1=Button(train,text='Record',command=record)
        tb1.grid(row=1,column=0, padx=10,pady=10)
        train.mainloop()
   
def recognize():
    recog=Tk()
    recog.title('Recognize the voice')
    try:
        with open('names.pickle','rb') as f:
            names=pickle.load(f)
    except:
        t10.delete('1.0','end-1c')
        t10.insert(END,'No Samples in Dataset')
        recog.destroy()
        
    def recordrecog():
        r=sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
        sd.wait() 
        sd.play(r,fs)
        sd.wait()
        r=list(map(float,r))
        s=features(fs,np.array(r))
        ss=s[-1]
        ss=ss.reshape((1,498,40,3))
        with open('model.pickle','rb') as mf:
            regressor=pickle.load(mf)
        regressor=regressor[0]
        predictionval=regressor.predict(ss)
        t10.delete('1.0','end-1c')
        global i
        i=list(list(predictionval)[0])
        n=names[i.index(max(i))]
        t10.insert(END,n)
    
    rl1=Label(recog,text='Record a 5 Sec sample by clicking the following button')
    rl1.grid(row=0,column=0)
    rb1=Button(recog,text='Record Sample',command=recordrecog)
    rb1.grid(row=1,column=0,padx=10,pady=10)
    
    recog.mainloop()

def deleteAll():
    os.remove('names.pickle')
    os.remove('mat.pickle')
    os.remove('model.pickle')
    t10.delete('1.0','end-1c')
    t10.insert(END,'All Files and Users Deleted')

l1=Label(window,text='Name')
l1.grid(row=0,column=0)
b1=Button(window,text='ADD',command=getSample)
b1.grid(row=1,column=1)
t1=Text(window, height=2, width=35, selectbackground='blue')
t1.grid(row=1,column=0, padx=10,pady=10)

b2=Button(window,text='Recognize the User',command=recognize)
b2.grid(row=2,column=0, padx=10,pady=30)


l10=Label(window,text='Status')
l10.grid(row=9,column=0)
t10=Text(window,height=1, width=50)
t10.grid(row=10,column=0,padx=10,pady=10)
b10=Button(window,text='Delete all Data',command=deleteAll)
b10.grid(row=10,column=1,padx=10,pady=10)
#l1=Label(window,text='Training')
#l1.grid(row=0,column=0)

window.mainloop()

當我使用 joblib 時出現新錯誤或幾乎相同

Epoch 200/200
1/1 [==============================] - 0s 15ms/step - loss: 0.0000e+00
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Conda\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "G:\code\speaker_identification.py", line 89, in record
    joblib.dump([regressor], 'model.pkl')
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 480, in dump
    NumpyPickler(f, protocol=protocol).dump(value)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 437, in dump
    self.save(obj)
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 504, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Conda\Anaconda3\lib\pickle.py", line 816, in save_list
    self._batch_appends(obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 843, in _batch_appends
    save(tmp[0])
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 549, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 662, in save_reduce
    save(state)
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 504, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Conda\Anaconda3\lib\pickle.py", line 856, in save_dict
    self._batch_setitems(obj.items())
  File "C:\Conda\Anaconda3\lib\pickle.py", line 882, in _batch_setitems
    save(v)
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 549, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 662, in save_reduce
    save(state)
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 504, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Conda\Anaconda3\lib\pickle.py", line 856, in save_dict
    self._batch_setitems(obj.items())
  File "C:\Conda\Anaconda3\lib\pickle.py", line 882, in _batch_setitems
    save(v)
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 504, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Conda\Anaconda3\lib\pickle.py", line 856, in save_dict
    self._batch_setitems(obj.items())
  File "C:\Conda\Anaconda3\lib\pickle.py", line 881, in _batch_setitems
    save(k)
  File "C:\Conda\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line 282, in save
    return Pickler.save(self, obj)
  File "C:\Conda\Anaconda3\lib\pickle.py", line 524, in save
    rv = reduce(self.proto)
TypeError: can't pickle weakref objects

您可以使用joblib或僅使用model.save('filename.h5)

from keras.models import load_model

加載 model model = load_model('model_trained.h5')

使用 joblib 保存 model

joblib.dump('filename.pkl')

並加載

loaded_model = joblib.load('filename.pkl')

有關 pickle 和 joblib 的更多幫助,請瀏覽此處

它的計算成本很高,但你可以嘗試在2000 Epochs上運行它

因為您的 model 訓練不足可能會發生

你可以試試用這個在google上搜索

或者只是嘗試(如果您安裝了 32 位 python,請打開 32 位的)這個然后這個

然后重啟IDLE

我在保存 Keras model 時遇到了同樣的問題,所有這些提到的方法,例如picklejoblib甚至model.save('filename')都沒有。 最后,我通過直接調用save_model方法解決了這個問題,如下所示:

import tensorflow as tf
tf.keras.models.save_model(model, filename)

如果您已經用子類訓練了 tensorflow-keras model,它可能會特別以這種方式工作。 希望對其他人有幫助!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM