日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rnn按时间展开_作词家下岗系列:教你用 RNN 算法做一个写词软件

發布時間:2025/3/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rnn按时间展开_作词家下岗系列:教你用 RNN 算法做一个写词软件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 | 李秋鍵

編輯 | Carol

出品 | CSDN(ID:CSDNnews)

自然語言處理作為人工智能的一個重要分支,在我們的生活中得到了廣泛應用。其中RNN算法作為自然語言處理的經典算法之一,是文本生成的重要手段。而今天我們就將利用RNN算法建立一個寫歌詞的軟件。其中的界面如下:

RNN指的是循環神經網絡,Recurrent Neural Network。不同于前饋神經網絡的是,RNN可以利用它內部的記憶來處理任意時序的輸入序列,這讓它可以更容易處理如不分段的手寫識別、語音識別等。

RNN模型有比較多的變種,這里介紹最主流的RNN模型結構如下:

上圖中左邊是RNN模型沒有按時間展開的圖,如果按時間序列展開,則是上圖中的右邊部分。我們重點觀察右邊部分的圖。

這幅圖描述了在序列索引號tt附近RNN的模型。其中:

  • x(t)x(t)代表在序列索引號tt時訓練樣本的輸入。同樣的,x(t?1)x(t?1)和x(t+1)x(t+1)代表在序列索引號t?1t?1和t+1t+1時訓練樣本的輸入。

  • h(t)h(t)代表在序列索引號tt時模型的隱藏狀態。h(t)h(t)由x(t)x(t)和h(t?1)h(t?1)共同決定。

  • o(t)o(t)代表在序列索引號tt時模型的輸出。o(t)o(t)只由模型當前的隱藏狀態h(t)h(t)決定。

  • L(t)L(t)代表在序列索引號tt時模型的損失函數。

  • y(t)y(t)代表在序列索引號tt時訓練樣本序列的真實輸出。

  • U,W,VU,W,V這三個矩陣是我們的模型的線性關系參數,它在整個RNN網絡中是共享的,這點和DNN很不相同。也正因為是共享了,它體現了RNN的模型的“循環反饋”的思想。

  • 基于以上認知,我們開始搭建我們的軟件。

    實驗前的準備

    首先我們使用的python版本是3.6.5所用到的庫有TensorFlow,是用來訓練和加載神經網絡常見的框架,常常用于數值計算的開源軟件庫。節點表示數學操作,線則表示在節點間相互聯系的多維數據數組,即張量(tensor);tkinter用來繪制GUI界面的庫;

    Pillow庫在此項目中用來處理圖片和字體等問題。因為我們的軟件不是空白背景的。需要借助Image函數添加背景。

    RNN算法搭建

    1、數據集處理和準備:

    我們訓練的數據集使用各種歌手的歌詞本作為訓練集。其中數據集放在date.txt里,其中部分數據集如下:

    2、模型的訓練:

    模型訓練的代碼直接運行train.py即可訓練。其中流程如下:

  • 首先要讀取數據集

  • 設定訓練批次、步數等等

  • 數據載入RNN進行訓練即可

  • 其中代碼如下:

    def train:
    filename = 'date.txt'
    with open(filename, 'r', encoding='utf-8') as f:
    text = f.read
    reader = TxtReader(text=text, maxVocab=3500)
    reader.save('voc.data')
    array = reader.text2array(text)
    generator = GetBatch(array, n_seqs=100, n_steps=100)
    model = CharRNN(
    numClasses = reader.vocabLen,
    mode ='train',
    numSeqs = 100,
    numSteps = 100,
    lstmSize = 128,
    numLayers = 2,
    lr = 0.001,
    Trainprob = 0.5,
    useEmbedding = True,
    numEmbedding = 128
    )
    model.train(
    generator,
    logStep = 10,
    saveStep = 1000,
    maxStep = 100000
    )

    3、RNN網絡搭建:

    RNN算法的搭建,我們定義整個神經網絡類,然后分別定義初始化、輸入、神經元定義等函數。損失函數和優化器使用均方差和AdamOptimizer優化器即可。

    部分代碼如下:

    # 創建輸入
    def buildInputs(self):
    numSeqs = self.numSeqs
    numSteps = self.numSteps
    numClasses = self.numClasses
    numEmbedding = self.numEmbedding
    useEmbedding = self.useEmbedding
    with tf.name_scope('inputs'):
    self.inData = tf.placeholder(tf.int32, shape=(numSeqs, numSteps), name='inData')
    self.targets = tf.placeholder(tf.int32, shape=(numSeqs, numSteps), name='targets')
    self.keepProb = tf.placeholder(tf.float32, name='keepProb')
    # 中文
    if useEmbedding:
    with tf.device("/cpu:0"):
    embedding = tf.get_variable('embedding', [numClasses, numEmbedding])
    self.lstmInputs = tf.nn.embedding_lookup(embedding, self.inData)
    # 英文
    else:
    self.lstmInputs = tf.one_hot(self.inData, numClasses)
    # 創建單個Cell
    def buildCell(self, lstmSize, keepProb):
    basicCell = tf.nn.rnn_cell.BasicLSTMCell(lstmSize)
    drop = tf.nn.rnn_cell.DropoutWrapper(basicCell, output_keep_prob=keepProb)
    return drop
    # 將單個Cell堆疊多層
    def buildLstm(self):
    lstmSize = self.lstmSize
    numLayers = self.numLayers
    keepProb = self.keepProb
    numSeqs = self.numSeqs
    numClasses = self.numClasses
    with tf.name_scope('lstm'):
    multiCell = tf.nn.rnn_cell.MultiRNNCell(
    [self.buildCell(lstmSize, keepProb) for _ in range(numLayers)]
    )
    self.initial_state = multiCell.zero_state(numSeqs, tf.float32)
    self.lstmOutputs, self.finalState = tf.nn.dynamic_rnn(multiCell, self.lstmInputs, initial_state=self.initial_state)
    seqOutputs = tf.concat(self.lstmOutputs, 1)
    x = tf.reshape(seqOutputs, [-1, lstmSize])
    with tf.variable_scope('softmax'):
    softmax_w = tf.Variable(tf.truncated_normal([lstmSize, numClasses], stddev=0.1))
    softmax_b = tf.Variable(tf.zeros(numClasses))
    self.logits = tf.matmul(x, softmax_w) + softmax_b
    self.prediction = tf.nn.softmax(self.logits, name='prediction')
    # 計算損失
    def buildLoss(self):
    numClasses = self.numClasses
    with tf.name_scope('loss'):
    targets = tf.one_hot(self.targets, numClasses)
    targets = tf.reshape(targets, self.logits.get_shape)
    loss = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=targets)
    self.loss = tf.reduce_mean(loss)
    # 創建優化器
    def buildOptimizer(self):
    gradClip = self.gradClip
    lr = self.lr
    trainVars = tf.trainable_variables
    # 限制權重更新
    grads, _ = tf.clip_by_global_norm(tf.gradients(self.loss, trainVars), gradClip)
    trainOp = tf.train.AdamOptimizer(lr)
    self.optimizer = trainOp.apply_gradients(zip(grads, trainVars))
    # 訓練
    def train(self, data, logStep=10, saveStep=1000, savepath='./models/', maxStep=100000):
    if not os.path.exists(savepath):
    os.mkdir(savepath)
    Trainprob = self.Trainprob
    self.session = tf.Session
    with self.session as sess:
    step = 0
    sess.run(tf.global_variables_initializer)
    state_now = sess.run(self.initial_state)
    for x, y in data:
    step += 1
    feed_dict = {
    self.inData: x,
    self.targets: y,
    self.keepProb: Trainprob,
    self.initial_state: state_now
    }
    loss, state_now, _ = sess.run([self.loss, self.finalState, self.optimizer], feed_dict=feed_dict)
    if step % logStep == 0:
    print('[INFO]: : {}/{}, loss: {:.4f}'.format(step, maxStep, loss))
    if step % saveStep == 0:
    self.saver.save(sess, savepath, global_step=step)
    if step > maxStep:
    self.saver.save(sess, savepath, global_step=step)
    break
    # 從前N個預測值中選
    def GetTopN(self, preds, size, top_n=5):
    p = np.squeeze(preds)
    p[np.argsort(p)[:-top_n]] = 0
    p = p / np.sum(p)
    c = np.random.choice(size, 1, p=p)[0]
    return c

    4、歌詞的生成:

    設置關鍵詞變量,讀取模型文件,輸出結果即可。

    代碼如下:

    def main(_):
    reader = TxtReader(filename='voc.data')
    model = CharRNN(
    numClasses = reader.vocabLen,
    mode = 'test',
    lstmSize = 128,
    numLayers = 2,
    useEmbedding = True,
    numEmbedding = 128
    )
    checkpoint = tf.train.latest_checkpoint('./models/')
    model.load(checkpoint)
    key="雪花"
    prime = reader.text2array(key)
    array = model.test(prime, size=reader.vocabLen, n_samples=300)
    print("《"+key+"》")
    print(reader.array2text(array))

    界面的定義和調用

    界面中我們的布局是文本框、編輯框和按鈕控件。程序的調用使用批處理文件調用以達到顯示運行過程的效果。因為如果沒有運行過程,難免會導致用戶不清楚程序流程而強制運行容易導致卡死的情況。

    其中Bat里直接寫入:

    python song.py

    其中過程效果如下:

    1、界面布局:

    界面布局使用canvas畫布以達到添加背景圖片的效果。背景圖片設置為1.jpg,按鈕背景圖片設置為3.jpg。圖片也可以自己更換掉。然后文本框作為提示的效果,分別定義字體,大小等等即可

    代碼如下:

    root = tk.Tk
    root.title('AI寫歌詞')
    # 背景
    canvas = tk.Canvas(root, width=800, height=500, bd=0, highlightthickness=0)
    imgpath = '1.jpg'
    img = Image.open(imgpath)
    photo = ImageTk.PhotoImage(img)
    imgpath2 = '3.jpg'
    img2 = Image.open(imgpath2)
    photo2 = ImageTk.PhotoImage(img2)
    canvas.create_image(700, 400, image=photo)
    canvas.pack
    label=tk.Label(text="請輸入關鍵詞:

    總結

    以上是生活随笔為你收集整理的rnn按时间展开_作词家下岗系列:教你用 RNN 算法做一个写词软件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。