Python TensorFlow/Keras中的错误:值错误:没有为任何变量提供梯度
我是深度学习的新手,我正在尝试基于以下内容,使用Keras/Tensorflow实现一种音乐流派分类方法 对模型进行了一些修改 我正在实施的代码如下: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
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')