【发布时间】:2020-01-05 19:24:30
【问题描述】:
我一直在浏览一些 tensorflow 教程,并且正在拼凑一个宠物实验。但是,我遇到了一些尺寸错误,我似乎可以解决它们。
我的目标:我有一个形状为 1xN 的输入矩阵。我有一个尺寸为 10xN 的训练集。 (1和10是任意选择的)。 N 旨在表示训练集中的 N 个样本:1 个输入值映射到一个输出向量。您可以将其视为 1 个输入神经元和 m 个输出神经元。训练集是一组映射到一维向量的单个值。我希望通过运行一组映射的输入和输出来训练网络并减少错误。
我想要完成的简单算法:
- 对于输入向量中的每个值
- 使用该值加载输入神经元
- 前馈
- 根据对应的向量进行评估
重复以尽量减少错误。
但是,我似乎对如何格式化数据以提供给网络感到困惑。我有 1 个输入神经元和 n 个输出神经元之一的占位符。我想遵循上述算法,但我不确定我是否做得对:
# Data parameters
num_frames = 10
stimuli_value_low = .00001
stimuli_value_high = 100
pixel_value_low = .00001
pixel_value_high = 256.0
stimuli_dimension = 1
frame_dimension = 10
stimuli = np.random.uniform(stimuli_value_low, stimuli_value_high, (stimuli_dimension, num_frames))
frames = np.random.uniform(pixel_value_low, pixel_value_high, (frame_dimension, num_frames))
# Parameters
learning_rate = 0.01
training_iterations = 1000
display_iteration = 10
# Network Parameters
n_hidden_1 = 100
n_hidden_2 = 100
num_input_neurons = stimuli_dimension
num_output_neurons = frame_dimension
# Create placeholders
input_placeholder = tf.placeholder("float", [None, num_input_neurons])
output_placeholder = tf.placeholder("float", [None, num_output_neurons])
# Store layers weight & bias
weights = {
'h1': tf.Variable(tf.random_normal([num_input_neurons, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_hidden_2, num_output_neurons]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([num_output_neurons]))
}
# Create model
def neural_net(input_placeholder):
# Hidden fully connected layer
layer_1 = tf.add(tf.matmul(input_placeholder, weights['h1']), biases['b1'])
# Hidden fully connected layer
layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
# Output fully connected layer with a neuron for each pixel
out_layer = tf.matmul(layer_2, weights['out']) + biases['out']
return out_layer
# Construct model
logits = neural_net(input_placeholder)
# Define loss operation and optimizer
loss_operation = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = output_placeholder))
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)
train_operation = optimizer.minimize(loss_operation)
# Evaluate model (with test logits, for dropout to be disabled)
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(output_placeholder, 1))
accuracy_operation = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()
# Start Training
with tf.Session() as sess:
# Run the initializer
sess.run(init)
for step in range(1, training_iterations + 1):
sess.run(train_operation, feed_dict = {X: stimuli, Y: frames})
if iteration % display_iteration == 0 or iteration == 1:
loss, accuracy = sess.run([loss_operation, accuracy_operation], feed_dict = {X: stimuli, Y: frames})
print("Step " + str(iteration) +
", Loss = " + "{:.4f}".format(loss) +
", Training Accuracy= " + \
"{:.3f}".format(acc))
print("Optimization finished!")
我认为这与我如何构建数据或将其提供给 run 函数有关。
这是我得到的错误:
ValueError Traceback (most recent call last)
<ipython-input-420-7517598734d6> in <module>()
6 for step in range(1, training_iterations + 1):
7
----> 8 sess.run(train_operation, feed_dict = {X: stimuli, Y: frames})
9
10 if iteration % display_iteration == 0 or iteration == 1:
1 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
1147 'which has shape %r' %
1148 (np_val.shape, subfeed_t.name,
-> 1149 str(subfeed_t.get_shape())))
1150 if not self.graph.is_feedable(subfeed_t):
1151 raise ValueError('Tensor %s may not be fed.' % subfeed_t)
ValueError: Cannot feed value of shape (1, 10) for Tensor 'Placeholder_6:0', which has shape '(?, 1)'
如何确保正确格式化输入数据并相应地形成网络?
【问题讨论】:
-
您是否提供了所有代码?我看不出
X或Y是从sess.run(train_operation, feed_dict = {X: stimuli, Y: frames})定义的。 -
刺激和帧在顶部的#Data参数下定义。
-
但是
X和Y呢? -
这是一个很好的观察。我在教程中跟随并假设 X 和 Y 只是输入和输出的内部变量名称。但是在查找了一些东西之后,似乎它们应该是占位符分配给的变量。应该是
sess.run(train_operation, feed_dict = {input_placeholder: stimuli, output_placeholder: frames})?我对占位符与原始数据的作用感到困惑。 -
好像是这样,字典中的键应该是张量,而值应该是numpy数组。
标签: tensorflow tensor