简体   繁体   English

Tensorflow Keras 修改虹膜示例时形状不兼容

[英]Tensorflow Keras Incompatible shapes when modifying Iris example

I am trying to implement a neural network based upon https://janakiev.com/notebooks/keras-iris/ using my own data in place of the iris dataset.我正在尝试使用我自己的数据代替虹膜数据集来实现基于https://janakiev.com/notebooks/keras-iris/的神经网络。 As far as I can tell, the only difference is the number of points, my data has 13 features compared to 4 from the iris data, and there are only 2 output classes for my data compared to 3 for the iris data.据我所知,唯一的区别是点数,我的数据有 13 个特征,而虹膜数据有 4 个,我的数据只有 2 个 output 类,而虹膜数据只有 3 个。 However, when I attempt to fit the NN, I get an incompatible shape error.但是,当我尝试拟合 NN 时,出现不兼容的形状错误。

import keras
from keras.models import Sequential
from keras.layers import Dense

batchSize = 10
epochs = 50
model = Sequential()

model.add(Dense(26, input_dim=13, activation='relu'))
model.add(Dense(26, input_dim=13, activation='relu'))
model.add(Dense(26, input_dim=13, activation='relu'))
model.add(Dense(2, activation='softmax')) #2 for number of classes, as far as I can tell
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

#All of xTrain, yTrain, xTest, yTest are defined elsewhere
modelTrain = model.fit(xTrain, yTrain, batch_size=batchSize,epochs=epochs,verbose=1,validation_data=(xTest, yTest))

Error:错误:

ValueError: in user code:

/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:571 train_function  *
    outputs = self.distribute_strategy.run(
/usr/local/lib/python3.7/site-packages/tensorflow/python/distribute/distribute_lib.py:951 run  **
    return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/usr/local/lib/python3.7/site-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
    return self._call_for_each_replica(fn, args, kwargs)
/usr/local/lib/python3.7/site-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
    return fn(*args, **kwargs)
/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:533 train_step  **
    y, y_pred, sample_weight, regularization_losses=self.losses)
/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/engine/compile_utils.py:205 __call__
    loss_value = loss_obj(y_t, y_p, sample_weight=sw)
/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/losses.py:143 __call__
    losses = self.call(y_true, y_pred)
/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/losses.py:246 call
    return self.fn(y_true, y_pred, **self._fn_kwargs)
/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/losses.py:1527 categorical_crossentropy
    return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/backend.py:4561 categorical_crossentropy
    target.shape.assert_is_compatible_with(output.shape)
/usr/local/lib/python3.7/site-packages/tensorflow/python/framework/tensor_shape.py:1117 assert_is_compatible_with
    raise ValueError("Shapes %s and %s are incompatible" % (self, other))

ValueError: Shapes (None, 1) and (None, 2) are incompatible

If I change the parameter "2" in the last Dense model to a 1, then everything runs, but I get a trivial model.如果我将最后一个 Dense model 中的参数“2”更改为 1,那么一切都会运行,但我得到一个微不足道的 model。 Why would I be getting this incompatible shape error and what can be done to fix it?为什么我会收到这个不兼容的形状错误,可以做些什么来解决它?

you have two possibilities if u want to use softmax activation.如果您想使用 softmax 激活,您有两种可能性。 remember that with softmax the last dimension must be equal to the number of classes.请记住,对于 softmax,最后一个维度必须等于类的数量。

1 possibility: if you have 1D integer encoded target, you can use sparse_categorical_crossentropy as loss function 1 种可能性:如果您有 1D integer 编码目标,则可以使用sparse_categorical_crossentropy作为损失 function

# dummy data
xTrain = np.random.uniform(0,1, (100,13))
xTest = np.random.uniform(0,1, (50,13))
yTrain = np.random.randint(0,2, (100,))
yTest = np.random.randint(0,2, (50,))

batchSize = 10
epochs = 50
model = Sequential()

model.add(Dense(26, input_dim=13, activation='relu'))
model.add(Dense(26, activation='relu'))
model.add(Dense(26, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

#All of xTrain, yTrain, xTest, yTest are defined elsewhere
modelTrain = model.fit(xTrain, yTrain, batch_size=batchSize, epochs=epochs, 
                       verbose=1, validation_data=(xTest, yTest))

2 possibility: if you have one-hot encoded your target in order to have 2D shape (n_samples, n_class), you can use categorical_crossentropy 2 种可能性:如果您对目标进行一次热编码以获得 2D 形状(n_samples,n_class),则可以使用categorical_crossentropy

# dummy data
xTrain = np.random.uniform(0,1, (100,13))
xTest = np.random.uniform(0,1, (50,13))
yTrain = pd.get_dummies(np.random.randint(0,2, (100,)))
yTest = pd.get_dummies(np.random.randint(0,2, (50,)))

batchSize = 10
epochs = 50
model = Sequential()

model.add(Dense(26, input_dim=13, activation='relu'))
model.add(Dense(26, activation='relu'))
model.add(Dense(26, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

modelTrain = model.fit(xTrain, yTrain, batch_size=batchSize, epochs=epochs, 
                       verbose=1, validation_data=(xTest, yTest))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM