python - 我是使用 TenserFlow 和 MNISt 数据库的深度神经网络的 pca,数据形状出现错误
问题描述
在应用 PCA 后,我正在尝试使用神经网络训练 mnist 数据库。并且由于应用 PCA 后的数据形状,我不断收到错误。我不确定如何将所有内容组合在一起。以及如何遍历整个数据库,而不仅仅是一个小补丁。
这是我的代码:
<pre> <code>
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import random
from sklearn.preprocessing import StandardScaler
from tensorflow.examples.tutorials.mnist import input_data
from sklearn.decomposition import PCA
datadir='/data'
data= input_data.read_data_sets(datadir, one_hot=True)
train_x = data.train.images[:55000]
train_y= data.train.labels[:55000]
test_x = data.test.images[:10000]
test_y = data.test.labels[:10000]
print("original shape: ", data.train.images.shape)
percent=600
pca=PCA(percent)
train_x=pca.fit_transform(train_x)
test_x=pca.fit_transform(test_x)
print("transformed shape:", data.train.images.shape)
train_x=pca.inverse_transform(train_x)
test_x=pca.inverse_transform(test_x)
c=pca.n_components_
plt.figure(figsize=(8,4));
plt.subplot(1, 2, 1);
image=np.reshape(data.train.images[3],[28,28])
plt.imshow(image, cmap='Greys_r')
plt.title("Original Data")
plt.subplot(1, 2, 2);
image1=train_x[3].reshape(28,28)
image.shape
plt.imshow(image1, cmap='Greys_r')
plt.title("Original Data after 0.8 PCA")
plt.figure(figsize=(10,8))
plt.plot(range(c), np.cumsum(pca.explained_variance_ratio_))
plt.grid()
plt.title("Cumulative Explained Variance")
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance');
num_iters=10
hidden_1=1024
hidden_2=1024
input_l=percent
out_l=10
'''input layer'''
x=tf.placeholder(tf.float32, [None, 28,28,1])
x=tf.reshape(x,[-1, input_l])
w1=tf.Variable(tf.random_normal([input_l,hidden_1]))
w2=tf.Variable(tf.random_normal([hidden_1,hidden_2]))
w3=tf.Variable(tf.random_normal([hidden_2,out_l]))
b1=tf.Variable(tf.random_normal([hidden_1]))
b2=tf.Variable(tf.random_normal([hidden_2]))
b3=tf.Variable(tf.random_normal([out_l]))
Layer1=tf.nn.relu_layer(x,w1,b1)
Layer2=tf.nn.relu_layer(Layer1,w2,b2)
y_pred=tf.matmul(Layer2,w3)+b3
y_true=tf.placeholder(tf.float32,[None,out_l])
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y_pred,
labels=y_true))
optimizer= tf.train.AdamOptimizer(0.006).minimize(loss)
correct_pred=tf.equal(tf.argmax(y_pred,1), tf.argmax(y_true,1))
accuracy= tf.reduce_mean(tf.cast(correct_pred, tf.float32))
store_training=[]
store_step=[]
m = 10000
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(num_iters):
indices = random.sample(range(0, m), 100)
batch_xs = train_x[indices]
batch_ys = train_y[indices]
sess.run(optimizer, feed_dict={x:batch_xs, y_true:batch_ys})
training=sess.run(accuracy, feed_dict={x:test_x, y_true:test_y})
store_training.append(training)
testing=sess.run(accuracy, feed_dict={x:test_x, y_true:test_y})
print('Accuracy :{:.4}%'.format(testing*100))
z_reg=len(store_training)
x_reg=np.arange(0,z_reg,1)
y_reg=store_training
plt.figure(1)
plt.plot(x_reg, y_reg,label='Regular Accuracy')
那是我得到的错误:
"Traceback (most recent call last):
File "<ipython-input-2-ff57ada92ef5>", line 135, in <module>
sess.run(optimizer, feed_dict={x:batch_xs, y_true:batch_ys})
File "C:\anaconda3\lib\site-packages\tensorflow\python\client\session.py",
line 929, in run
run_metadata_ptr)
File "C:\anaconda3\lib\site-packages\tensorflow\python\client\session.py",
line 1128, in _run
str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (100, 784) for Tensor 'Reshape:0',
which has shape '(?, 600)'"
解决方案
首先,我建议仅将 PCA 用于训练集,因为您可能会得到不同的 PCA 组件用于训练和测试。所以最简单的解决方法是更改以下代码:
percent=600
pca=PCA(percent)
train_x=pca.fit_transform(train_x)
test_x=pca.fit_transform(test_x)
至
percent=.80
pca=PCA(percent)
pca.fit(train_x)
train_x=pca.transform(train_x)
test_x=pca.transform(test_x)
其次,您percent=600
在进行 PCA 时使用,然后应用 PCA 逆变换,这意味着您返回到具有原始特征数量的空间。为了开始学习减少数量的 PCA 组件,您还可以尝试更改这段代码:
train_x=pca.inverse_transform(train_x)
test_x=pca.inverse_transform(test_x)
c=pca.n_components_
<plotting code>
input_l=percent
至:
c=pca.n_components_
#plotting commented out
input_l=c
它应该为您提供后续优化过程的正确张量维度。
推荐阅读
- keycloak - 登录后keycloak网关ERR_TOO_MANY_REDIRECTS
- pointers - 如何在go中打印struct变量的地址
- angular - 是否可以将管道作为参数传递给组件并从组件内执行转换?
- java - 需要解决此错误的解决方案 Exception:Org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:MessageBodyWriter
- c - 如何在 Windows 和 Linux 中查找当前进程的打开文件描述符数?
- ios - 我如何从本机 swift 代码中使用本机 RCNAsyncStorage 模块
- apache-spark - 如何在spark中跟踪hdfs中已处理的文件
- node.js - 何时在 nodejs 中使用 assert.doesNotReject 方法
- javascript - 初始布局完成后如何重新链接所有链接
- javascript - php - 将 mysql 信息从 php 传递到下一页