【问题标题】:Python keras neural network (Theano) package returns an error about data dimensionsPython keras 神经网络 (Theano) 包返回有关数据维度的错误
【发布时间】:2015-08-03 18:43:59
【问题描述】:

我有这个代码:

import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
from sklearn import datasets
import theano

iris = datasets.load_iris()
X = iris.data[:,0:3]  # we only take the first two features.
Y = iris.target

X = X.astype(theano.config.floatX)
Y = Y.astype(theano.config.floatX)


model = Sequential()
model.add(Dense(150, 1, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(150, 1, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(150, 1, init='uniform'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)

model.fit(X, Y, nb_epoch=20, batch_size=150)


score = model.evaluate(X_train, y_train, batch_size=16)

返回此错误:

ValueError: Shape mismatch: x has 3 cols (and 150 rows) but y has 150 rows (and 1 cols)
Apply node that caused the error: Dot22(<TensorType(float64, matrix)>, <TensorType(float64, matrix)>)
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)]
Inputs shapes: [(150L, 3L), (150L, 1L)]
Inputs strides: [(24L, 8L), (8L, 8L)]
Inputs values: ['not shown', 'not shown']

有什么问题?

【问题讨论】:

  • 程序的哪一行出现错误?
  • ---&gt; 29 model.fit(X, Y, nb_epoch=20, batch_size=150)

标签: python numpy canopy theano keras


【解决方案1】:

您为内部图层指定了错误的输出尺寸。例如,请参阅 Keras 文档中的此示例:

model = Sequential()
model.add(Dense(20, 64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, 64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, 2, init='uniform'))
model.add(Activation('softmax'))

注意一层的输出大小如何匹配下一层的输入大小:

20x64 -> 64x64 -> 64x2

第一个数字始终是输入大小(前一层的神经元数量),第二个数字是输出大小(下一层的神经元数量)。所以在这个例子中你有四层:

  • 具有 20 个神经元的输入层
  • 具有 64 个神经元的隐藏层
  • 具有 64 个神经元的隐藏层
  • 具有 2 个神经元的输出层

唯一的硬性限制是,第一(输入)层需要拥有与特征一样多的神经元,而最后(输出)层需要拥有尽可能多的神经元来完成任务。

对于您的示例,由于您具有三个特征,因此您需要将输入层大小更改为 3,并且您可以保留此示例中的两个输出神经元来进行二元分类(或者像您一样使用逻辑损失)。

【讨论】:

  • 感谢您的回答。我的输入有 150 个样本(行)和 3 个特征(列)。输出有一列(+150 个样本)。该数据的正确上述形式是什么?我应该在哪里设置每一层的神经元数量?
  • + 什么是batch_size
  • @user2991243:我已经扩展了答案。
  • 一个简单的问题。这个包没有像MATLAB 那样分配训练、测试和验证?所有数据都将用于训练?无论如何要有神经网络的训练、测试和验证数据集?
  • @user2991243:这与原始问题无关。当然,您可以并且应该使用统计/机器学习中的所有标准方法,例如保持和交叉验证。
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 2020-02-10
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多