层不兼容的 Keras 问题
Keras issue with incompatible layer
我是机器学习的新手,正在尝试做一些例子来学习它。
我正在使用 fashion_mnist 数据库,我有下面的代码。
我在这一行收到错误:
history = model.fit(train_X, train_y, epochs = 10, validation_data = (valid_X, valid_y))
The error is the following:
ValueError: Input 0 of layer sequential_5 is incompatible with the
layer: : expected min_ndim=4, found ndim=3. Full shape received:
[None, 28, 28]
我做错了什么,如何解决?
提前谢谢你。
下面是完整的源代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
#from tensorflow import keras
#import keras
from keras.layers import Dense
fashion_mnist = tf.keras.datasets.fashion_mnist
# Contrary to Scikit_Learn, Keras images are 28x28 array rather than a 1D array of size 784
# Pixels intensities are integers (0 to 255) rather than floats (0.0 to 255.0)
fashion_mnist.load_data() # Dataset already split in Training and Testing
# Dataset already split in Training and Testing
(train_X, train_y), (test_X, test_y) = fashion_mnist.load_data()
print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)
# Adding 'valid' sample and Scaling the data (intensity of pixels from 0 to 1)
valid_X, train_X = train_X[:5000], train_X[5000:]
valid_y, train_y = train_y[:5000], train_y[5000:]
print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)
print(valid_X.shape)
print(valid_y.shape)
# Dataset already split in Training and Testing
train_X[0]
# Labeling the 'y' data for the 1st image
y_modalities = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
print(train_y[0])
print(y_modalities[train_y[0]])
image_1 = train_X[0]
plt.imshow(image_1, cmap = 'binary')
print('Class number:', train_y[0])
print('Label is:', y_modalities[train_y[0]])
image_2 = train_X[1]
plt.imshow(image_2, cmap = 'binary')
print('Class number:', train_y[1])
print('Label is:', y_modalities[train_y[1]])
image_3 = train_X[2]
plt.imshow(image_3, cmap = 'binary')
print('Class number:', train_y[2])
print('Label is:', y_modalities[train_y[2]])
plt.figure(figsize = (10, 10))
for i in range(25):
plt.subplot(5, 5, i+1)
plt.subplot(5, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_X[i], cmap = plt.cm.binary)
plt.xlabel(y_modalities[train_y[i]])
plt.show()
# Adding 'valid' sample and Scaling the data (intensity of pixels from 0 to 1)
train_X , valid_X, test_X = train_X /255.0, valid_X/255.0, test_X/255.0
print("after validation")
print(train_X.shape)
print(valid_X.shape)
print(test_X.shape)
# Scaled 1 image array
train_X[0].round(2)
train_y
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, kernel_size = 3, activation = 'relu', padding = 'same', input_shape = [28, 28, 1]),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.Conv2D(128, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.MaxPooling2D(2),
tf.keras.layers.Conv2D(256, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.Conv2D(256, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation = 'relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(64, activation = 'relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(100, activation = 'relu'),
tf.keras.layers.Dense(10, activation = 'softmax')
])
# Built-in loss functions can be passed via their string identifier for a CLASSIFIER model
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.summary()
history = model.fit(train_X, train_y, epochs = 10, validation_data = (valid_X, valid_y))
pd.DataFrame(history.history).plot(figsize = (8, 5))
plt.grid(True)
plt.gca().set_ylim(0,1)
plt.show
model.evaluate(test_X, test_y)
new_X = test_X[:9]
prob_y = model.predict(new_X)
prob_y
y_pred = model.predict_classes(new_X)
y_pred
np.array(y_modalities)[y_pred]
for i in range(9):
plt.subplot(330 + 1 + i)
x_i = test_X[i].reshape(28, 28) # Replacing train_X with test_X
plt.imshow(x_i, cmap = 'binary')
这意味着您的图像形状与所需输入不同,因此您必须像这样重塑您的输入,其余代码相同。
(train_X, train_y), (test_X, test_y) = fashion_mnist.load_data()
train_X = train_X.reshape(-1, 28, 28, 1)
test_X = test_X.reshape(-1, 28, 28, 1)
此外,您必须将损失函数更改为'SparseCategorialCrossentropy'
model.compile(loss = tf.keras.losses.SparseCategoricalCrossentropy(), optimizer = 'adam', metrics = ['accuracy'])
我是机器学习的新手,正在尝试做一些例子来学习它。 我正在使用 fashion_mnist 数据库,我有下面的代码。 我在这一行收到错误:
history = model.fit(train_X, train_y, epochs = 10, validation_data = (valid_X, valid_y))
The error is the following:
ValueError: Input 0 of layer sequential_5 is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: [None, 28, 28]
我做错了什么,如何解决?
提前谢谢你。
下面是完整的源代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
#from tensorflow import keras
#import keras
from keras.layers import Dense
fashion_mnist = tf.keras.datasets.fashion_mnist
# Contrary to Scikit_Learn, Keras images are 28x28 array rather than a 1D array of size 784
# Pixels intensities are integers (0 to 255) rather than floats (0.0 to 255.0)
fashion_mnist.load_data() # Dataset already split in Training and Testing
# Dataset already split in Training and Testing
(train_X, train_y), (test_X, test_y) = fashion_mnist.load_data()
print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)
# Adding 'valid' sample and Scaling the data (intensity of pixels from 0 to 1)
valid_X, train_X = train_X[:5000], train_X[5000:]
valid_y, train_y = train_y[:5000], train_y[5000:]
print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)
print(valid_X.shape)
print(valid_y.shape)
# Dataset already split in Training and Testing
train_X[0]
# Labeling the 'y' data for the 1st image
y_modalities = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
print(train_y[0])
print(y_modalities[train_y[0]])
image_1 = train_X[0]
plt.imshow(image_1, cmap = 'binary')
print('Class number:', train_y[0])
print('Label is:', y_modalities[train_y[0]])
image_2 = train_X[1]
plt.imshow(image_2, cmap = 'binary')
print('Class number:', train_y[1])
print('Label is:', y_modalities[train_y[1]])
image_3 = train_X[2]
plt.imshow(image_3, cmap = 'binary')
print('Class number:', train_y[2])
print('Label is:', y_modalities[train_y[2]])
plt.figure(figsize = (10, 10))
for i in range(25):
plt.subplot(5, 5, i+1)
plt.subplot(5, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_X[i], cmap = plt.cm.binary)
plt.xlabel(y_modalities[train_y[i]])
plt.show()
# Adding 'valid' sample and Scaling the data (intensity of pixels from 0 to 1)
train_X , valid_X, test_X = train_X /255.0, valid_X/255.0, test_X/255.0
print("after validation")
print(train_X.shape)
print(valid_X.shape)
print(test_X.shape)
# Scaled 1 image array
train_X[0].round(2)
train_y
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, kernel_size = 3, activation = 'relu', padding = 'same', input_shape = [28, 28, 1]),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.Conv2D(128, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.MaxPooling2D(2),
tf.keras.layers.Conv2D(256, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.Conv2D(256, kernel_size = 3, activation = 'relu', padding = 'same'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation = 'relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(64, activation = 'relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(100, activation = 'relu'),
tf.keras.layers.Dense(10, activation = 'softmax')
])
# Built-in loss functions can be passed via their string identifier for a CLASSIFIER model
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.summary()
history = model.fit(train_X, train_y, epochs = 10, validation_data = (valid_X, valid_y))
pd.DataFrame(history.history).plot(figsize = (8, 5))
plt.grid(True)
plt.gca().set_ylim(0,1)
plt.show
model.evaluate(test_X, test_y)
new_X = test_X[:9]
prob_y = model.predict(new_X)
prob_y
y_pred = model.predict_classes(new_X)
y_pred
np.array(y_modalities)[y_pred]
for i in range(9):
plt.subplot(330 + 1 + i)
x_i = test_X[i].reshape(28, 28) # Replacing train_X with test_X
plt.imshow(x_i, cmap = 'binary')
这意味着您的图像形状与所需输入不同,因此您必须像这样重塑您的输入,其余代码相同。
(train_X, train_y), (test_X, test_y) = fashion_mnist.load_data()
train_X = train_X.reshape(-1, 28, 28, 1)
test_X = test_X.reshape(-1, 28, 28, 1)
此外,您必须将损失函数更改为'SparseCategorialCrossentropy'
model.compile(loss = tf.keras.losses.SparseCategoricalCrossentropy(), optimizer = 'adam', metrics = ['accuracy'])