python - ValueError:检查输入时出错:预期 conv2d_1_input 的形状为 (None, 50, 30, 3) 但得到的数组的形状为 (1, 3, 50, 30)
问题描述
我正在尝试通过 Keras 库将我用 Matlab 编写的深度学习网络转换为 Python。网络的任务是识别给定图像中的特定音符,并返回对应于特定声音名称的单个字符('从'a'到'h')
Matlab中的代码:
digitDatasetPath = fullfile('zbior_uczacy');
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
labelCount = countEachLabel(imds)
img = readimage(imds,1);
size(img)
numTrainFiles = 1200;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
layers = [
imageInputLayer([50 30 1])
convolution2dLayer(6,12,'Padding',1)
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(6,24,'Padding',1)
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(6,48,'Padding',1)
reluLayer
fullyConnectedLayer(7)
softmaxLayer
classificationLayer];
options = trainingOptions('sgdm', ...
'LearnRateSchedule', 'piecewise', ...
'LearnRateDropFactor', 0.3, ...
'LearnRateDropPeriod', 5, ...
'MaxEpochs', 50, ...
'MiniBatchSize', 300);
net = trainNetwork(imdsTrain,layers,options);
YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = sum(YPred == YValidation)/numel(YValidation)
代码已经过测试,运行良好。现在我正在尝试将此代码转换为 Keras 代码。完整代码在这里:
import numpy as np
import cv2
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, Input
from keras.layers import Convolution2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras import backend as K
from keras.preprocessing import image
print("\n")
print("\n")
trained_weights = []
trained_bias = []
trained_weights = np.loadtxt('Weights.csv', delimiter=';')
trained_bias = np.loadtxt('Bias.csv', delimiter=';')
network_weights = np.array([[trained_weights]])
network_outputs = np.array([['a','c','d','e','f','g','h']])
# Load test image
img = load_img('note_a.png')
note = image.img_to_array(img)
note = np.expand_dims(note, axis=0)
# Model architecture
model = Sequential()
# Layer 1
model.add(Convolution2D(12, (6, 6), input_shape=(50, 30, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# Layer 2
model.add(Convolution2D(24, (6, 6), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# Layer 3
model.add(Convolution2D(48, (6, 6), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(48))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))
model.set_weights([network_weights])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
#model.fit((note,network_outputs), batch_size=32, nb_epoch=10, verbose=1)
score = model.evaluate(note, network_outputs)
为了避免所有的学习,我只是将学习的 matlab 网络的权重导出到 .csv 文件,然后将它们导入我的网络。所以这段代码的目标是只识别给定的图像,然后返回字符。这里没有学习。
该代码返回以下错误:
Traceback (most recent call last):
File "Train_Keras.py", line 51, in <module>
score = model.evaluate(note, network_outputs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\models.py", line 989, in evaluate
sample_weight=sample_weight)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\engine\training.py", line 1723, in evaluate
batch_size=batch_size)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\engine\training.py", line 1414, in _standardize_user_data
exception_prefix='input')
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\engine\training.py", line 153, in _standardize_input_data
str(array.shape))
ValueError: Error when checking input: expected conv2d_1_input to have shape (None, 50, 30, 3) but got array with shape (1, 3, 50, 30)
我的问题是,我是否正确进行图像到数组的转换?以及我应该如何将空行添加到数组中?发现某处,如果我将添加到第一个卷积层批量大小:
model.add(Convolution2D(12, (6, 6), batch_size=1, input_shape=(50, 30, 3), activation='relu'))
然后错误更改为:'检查输入时出错:预期 conv2d_1_input 具有形状(1、50、30、3)',但我不确定添加 batch_size 是否不会改变网络活动。
此外,我在某处发现以网络希望它的确切方式重塑图像可能会有所帮助:
note = np.reshape(note, [1, 50, 30, 3])
但是,这会返回以下错误。老实说,我完全不明白这一点:
Traceback (most recent call last):
File "Train_Keras.py", line 52, in <module>
score = model.evaluate(note, network_outputs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\models.py", line 989, in evaluate
sample_weight=sample_weight)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\engine\training.py", line 1729, in evaluate
self._make_test_function()
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\engine\training.py", line 1012, in _make_test_function
**self._function_kwargs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\backend\theano_backend.py", line 1233, in function
return Function(inputs, outputs, updates=updates, **kwargs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\backend\theano_backend.py", line 1219, in __init__
**kwargs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\compile\function.py", line 317, in function
output_keys=output_keys)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\compile\pfunc.py", line 486, in pfunc
output_keys=output_keys)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\compile\function_module.py", line 1839, in orig_function
name=name)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\compile\function_module.py", line 1519, in __init__
optimizer_profile = optimizer(fgraph)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\gof\opt.py", line 108, in __call__
return self.optimize(fgraph)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\gof\opt.py", line 97, in optimize
ret = self.apply(fgraph, *args, **kwargs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\gof\opt.py", line 251, in apply
sub_prof = optimizer.optimize(fgraph)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\gof\opt.py", line 93, in optimize
self.add_requirements(fgraph)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\tensor\opt.py", line 1488, in add_requirements
fgraph.attach_feature(ShapeFeature())
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\gof\fg.py", line 546, in attach_feature
attach(self)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\tensor\opt.py", line 1305, in on_attach
self.on_import(fgraph, node, reason='on_attach')
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\tensor\opt.py", line 1368, in on_import
self.set_shape(r, s)
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\tensor\opt.py", line 1157, in set_shape
shape_vars.append(self.unpack(s[i], r))
File "C:\Users\Karol\Anaconda3\lib\site-packages\theano\tensor\opt.py", line 1079, in unpack
raise AssertionError(msg)
AssertionError: There is a negative shape in the graph!
Backtrace when that variable is created:
File "Train_Keras.py", line 30, in <module>
model.add(Convolution2D(12, (6, 6), input_shape=(50, 30, 3), activation='relu'))
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\models.py", line 464, in add
layer(x)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\engine\topology.py", line 603, in __call__
output = self.call(inputs, **kwargs)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\layers\convolutional.py", line 164, in call
dilation_rate=self.dilation_rate)
File "C:\Users\Karol\Anaconda3\lib\site-packages\keras\backend\theano_backend.py", line 1913, in conv2d
filter_dilation=dilation_rate)
将不胜感激任何提示如何解决这个问题。谢谢你!
解决方案
推荐阅读
- delphi - 如何在 Delphi 10.1 webbrowser 组件中启用 WebGL 支持?
- python - Python OpenCV中calcOpticalFlowFarneback函数的输出值范围
- r - 如何通过匹配来自不同数据集的两列来追加一列?
- java - 如何从命令行找到有关 OpenJDK 提供程序的详细信息
- swift - 如何使用 eureka lib 在 View 中安装表单视图控制器?
- jakarta-ee - 集成 EJB (JNDI) 和 CDI 的最佳方式
- c++ - SQLGetPrivateProfileString 错误地读取 Unicode 字符
- java - 我写了一个程序,但它遗漏了一些东西,我不知道如何从循环中收取租金
- node.js - 如何为具有太多关联的数据模式构建 Redis - mongodb
- ruby - AWS S3 为视觉托管样式和路径样式 URL 提供不同版本的文件