Tensorflow入門(二)文字自動生成

2021-09-10 22:39:39 字數 3167 閱讀 9912

參考:簡單粗暴tensorflow

class dataloader():

def __init__(self):

path=tf.keras.utils.get_file('nietzsche.txt',

origin='')

with open(path,encoding='utf-8') as f:#檔案的安全開啟方式,避免讀寫異常處理和異常發生後檔案控制代碼無法關閉

self.raw_text=f.read().lower() #lower()是字串的內建方法,將所有大寫字母轉換為小寫

self.chars=sorted(list(set(self.raw_text)))#set是集合,用於文字去重

self.char_indices=dict((c,i)for i,c in enumerate(self.chars))#建立字元編號對應關係表

self.indices_char=dict((i,c)for i,c in enumerate(self.chars))

self.text=[self.char_indices[c]for c in self.raw_text]#根據對應關係表將文字字元編號

def get_batch(self,seq_length,batcha_size):

seq=

next_char=

for i in range(batch_size):

index=np.random.randint(0,len(self.text)-seq_length)##理解:隨機選取的樣本範圍是index~index+seq_length,那麼

return np.array(seq),np.array(next_char)

class rnn(tf.keras.model):

def __init__(self,num_chars):

super().__init__()

self.num_chars=num_chars

self.cell=tf.nn.rnn.cell.basiclstmcell(num_units=256)

self.dense=tf.keras.layers.dense(units=self.num_chars)

def call(self,inputs):

batch_size,seq_length=tf.shape(inputs)

#與cs231n的softamx中one_hot的作用不同,softmax中one_hot只是作用於標籤,這裡one_hot的作用是將樣本編碼

inputs=tf.one_hot(inputs,depth=self.num_chars)

state=self.cell.zero_state(batch_size=batch_size,dtype=tf.float32)

for t in range(seq_length.numpy()):

output,state=self.cell(inputs[:,t,:],state)

output=self.dense(output)

return output

def predict(self,inputs,temperature=1.):

batch_size,_=tf.shape(inputs)

logits=self(inputs)#logits.shape=[batch_size,num_chars]

#temperature控制分布的形狀,引數越大,分布越平緩(最大值和最小值的差值越小),生成文字的豐富度越高

prob=tf.nn.softmax(logits/temperature).numpy()

#np.random.choice(a,size=1,replace=true,p=prob) 從[0,a)中以概率p隨機有放回(可能重複)返回size個數

return np.array([np.random.choice(self.num_chars,p=prob[i,:])for i in range(batch_size.numpy())])

data_loader=dataloader()

model=rnn(len(data_loader.chars))

learning_rate=0.01

num_batches=100

batch_size=50

seq_length=50

optimizer=tf.adamoptimizer(learning_rate=learning_rate)

for batch_index in range(num_batches):#num_batches**來,得自己定義的超引數

x,y=data_loader.get_batch(seq_length,batch_size)#seq_length,batch_size**來?得自己定義超引數

with tf.gradienttape as tape:

y_logit_pred=model(x)

loss=tf.losses.sparse_softmax_cross_entropy(labels=y,logits=y_logit_pred)

grads=tape.gradient(loss,model.variables)

x_,_=data_loader.get_batch(seq_length,1)

for diversity in [0.2,0.5,1.0,1.2]:

x=x_

print("diversity %f:"%diversity)

for t in range(400):

y_pred=model.predict(x,diversity)

#print預設是換行的,若要求不換行,則引數end='';flush表示是否立刻將輸出語句輸入到file所指向的檔案物件(預設是sys.stdout)中

print(data_loader.indices_char[y_pred[0]],end='',flush=true)#y_pred.shape=[1,]

#np.concatenate數字拼接函式,axis=0,縱向拼接;axis=1,橫向拼接;axis=-1,i don't know.

#np.expand_dims維度擴充套件,不太理解

x=np.concatenate([x[:,1],np.expand_dims(y_pred,axis=1)],axis=-1)

The HTML Language 二 文字標誌

後面的標誌 對 未經特別說明,均用在 之間1.標誌對是用來建立乙個段落 段與段之間空一行 在此標誌對之間加入的文字將按照段落的格式顯示在瀏覽器上 標誌還可以使用 align 屬性,它用來說明對齊方式 格式 left 左對齊center 居中right 右對齊2.是乙個很簡單的標誌,它沒有結束標誌,它...

LaTeX入門 11 文字居中

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!centerline 語法 centerline 這是 tex 的原始命令,適用於居中較短的文字。center 環境 語法 begin 第一行 第二行 end center環境可以實現多行居中對齊。在center環境中,如果 第一行 太長了,則會自...

二 文字提取 機器學習

英文提取步驟 準備句子 例項化countvectorizer 講分詞結果變成字串當做fit transform的輸入值 示例 from sklearn.feature extraction import dictvectorizer from sklearn.feature extraction.t...