Ошибка при проверке ввода: ожидалось, что input_3 будет иметь 3 измерения, но получит массив с формой (860, 11) - PullRequest
0 голосов
/ 05 октября 2019

Я получаю эту ошибку.

ValueError: Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (860, 11)

Ниже приведены коды, которые я использую. df имеет размерность 860x15, поэтому datX имеет размерность 860x11

# first neural network with keras tutorial
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

df =pd.read_excel('C:/Users/ASUS/Documents/Script/Simulation.Machine.V1/Final.xlsx', sheetname= "C0")
datX = df.drop(['C0', 'C1', 'C2', 'C3'], axis=1)

import numpy as np
datY = df['C1'] / df['C0'] 
datW = df['C0']**(1/2)
datZ = df['C1']

q=20
p= len(datX.columns)
from keras import backend as K

# define the keras model
model = Sequential()
model.add(Dense(q, input_dim=p, activation='tanh'))
model.add(Dense(1, activation= K.exp))

# define the keras model
offset = Sequential()
offset.add(Dense(1, input_dim=1, activation='linear'))

from keras.layers import Input
tweet_a = Input(shape=(860, 11))
tweet_b = Input(shape=(860, 1))
tweetx = model(tweet_a)
tweety = offset(tweet_b)

from keras.layers import Multiply, add
output = Multiply()([tweetx, tweety])

from keras.models import Model
modelnew = Model(inputs=[tweet_a, tweet_b], outputs=output)

modelnew.compile(optimizer='rmsprop',loss='mse',metrics=['accuracy'])

modelnew.fit([datX, datW], datY, epochs=100, batch_size=10000)

Я ожидаю, что выход будет иметь 1 измерение и будет иметь вход 11 измерений

1 Ответ

0 голосов
/ 06 октября 2019

Довольно очевидно, что здесь происходит. Чтобы понять это, вам нужно знать разницу между аргументами batch_shape и shape в слое Input.

Когда вы задаете аргумент shape, он фактически добавляет новое измерение(т.е. размер партии) до начала фигуры. Поэтому, когда вы передаете 860x11 как shape, фактическая модель ожидает вывод размером bx860x11 (где b - размер пакета). Здесь вы указали значение аргумента batch_shape. Таким образом, есть два решения.

Лучшее решение для вас - изменить приведенное выше на следующее. Потому что таким образом вы не полагаетесь на фиксированный размер партии.

tweet_a = Input(shape=(11,))
tweet_b = Input(shape=(1,))
tweetx = model(tweet_a)
tweety = offset(tweet_b)

Но если вы уверены на 100%, что размер партии всегда равен 860, вы можете попробовать вариант ниже.

tweet_a = Input(batch_shape=(860, 11))
tweet_b = Input(batch_shape=(860, 1))
tweetx = model(tweet_a)
tweety = offset(tweet_b)
...