基於深度學習的音樂推薦系統(二)用於語譜圖分類的卷積神經網絡結構

Tensorflow1.13

極客雲GPU服務器

極客雲註冊地址

用這個鏈接可以免費獲得10元優惠券,好像是不需要充值就可以用。

 本系統用單核GPU,最便宜的那種就行。

該CNN的訓練樣本分爲兩類

一共10類音頻,每類100首歌曲,每首歌曲分割爲11張圖。即每類1100張圖。

訓練集:每類的前1000張圖。

測試集:每類的後100張圖。

代碼如下:

train_list = ['/data/train9.tfrecords','/data/train8.tfrecords','/data/train7.tfrecords',
			  '/data/train6.tfrecords', '/data/train5.tfrecords','/data/train4.tfrecords',
              '/data/train3.tfrecords', '/data/train2.tfrecords','/data/train1.tfrecords',
              '/data/train0.tfrecords']
test_list = ['/data/test9.tfrecords','/data/test8.tfrecords','/data/test7.tfrecords',
			  '/data/test6.tfrecords', '/data/test5.tfrecords','/data/test4.tfrecords',
              '/data/test3.tfrecords', '/data/test2.tfrecords','/data/test1.tfrecords',
              '/data/test0.tfrecords']
# 隨機打亂順序
img, label = read_and_decode_tfrecord(train_list)
img_batch, label_batch = tf.train.shuffle_batch([img, label], num_threads=2, batch_size=batch_size_, capacity=10000,
                                                min_after_dequeue=9930)
test_img, test_label = read_and_decode_tfrecord(test_list)
test_img_batch, test_label_batch = tf.train.shuffle_batch([test_img, test_label], num_threads=2, batch_size=batch_size_, capacity=1000,
                                                min_after_dequeue=930)
 

輸入數據是256*256*1的形狀。CNN結構如下圖。

本文使用4層Conv卷積層4層Pooling池化層,卷積層使用elu()作爲激勵函數,一層全連接層搭建一個卷積神經網絡。下面對該網絡結構進行詳細說明:

  • 卷積層1的卷積核大小爲3*3,步長爲1,卷積核個數爲64。池化層1採取最大值子採樣max pooling的方式,步長爲2,核大小爲2*2,padding設置爲SAME,即填充像素保持原大小。
  • 卷積層2的卷積核大小爲3*3,步長爲1,卷積核個數爲128。池化層2採取最大值子採樣max pooling的方式,步長爲4,核大小爲4*4,padding設置爲SAME,即填充像素保持原大小。
  • 卷積層3的卷積核大小爲3*3,步長爲1,卷積核個數爲256。池化層2採取最大值子採樣max pooling的方式,步長爲4,核大小爲4*4,padding設置爲SAME,即填充像素保持原大小。
  • 卷積層4的卷積核大小爲3*3,步長爲1,卷積核個數爲512。池化層2採取最大值子採樣max pooling的方式,步長爲4,核大小爲4*4,padding設置爲SAME,即填充像素保持原大小。
  • 全連接層輸入節點數爲2*2*512,輸出節點數爲128。elu()函數激活全連接層。再使用隨機失活(dropout)實現神經網絡的正則化。
  • 輸出結果層,給出預測結果。

代碼如下:

CNN相關參數指標:

每批大小:64

學習率:0.001

損失函數和優化器定義。

batch_size_ = 64
lr = tf.Variable(0.001, dtype=tf.float32)
x = tf.placeholder(tf.float32, [None, 256, 256, 1],name='x')
y_ = tf.placeholder(tf.float32, [None],name='y_')
keep_prob = tf.placeholder(tf.float32)
predict_y = define_predict_y(x)
tf.add_to_collection("predict", predict_y)

# 將label值進行onehot編碼
one_hot_labels = tf.one_hot(indices=tf.cast(y_, tf.int32), depth=10)
# 定義損失函數和優化器
#loss = -tf.reduce_sum(one_hot_labels * tf.log(predict_y))
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=predict_y, labels=one_hot_labels))
optimizer = tf.train.AdamOptimizer(learning_rate=lr).minimize(loss)
# 準確度
a = tf.argmax(predict_y, 1)
b = tf.argmax(one_hot_labels, 1)
correct_pred = tf.equal(a, b)
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

訓練過程:

max_acc=0
f=open('./ckpt/acc.txt','w')
with tf.Session() as sess:
	print("訓練模式")
	# 如果是訓練,初始化參數
	sess.run(tf.global_variables_initializer())
	# 創建一個協調器,管理線程
	coord = tf.train.Coordinator()
	# 啓動QueueRunner,此時文件名隊列已經進隊
	threads = tf.train.start_queue_runners(sess=sess, coord=coord)
	# 定義輸入和Label以填充容器,訓練時dropout爲0.25
	for step in range(8000):
		#print("step:",step)
		b_image, b_label = sess.run([img_batch, label_batch])
		#_, train_accuracy = sess.run([optimizer, accuracy], feed_dict={x: b_image, y_: b_label,keep_prob: 1})
		# print("step = {}\ttrain_accuracy = {}".format(step, train_accuracy))
		optimizer.run(feed_dict={x: b_image, y_: b_label,keep_prob: 1})
		if step % 100 == 0:
			t_image, t_label = sess.run([test_img_batch,test_label_batch])
			_, test_accuracy = sess.run([optimizer, accuracy], feed_dict={x: t_image, y_: t_label,keep_prob: 1})
			print("測試集:step = {}\ttrain_accuracy = {}".format(step, test_accuracy))
			f.write(str(step+1)+', train_accuracy: '+str(test_accuracy)+'\n')
			#下面這一段是CNN模型參數的保存,可選
			if test_accuracy>max_acc:
				max_acc=test_accuracy
				saver.save(sess,'./ckpt/music.ckpt',global_step=step+1)
		
	f.close()

訓練效果展示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章