Python Keras-稠密_3的稠密度(6,)错误,但应为(1,)
我正在学习神经网络,我想创建一个模型,预测该领域的价值。 为了简化,我创建了一个Python Keras-稠密_3的稠密度(6,)错误,但应为(1,),python,machine-learning,keras,neural-network,Python,Machine Learning,Keras,Neural Network,我正在学习神经网络,我想创建一个模型,预测该领域的价值。 为了简化,我创建了一个0、1、2、3、4或5的 我所做的事情: 修改数据帧、筛选数据等 将域名标记为二维整数数组(基于字符) 拆分为X、y列、测试 编译模型 输出应该是0到5个整数,所以我认为最后一层应该是(6,)形状。但很明显,有些地方出了问题 ValueError:检查目标时出错:预期密集_3具有形状 (6,)但得到了形状为(1,)的数组 你知道怎么做吗 from datetime import timedelta, date, da
0、1、2、3、4或5的
我所做的事情:
修改数据帧、筛选数据等
将域名标记为二维整数数组(基于字符)
拆分为X、y列、测试
编译模型
输出应该是0到5个整数,所以我认为最后一层应该是(6,)形状。但很明显,有些地方出了问题
ValueError:检查目标时出错:预期密集_3具有形状
(6,)但得到了形状为(1,)的数组
你知道怎么做吗
from datetime import timedelta, date, datetime
import json
import locale
from keras import Sequential
from keras.layers import Dense
from keras_preprocessing.sequence import pad_sequences
from keras_preprocessing.text import Tokenizer
import pandas as pd
from sklearn.model_selection import train_test_split
locale.setlocale(locale.LC_ALL, '')
LISTINGS_JSON_PATH = '....path to json'
def get_drank(rank):
if rank>5:
return 5
return rank
with open(LISTINGS_JSON_PATH) as f:
d = json.loads(f.read())
today = datetime.combine(date.today(), datetime.min.time())
df = pd.DataFrame(d['data'])
df = df[['domainName', 'auctionEndTime', 'numberOfBids']]
df['domainName'] = df['domainName'].str.lower()
df['auctionEndTime'] = pd.to_datetime(df['auctionEndTime'].str.slice(0, 10), format='%Y-%m-%d')
df['days_to_end'] = df['auctionEndTime'].apply(lambda x: (x - today).days + 1)
df['rank'] = df['numberOfBids'] * (df['days_to_end'])
df['drank'] = df['rank'].apply(lambda x:get_drank(x))
df = df[(df['rank'] != 0.0)|(df['days_to_end']==0.0)]
tk = Tokenizer(num_words=None, char_level=True)
tk.fit_on_texts(df['domainName'])
sequences = tk.texts_to_sequences(df['domainName'])
sequences = pad_sequences(sequences, padding='post')
X_train, X_test, y_train, y_test = train_test_split(sequences, df['drank'], test_size=0.2, random_state=1)
print(X_train)
print(X_test)
model = Sequential([
Dense(32, activation='relu', input_shape=(sequences[0].__len__(),)),
Dense(32, activation='relu'),
Dense(6, activation='softmax'),
])
model.compile(optimizer='adam',
loss='categorical_crossentropy', )
hist = model.fit(X_train, y_train,
batch_size=32, epochs=10,
validation_data=(X_test, y_test))
输出:
输出应该是0到6个整数,所以我认为最后一层应该是(4,)形状
我不知道你这句话是什么意思。你是指形状(1)还是形状(7)
首先,您需要确定应该是序数还是标称
在序数情况下,这意味着输出标签的整数值顺序很重要。例如,如果输出为1或0,其中1表示高,0表示低,则排序0<1
在逻辑上是合理的。然后,如果输出shapeY\u train,Y\u test
为shape(1,),则需要将损失函数更改为loss=sparse\u categorical\u cross\u entropy
在名义上的情况下,顺序并不重要。例如,如果y的值介于APPLE、ORANGE和BANANA之间,那么我们可能会有一个如下的数组:
# Original data: 0=apple, 1=orange, 2=banana
y = [ [2], [0], ...]
# One hot encoded
y = [ [0,0,1], # For banana
[1,0,0], # for apple
]
其中,APPLE
没有任何意义。这可以通过使用sklearn.preprocessing.onehotcoder
来完成,并将目标转换为上面的形状,您的模型架构应该可以工作。对不起,我是说0,1,2,3,4,5所以形状(6),在这种情况下,错误是因为损失函数分类交叉熵
预测形状(6,)的输出但只收到一个整数目标来训练。如果你试图解决的问题是名义上的,一个热编码的目标标签,它应该工作。
# Original data: 0=apple, 1=orange, 2=banana
y = [ [2], [0], ...]
# One hot encoded
y = [ [0,0,1], # For banana
[1,0,0], # for apple
]