Python TensorFlow/Keras中的错误:值错误:没有为任何变量提供梯度

Python TensorFlow/Keras中的错误:值错误:没有为任何变量提供梯度,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我是深度学习的新手,我正在尝试基于以下内容,使用Keras/Tensorflow实现一种音乐流派分类方法 对模型进行了一些修改 我正在实施的代码如下: def preprocess(fin): y, sr = librosa.load(fin, duration=30.0) ##PREPROCESSING buffer = 3 * sr #3seg samples_total = len(y) samples_wrote = 0

我是深度学习的新手,我正在尝试基于以下内容,使用Keras/Tensorflow实现一种音乐流派分类方法

对模型进行了一些修改

我正在实施的代码如下:

def preprocess(fin):
    y, sr = librosa.load(fin, duration=30.0)
    
    ##PREPROCESSING
    buffer = 3 * sr     #3seg
    samples_total = len(y)
    samples_wrote = 0
    mel = []
    win_length = int(np.ceil(0.020*sr))
    hop_length = int(np.ceil(0.010*sr))
    n_mels = 128
    window = 'hann'
    
    while samples_wrote < samples_total:
    
        #check if the buffer is not exceeding total samples 
        if buffer > (samples_total - samples_wrote):
            buffer = samples_total - samples_wrote
    
        block = y[samples_wrote : (samples_wrote + buffer)]
        samples_wrote += buffer
    
        #mel.append(librosa.feature.melspectrogram(y=block, sr=sr, n_mels=n_mels,hop_length=hop_length, win_length=win_length, window=window))
        test = librosa.feature.melspectrogram(y=block, sr=sr, n_mels=n_mels, hop_length=hop_length, win_length=win_length, window=window)
        
        #mel.append((test,4))
        #print("fin",str(fin))
        name = str(fin)
        if(name[0:2] == "cl"): #classical
            mel.append((test,1))
        elif(name[0:2] == "re"): #reggae
            mel.append((test,2))
        elif(name[0:2] == "co"): #country
            mel.append((test,3))
        elif(name[0:2] == "bl"): #blues
            mel.append((test,4))
        else:
            if(name[0:2] == "hi"): #hiphop
                mel.append((test,5))
        
        #mel.append(test)
            # mel.append(test.flatten())
        # df = np.asarray(mel)
        return(mel)
## CREATE A DATASET
M = []
df = []
for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.wav'):
        print("Loading...",file)
        M = preprocess(file)
        df += M
del M
del file

## CREATE AND PREPAR DATA
dataset = df
random.shuffle(dataset)

train = dataset[:25]
dev = dataset[25:35]
test = dataset[35:]

X_train, Y_train = zip(*train)
X_dev, Y_dev = zip(*dev)
X_test, Y_test = zip(*test)

## Reshape for CNN input
X_train = np.array([x.reshape( (128, 300, 1) ) for x in X_train])
X_dev = np.array([x.reshape( (128, 300, 1) ) for x in X_dev])
X_test = np.array([x.reshape( (128, 300, 1) ) for x in X_test])

## One-Hot encoding for classes
Y_train = np.array(keras.utils.to_categorical(Y_train, num_classes=6)) ## n_CLASS + 1
Y_dev = np.array(keras.utils.to_categorical(Y_dev, num_classes=6))
Y_test = np.array(keras.utils.to_categorical(Y_test, num_classes=6))

## OU USAR ESSE ABAIXO
# Y_train = np.array(Y_train)
# Y_dev = np.array(Y_dev)
# Y_test = np.array(Y_test)


######################################
# MODELO DE TESTE 1
# ERRO  ValueError: No gradients provided for any variable
######################################
# ## MODEL
# input_shape=(128, 300, 1)

# model_input = Input(input_shape, name='input')
# num_classes = 5
# layer = model_input

# conv_1 = tf.keras.layers.Conv2D(filters = 256, kernel_size = 7,
#                                 input_shape=input_shape, activation='relu',
#                                 name='conv_1')(layer)
# pool_1 = tf.keras.layers.MaxPooling2D(pool_size = 2)(conv_1)
# conv_2 = tf.keras.layers.Conv2D(filters = 256, kernel_size = 7,
#                                 input_shape=input_shape, activation='relu',
#                                 name='conv_2')(pool_1)
# pool_2 = tf.keras.layers.MaxPooling2D(pool_size = 2)(conv_2)
# drop_1 = Dropout(0.5)(pool_2)
# # flatten1 = Flatten()(drop_1)
# reshp_1 = tf.keras.layers.Reshape((161280,3))(drop_1)
# gru_1 = tf.keras.layers.GRU(units = 1024)(reshp_1)
# output = Dense(num_classes, activation = 'softmax')(gru_1)
# model_output = output

# model = Model(model_input, model_output)

# opt = RMSprop(lr=0.001)

# model.compile(optimizer="rmsprop")

# model.summary()

# EPOCH_COUNT = 3
# BATCH_SIZE = 16


# history = model.fit(X_train, Y_train, batch_size=BATCH_SIZE, epochs=EPOCH_COUNT, validation_data=(X_dev, Y_dev))

#############


#####################################
# MODELO DE TESTE 2
# ERRO  ValueError: No gradients provided for any variable
#####################################

# esse valor aqui em baixo é só teste
# train_data = tf.data.Dataset.from_tensor_slices((X_train, Y_train)).batch(30)

model = models.Sequential()
input_shape=(128, 300, 1)
model.add(tf.keras.layers.Conv2D(filters = 256, kernel_size = 7, input_shape=input_shape, activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size = 2))
model.add(tf.keras.layers.Conv2D(filters = 256, kernel_size = 7, input_shape=input_shape, activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size = 2))
model.add(Dropout(0.5))
model.add(tf.keras.layers.Reshape((161280,3)))
model.add(tf.keras.layers.GRU(units = 1024))
model.add(Dropout(0.5))
#model.add(tf.keras.activations.softmax)
model.add(tf.keras.layers.Activation('softmax'))

model.compile(optimizer="rmsprop")
model.summary()

epochs = 3
batch_size = 16
model.fit(x=X_train, y=Y_train, batch_size=batch_size, epochs = epochs, validation_data=(X_dev, Y_dev))
# model.fit(train_data, batch_size=batch_size, epochs = epochs)
#print(model.summary())

def预处理(fin): y、 sr=librosa.load(fin,持续时间=30.0) ##预处理 缓冲区=3*sr#3seg 样本总数=长度(y) 样本数=0 mel=[] win_长度=整数(np.ceil(0.020*sr)) 跃点长度=整数(np.ceil(0.010*sr)) n_mels=128 window='hann' 当样本数量小于样本总数时: #检查缓冲区是否未超过总样本数 如果缓冲区>(样本总数-样本写入): 缓冲区=样本总数-样本数 block=y[已写入样本:(已写入样本+缓冲区)] 已写入的样本数+=缓冲区 #mel.append(librosa.feature.melspectrogram(y=block,sr=sr,n_-mels=n_-mels,hop_-length=hop_-length,win_-length=win_-length,window=window)) test=librosa.feature.melspectrogram(y=block,sr=sr,n_-mels=n_-mels,hop_-length=hop_-length,win_-length=win_-length,window=window) #mel.追加((测试,4)) #打印(“fin”,str(fin)) name=str(fin) 如果(名称[0:2]=“cl”):#经典 mel.追加((测试,1)) 伊里夫(名字[0:2]=“re”):#雷鬼 mel.append((测试,2)) 埃利夫(姓名[0:2]=“co”):#国家 mel.追加((测试,3)) 埃利夫(名字[0:2]=“bl”):#布鲁斯 mel.追加((测试,4)) 其他: 如果(姓名[0:2]=“嗨”):#嘻哈 mel.追加((测试,5)) #mel.append(测试) #mel.append(test.flatte()) #df=np.asarray(mel) 返回(mel) ##创建数据集 M=[] df=[] 对于os.listdir('.')中的文件: 如果fnmatch.fnmatch(文件'*.wav'): 打印(“加载…”,文件) M=预处理(文件) df+=M 德尔姆 del文件 ##创建和准备数据 数据集=df 随机.shuffle(数据集) 列车=数据集[:25] dev=数据集[25:35] 测试=数据集[35:] X_列车,Y_列车=zip(*列车) X_dev,Y_dev=zip(*dev) X_检验,Y_检验=zip(*检验) ##CNN输入的整形 X_列=np.数组([X.Reformate((128300,1))用于X_列中的X]) X_dev=np.array([X.reformate((128300,1))用于X_dev中的X]) X_测试=np.数组([X.Reformate((128300,1))用于X_测试中的X]) ##类的一个热编码 Y_列=np.array(keras.utils.to_categorical(Y_列,num_classes=6))35;n_类+1 Y_dev=np.array(keras.utils.to_category(Y_dev,num_classes=6)) Y_测试=np.array(keras.utils.to_categorical(Y_测试,num_classes=6)) ##乌萨·埃塞·阿拜索 #Y_列=np.数组(Y_列) #Y_dev=np.array(Y_dev) #Y_测试=np.数组(Y_测试) ###################################### #测试模式1 #ERRO VALUERROR:没有为任何变量提供梯度 ###################################### ###模型 #输入_形状=(128300,1) #模型输入=输入(输入形状,名称='输入') #num_classes=5 #图层=模型输入 #conv_1=tf.keras.layers.Conv2D(过滤器=256,内核大小=7, #输入形状=输入形状,激活='relu', #name='conv_1')(图层) #pool_1=tf.keras.layers.MaxPoolig2D(pool_size=2)(conv_1) #conv_2=tf.keras.layers.Conv2D(过滤器=256,内核大小=7, #输入形状=输入形状,激活='relu', #name='conv_2')(池1) #pool_2=tf.keras.layers.MaxPoolig2D(pool_size=2)(conv_2) #辍学1=辍学(0.5)(人才库2) ##展平1=展平() #reshp_1=tf.keras.layers.重塑((161280,3))(下降_1) #gru_1=tf.keras.layers.gru(单位=1024)(再HP_1) #输出=密集(num_类,激活='softmax')(gru_1) #模型输出=输出 #模型=模型(模型输入,模型输出) #opt=RMSprop(lr=0.001) #编译(optimizer=“rmsprop”) #model.summary() #历元计数=3 #批量大小=16 #历史=模型.fit(X\u序列,Y\u序列,批量大小=批量大小,历元数=历元数,验证数据=(X\u开发,Y\u开发)) ############# ##################################### #测试模式2 #ERRO VALUERROR:没有为任何变量提供梯度 ##################################### #埃塞·瓦洛尔·阿奎姆·拜克索·索泰斯 #train_data=tf.data.Dataset.from_tensor_切片((X_train,Y_train)).batch(30) model=models.Sequential() 输入_形状=(128300,1) model.add(tf.keras.layers.Conv2D(filters=256,kernel\u size=7,input\u shape=input\u shape,activation='relu')) model.add(tf.keras.layers.MaxPoolig2D(池大小=2)) model.add(tf.keras.layers.Conv2D(filters=256,kernel\u size=7,input\u shape=input\u shape,activation='relu')) model.add(tf.keras.layers.MaxPoolig2D(池大小=2)) 模型。添加(辍学率(0.5)) 添加(tf.keras.layers.reformate((161280,3))) model.add(tf.keras.layers.GRU(单位=1024)) 模型。添加(辍学率(0.5)) #添加(tf.keras.activations.softmax) model.add(tf.keras.layers.Activation('softmax')) 编译(optimizer=“rmsprop”) model.summary() 纪元=3 批量大小=16 模型拟合(x=x\U序列,y=y\U序列,批量大小=批量大小,年代=年代,验证数据=(x\U开发,y\U开发)) #模型拟合(序列数据,批次大小=批次大小,历元=历元) #打印(model.summary()) 我尝试用两种方法重写模型,两种方法都返回以下错误:

ValueError:没有为任何变量提供渐变:['conv2d_5/内核:0'、'conv2d_5/偏差:0'、'conv2d_6/内核:0'、'conv2d_6/偏差:0'、'gru_2/gru细胞_2/内核:0'、'gru_2/gru细胞_2/周期性_内核:0'、'gru_细胞_2/gru细胞_细胞_2/偏差:0']

在这里阅读Stack Overflow和Git的一些解决方案时,我无法解决这个问题,因为代码结构类似于上面的Git

我正在使用Spyder 4.0.1在Windows上运行

我目前用来测试的数据库(实际数据库的一个小样本)是可用的

model.compile(optimizer="rmsprop", loss='mse')