我有一个使用TensorFlow RNN进行文本分类的代码,但是如何将其改为进行文本生成呢?
下面的文本分类具有3D输入,但输出是2D的。是否应该将其改为3D输入和3D输出以进行文本生成?如果是,应该怎么做呢?
示例数据如下:
t0 t1 t2british gray is => cat (y=0)0 1 2white samoyed is => dog (y=1)3 4 2
对于分类,输入“british gray is”会得到“cat”。我希望输入“british”能够得到下一个词“gray”。
import tensorflow as tf;tf.reset_default_graph();#data'''t0 t1 t2british gray is => cat (y=0)0 1 2white samoyed is => dog (y=1)3 4 2 '''Bsize = 2;Times = 3;Max_X = 4;Max_Y = 1;X = [[[0],[1],[2]], [[3],[4],[2]]];Y = [[0], [1] ];#normalisefor I in range(len(X)): for J in range(len(X[I])): X[I][J][0] /= Max_X;for I in range(len(Y)): Y[I][0] /= Max_Y;#modelInputs = tf.placeholder(tf.float32, [Bsize,Times,1]);Expected = tf.placeholder(tf.float32, [Bsize, 1]);#single LSTM layer#'''Layer1 = tf.keras.layers.LSTM(20);Hidden1 = Layer1(Inputs);#'''#multi LSTM layers'''Layers = tf.keras.layers.RNN([ tf.keras.layers.LSTMCell(30), #hidden 1 tf.keras.layers.LSTMCell(20) #hidden 2]);Hidden2 = Layers(Inputs);'''Weight3 = tf.Variable(tf.random_uniform([20,1], -1,1));Bias3 = tf.Variable(tf.random_uniform([ 1], -1,1));Output = tf.sigmoid(tf.matmul(Hidden1,Weight3) + Bias3);Loss = tf.reduce_sum(tf.square(Expected-Output));Optim = tf.train.GradientDescentOptimizer(1e-1);Training = Optim.minimize(Loss);#trainSess = tf.Session();Init = tf.global_variables_initializer();Sess.run(Init);Feed = {Inputs:X, Expected:Y};for I in range(1000): #number of feeds, 1 feed = 1 batch if I%100==0: Lossvalue = Sess.run(Loss,Feed); print("Loss:",Lossvalue); #end if Sess.run(Training,Feed);#end forLastloss = Sess.run(Loss,Feed);print("Loss:",Lastloss,"(Last)");#evalResults = Sess.run(Output,Feed);print("\nEval:");print(Results);print("\nDone.");#eof
回答:
我找到了如何将其(代码)转换为进行文本生成任务的方法,使用3D输入(X)和3D标签(Y),如下面的源代码所示:
源代码:
import tensorflow as tf;tf.reset_default_graph();#data'''t0 t1 t2british gray is cat0 1 2 (3) <=x1 2 3 <=ywhite samoyed is dog4 5 2 (6) <=x5 2 6 <=y '''Bsize = 2;Times = 3;Max_X = 5;Max_Y = 6;X = [[[0],[1],[2]], [[4],[5],[2]]];Y = [[[1],[2],[3]], [[5],[2],[6]]];#normalisefor I in range(len(X)): for J in range(len(X[I])): X[I][J][0] /= Max_X;for I in range(len(Y)): for J in range(len(Y[I])): Y[I][J][0] /= Max_Y;#modelInput = tf.placeholder(tf.float32, [Bsize,Times,1]);Expected = tf.placeholder(tf.float32, [Bsize,Times,1]);#single LSTM layer'''Layer1 = tf.keras.layers.LSTM(20);Hidden1 = Layer1(Input);'''#multi LSTM layers#'''Layers = tf.keras.layers.RNN([ tf.keras.layers.LSTMCell(30), #hidden 1 tf.keras.layers.LSTMCell(20) #hidden 2],return_sequences=True);Hidden2 = Layers(Input);#'''Weight3 = tf.Variable(tf.random_uniform([20,1], -1,1));Bias3 = tf.Variable(tf.random_uniform([ 1], -1,1));Output = tf.sigmoid(tf.matmul(Hidden2,Weight3) + Bias3); #sequence of 2d * 2dLoss = tf.reduce_sum(tf.square(Expected-Output));Optim = tf.train.GradientDescentOptimizer(1e-1);Training = Optim.minimize(Loss);#trainSess = tf.Session();Init = tf.global_variables_initializer();Sess.run(Init);Feed = {Input:X, Expected:Y};Epochs = 10000;for I in range(Epochs): #number of feeds, 1 feed = 1 batch if I%(Epochs/10)==0: Lossvalue = Sess.run(Loss,Feed); print("Loss:",Lossvalue); #end if Sess.run(Training,Feed);#end forLastloss = Sess.run(Loss,Feed);print("Loss:",Lastloss,"(Last)");#evalResults = Sess.run(Output,Feed).tolist();print("\nEval:");for I in range(len(Results)): for J in range(len(Results[I])): for K in range(len(Results[I][J])): Results[I][J][K] = round(Results[I][J][K]*Max_Y);#end for i print(Results);print("\nDone.");#eof