预测模式中的下一个数字 [英] Predict next number in a pattern

查看:175
本文介绍了预测模式中的下一个数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用TensorFlow编写一个简单的程序来预测序列中的下一个数字。

I am trying to write a simple program using TensorFlow to predict the next number in a sequence.

我在TensorFlow中没有经验,所以我不是从零开始从本指南开始: http://monik.in / a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow /

I am not experienced in TensorFlow so instead of starting from scratch I started with this guide: http://monik.in/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow/

但是,与上面链接中的实现相反不想将问题视为分类问题-我只有n个可能的结果-而是只为序列计算一个值。

However, in contrast to the implementation in the link above I do not want to treat the problem as a classification problem - where I only have n possible outcomes - but instead just calculate a single value for a sequence.

我尝试修改适合我的问题的代码:

I tried modifying the code to fit my problem:

import numpy as np
import random
from random import shuffle
import tensorflow as tf

NUM_EXAMPLES = 10000

train_input = ['{0:020b}'.format(i) for i in range(2**20)]
shuffle(train_input)
train_input = [map(int,i) for i in train_input]
ti  = []
for i in train_input:
    temp_list = []
    for j in i:
            temp_list.append([j])
    ti.append(np.array(temp_list))
train_input = ti

train_output = []
for i in train_input:
    count = 0
    for j in i:
        if j[0] == 1:
            count+=1
    #temp_list = ([0]*21)
    #temp_list[count]=1
    #train_output.append(temp_list)
    train_output.append(count)

test_input = train_input[NUM_EXAMPLES:]
test_output = train_output[NUM_EXAMPLES:]
train_input = train_input[:NUM_EXAMPLES]
train_output = train_output[:NUM_EXAMPLES]

print "test and training data loaded"


target = tf.placeholder(tf.float32, [None, 1])
data = tf.placeholder(tf.float32, [None, 20,1]) #Number of examples, number of input, dimension of each input
#target = tf.placeholder(tf.float32, [None, 1])

#print('target shape: ', target.get_shape())
#print('shape[0]', target.get_shape()[1])
#print('int(shape) ', int(target.get_shape()[1]))

num_hidden = 24
cell = tf.nn.rnn_cell.LSTMCell(num_hidden)
val, _ = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32)
val = tf.transpose(val, [1, 0, 2])

print('val shape, ', val.get_shape())

last = tf.gather(val, int(val.get_shape()[0]) - 1)

weight = tf.Variable(tf.truncated_normal([num_hidden, int(target.get_shape()[1])]))
bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]]))

#prediction = tf.nn.softmax(tf.matmul(last, weight) + bias)
prediction = tf.matmul(last, weight) + bias

cross_entropy = -tf.reduce_sum(target - prediction)
optimizer = tf.train.AdamOptimizer()
minimize = optimizer.minimize(cross_entropy)

mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1))
error = tf.reduce_mean(tf.cast(mistakes, tf.float32))

init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)

batch_size = 100
no_of_batches = int(len(train_input)) / batch_size
epoch = 500

for i in range(epoch):
    ptr = 0
    for j in range(no_of_batches):
        inp, out = train_input[ptr:ptr+batch_size], train_output[ptr:ptr+batch_size]
        ptr+=batch_size
        sess.run(minimize,{data: inp, target: out})
    print "Epoch ",str(i)

incorrect = sess.run(error,{data: test_input, target: test_output})

#print sess.run(prediction,{data: [[[1],[0],[0],[1],[1],[0],[1],[1],[1],[0],[1],[0],[0],[1],[1],[0],[1],[1],[1],[0]]]})
#print('Epoch {:2d} error {:3.1f}%'.format(i + 1, 100 * incorrect))

sess.close()

由于输入是虚假的以及交叉熵计算,因此它仍在进行中。

It is still work in progress, since the input is bogus as well as the cross entropy calculation.

但是,我的主要问题是代码根本无法编译。

However, my main problem is that the code doesn't compile at all.

我收到此错误:


ValueError:无法输入形状值( 100,)for Tensor
u'Placeholder:0',其形状为'(?,1)'

ValueError: Cannot feed value of shape (100,) for Tensor u'Placeholder:0', which has shape '(?, 1)'

数字100来自 batch_size,而(?,1)来自我的预测是一维数字这一事实。但是,我不知道问题出在我的代码中什么地方?

The number 100 comes from the "batch_size" and the (?, 1) comes from the fact that my prediction is a one dimensional number. However, I do not have any idea where the problem is in my code?

有人可以帮助我获得匹配的尺寸吗?

Can anyone help me get the dimensions to match?

推荐答案

要修复占位符形状,请将代码更改为

To fix the placeholders shape, change your code to

for i in range(epoch):
    ptr = 0
    for j in range(no_of_batches):
        inp = train_input[ptr:ptr+batch_size]
        out = train_output[ptr:ptr+batch_size]
        ptr+=batch_size
        out = np.reshape(out, (100,1))   #reshape
        sess.run(minimize,{data: inp, target: out})
    print ("Epoch ",str(i))
test_output = np.reshape(test_output, (1038576,1))   #reshape
incorrect = sess.run(error,{data: test_input, target: test_output})

这篇关于预测模式中的下一个数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆