Я знаю, что об этом спрашивали совсем немного.Однако после просмотра различных сообщений я все еще не могу исправить свою ошибку.
В настоящее время я строю рекуррентную нейронную сеть для анализа настроений.В этом конкретном файле я определяю 2 разных типа архитектур (одна с 0 полностью подключенным слоем, а другая с 1 полностью подключенным слоем), все под разными функциями, поэтому я могу затем вызвать что-то вроде train (1, ....), где 1 соответствует одному из вариантов.
Я знаю, что архитектуры в целом хороши, потому что я тестировал код без функций, и все работало.
Однако, когдаЯ попытался организовать код в функции для различных архитектур и для обучения, я получаю эту ошибку:
ValueError: Tensor("RNN1/rnn/Const:0", shape=(1,), dtype=int32) must be from the same graph as Tensor("ExpandDims:0", shape=(1,), dtype=int32).
, которая указывает на строку
outputs, final_state = tf.nn.dynamic_rnn(cell, embed, initial_state=initial_state)
Я быочень признателен, если кто-нибудь может помочь мне с этим!Большое спасибо за ваше время!
Полный код:
(...)
inputs_ = tf.placeholder(tf.int32, [None, None], name="inputs")
labels_ = tf.placeholder(tf.int32, [None, None], name="labels")
keep_prob = tf.placeholder(tf.float32, name="keep_prob")
n_words=4000
embed_size=300
embedding = tf.Variable(tf.random_uniform((n_words, embed_size), -1, 1))
embed = tf.nn.embedding_lookup(embedding, inputs_)
def rnn_0_fc_layers(inputs_, lstm_size=226, lstm_layers=2, batch_size=600):
with tf.name_scope("RNN1"):
def lstm_cell():
lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
return tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=keep_prob)
cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for i in range(lstm_layers)])
initial_state = cell.zero_state(batch_size, tf.float32)
outputs, final_state = tf.nn.dynamic_rnn(cell, embed, initial_state=initial_state)
pred = tf.contrib.layers.fully_connected(outputs[:,-1], 1, activation_func=tf.nn.relu)
return pred, cell, initial_state, final_state
def rnn_1_fc_layers(inputs_, lstm_size=226, lstm_layers=2, batch_size=600):
with tf.name_scope("RNN1"):
def lstm_cell():
lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
return tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=keep_prob)
cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for i in range(lstm_layers)])
initial_state = cell.zero_state(batch_size, tf.float32)
outputs, final_state = tf.nn.dynamic_rnn(cell, embed, initial_state=initial_state)
dense1= tf.contrib.layers.fully_connected(outputs[:, -1], 256, activation_func=tf.nn.relu)
dense1 = tf.contrib.layers.dropout(dense1, keep_prob)
pred = tf.contrib.layers.fully_connected(dense1, 1, activation_func=tf.nn.relu)
return pred, cell, initial_state, final_state
def get_batch(x, y, batch_size):
'''Create the batches for the training and validation data'''
n_batches = len(x)//batch_size
x, y = x[:n_batches*batch_size], y[:n_batches*batch_size]
for ii in range(0, len(x), batch_size):
yield x[ii:ii+batch_size], y[ii:ii+batch_size]
tf.reset_default_graph()
def train_rnn(model, learning_rate, epochs, batch_size):
tf.reset_default_graph()
learning_rate= learning_rate
epochs=epochs
batch_size=batch_size
inputs_ = tf.placeholder(tf.int32, [None, None], name="inputs")
labels_ = tf.placeholder(tf.int32, [None, None], name="labels")
if model ==0:
pred,_,_,_= rnn_0_fc_layers(inputs_)
else:
model ==1:
pred,_,_,_=rnn_1_fc_layers(inputs_)
with tf.name_scope('cost'):
cost = tf.losses.mean_squared_error(labels_, pred)
tf.summary.scalar('cost', cost)
with tf.name_scope('train'):
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
with tf.name_scope('eval'):
correct_pred = tf.equal(tf.cast(tf.round(pred), tf.int32), labels_)
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
merged = tf.summary.merge_all()
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
iteration = 0
for e in range(epochs):
state = sess.run(model.initial_state)
for i1, (x,y) in enumerate(get_batch(train_x, train_y, batch_size), 1):
feed = {
inputs_ : x,
labels_ : y[:, None],
keep_prob : 0.5,
model.initial_state : state}
summary, acc, loss, state, _ = sess.run([merged, accuracy, cost, model.final_state, optimizer], feed_dict=feed)
if iteration%5 == 0:
train_acc= []
train_acc.append(acc)
print("Epoch: {}/{}".format(e, epochs),
"Iteration: {}".format(iteration),
"Accuracy: {}".format(train_acc),
"Train Loss: {:.3f}".format(loss))
if iteration%5 == 0:
val_acc = []
val_loss= []
val_state = sess.run(model.cell.zero_state(batch_size, tf.float32))
for x, y in get_batch(val_x, val_y, batch_size):
feed = {inputs_ : x,
labels_ : y[:, None],
keep_prob : 1,
model.initial_state : val_state}
summary, batch_acc, batch_loss, val_state = sess.run([merged, accuracy, cost, model.final_state], feed_dict=feed)
val_acc.append(batch_acc)
val_loss.append(batch_loss)
print("Val acc: {:.3f}".format(np.mean(val_acc)))
print("Val loss: {:.3f}".format(np.mean(val_loss)))
iteration += 1