Facing the issue while fitting my model (bi-lstm + crf). ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list) - deep-learning
I am trying to solve a problem which contains bi-LSTM and CRF, while fitting the model, i am facing this issue ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list). Below is the structure of the dataframe.
Columns named "CompanyId" that contains integer. "Name" that contains string. "TableTypeCode" that is a string that is constant and is same as "BS". and final column named "BlockName". I want to train a model using bidirectional lstm and crf . Input being "CompanyId", "Name", and "TableTypeCode" and should predict "BlockName".
import numpy as np
import pandas as pd
df=pd.read_excel("data.xlsx")
from keras.layers import TimeDistributed
from keras.layers import Dense
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from keras.preprocessing.text import Tokenizer
from keras.utils import to_categorical
from keras.layers import Input, Embedding, LSTM, Dense, TimeDistributed, Bidirectional
from keras.models import Model
!pip install tensorflow-addons==0.16.1
import tensorflow_addons as tfa
X = df[['CompanyId', 'Name', 'TableTypeCode']]
y = df['BlockName']
# Preprocess the data
# One-hot encode the 'CompanyId' and 'TableTypeCode' columns
X = pd.get_dummies(X, columns=['CompanyId', 'TableTypeCode'])
# Tokenize the 'Name' column
X['Name'] = X['Name'].apply(str)
tokenizer = Tokenizer()
X['Name'] = X['Name'].apply(lambda x: x.split())
X['Name'] = tokenizer.texts_to_sequences(X['Name'])
# Encode the target column
encoder = LabelEncoder()
y = encoder.fit_transform(y)
y = to_categorical(y)
# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
n_classes = df['BlockName'].nunique()
# Define the model architecture
input_ = Input(shape=(X.shape[1],))
embedding = Embedding(input_dim=X.shape[1], output_dim=50)(input_)
lstm = Bidirectional(LSTM(units=100))(embedding)
output = Dense(n_classes, activation='softmax')(lstm)
model = Model(input_, output)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Train the model
model.fit(X_train, y_train)
There was no issue till the last line of code. Help me fix this and train my model.
Related
Regarding Implementation of Gradient Descent for Polynomial Regression
import matplotlib.pyplot as plt import pandas as pd import numpy as np from scipy import stats from numpy.linalg import inv import seaborn as sns url = r'C:\Users\pchan\kc_house_train_data.csv' df = pd.read_csv(url,index_col=0) features_1 = ['sqft_living', 'bedrooms', 'bathrooms', 'lat', 'long'] x=df.filter(features_1) x = np.c_[np.ones((x.shape[0], 1)), x] x=pd.DataFrame(x) y=df.filter(['price']) y=y.reset_index(drop=True) x_new=x.T y.rename(columns = {'price':0}, inplace = True) w=pd.DataFrame([0]*(x_new.shape[0])) cost=[] i=0 a=0.00001 while(i<50): temp=x.T#(y-x#w) w=w+(a*temp) i+=1 print(w) from sklearn.linear_model import LinearRegression reg=LinearRegression().fit(x,y) res=reg.coef_ print(res) w_closed=np.linalg.inv(x.T#x) # x.T # y print(w_closed) Closed Form and Linear Regression from sklearn was able to get correct weights, But not with gradient descent approach(using Matrix notation). Whats wrong with Gradient Descent approach here?
How to download a trained model as a pickle file using Streamlit Download Button?
How do I download a trained model as a pickle file using Streamlit Download Button?
You can use io.BytesIO to store the pickled data inside bytes in RAM. Then, give these bytes as data argument in the st.download_button function. import io import pickle import streamlit as st def create_model(): """Create an sklearn model so that we will have something interesting to pickle. Example taken from here: https://machinelearningmastery.com/save-load-machine-learning-models-python-scikit-learn/ """ import pandas as pd from sklearn import model_selection from sklearn.linear_model import LogisticRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ["preg", "plas", "pres", "skin", "test", "mass", "pedi", "age", "class"] dataframe = pd.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 seed = 7 X_train, _, Y_train, _ = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed) # Fit the model on training set model = LogisticRegression() model.fit(X_train, Y_train) return model def pickle_model(model): """Pickle the model inside bytes. In our case, it is the "same" as storing a file, but in RAM. """ f = io.BytesIO() pickle.dump(model, f) return f st.title("My .pkl downloader") model = create_model() data = pickle_model(model) st.download_button("Download .pkl file", data=data, file_name="my-pickled-model.pkl")
Pytorch datasets.UDPOS.splits throwing error
I want to split the UDPOS dataset into train, valid, and test by fields. Below is my code- import torch import torch.nn as nn import torch.optim as optim from torchtext.legacy import data from torchtext import datasets SEED = 1234 random.seed(SEED) np.random.seed(SEED) torch.manual_seed(SEED) torch.backends.cudnn.deterministic = True TEXT = data.Field(lower = True) UD_TAGS = data.Field(unk_token = None) PTB_TAGS = data.Field(unk_token = None) fields = (("text", TEXT), ("udtags", UD_TAGS), ("ptbtags", PTB_TAGS)) train_data, valid_data, test_data = datasets.UDPOS.splits(fields) This code give me following error- I am using Pytorch version - '1.10.2'. How do I split the UDPOS dataset using fileds in the current version.
I solved the same problem by changing the code from torchtext import datasets to from torchtext.legacy import datasets
Estimating mixture of Gaussian models in Pytorch
I actually want to estimate a normalizing flow with a mixture of gaussians as the base distribution, so I'm sort of stuck with torch. However you can reproduce my error in my code by just estimating a mixture of Gaussian model in torch. My code is below: import numpy as np import matplotlib.pyplot as plt import sklearn.datasets as datasets import torch from torch import nn from torch import optim import torch.distributions as D num_layers = 8 weights = torch.ones(8,requires_grad=True).to(device) means = torch.tensor(np.random.randn(8,2),requires_grad=True).to(device)#torch.randn(8,2,requires_grad=True).to(device) stdevs = torch.tensor(np.abs(np.random.randn(8,2)),requires_grad=True).to(device) mix = D.Categorical(weights) comp = D.Independent(D.Normal(means,stdevs), 1) gmm = D.MixtureSameFamily(mix, comp) num_iter = 10001#30001 num_iter2 = 200001 loss_max1 = 100 for i in range(num_iter): x = torch.randn(5000,2)#this can be an arbitrary x samples loss2 = -gmm.log_prob(x).mean()#-densityflow.log_prob(inputs=x).mean() optimizer1.zero_grad() loss2.backward() optimizer1.step() The error I get is: 0 8.089411823514835 Traceback (most recent call last): File "/home/cameron/AnacondaProjects/gmm.py", line 183, in <module> loss2.backward() File "/home/cameron/anaconda3/envs/torch/lib/python3.7/site-packages/torch/tensor.py", line 221, in backward torch.autograd.backward(self, gradient, retain_graph, create_graph) File "/home/cameron/anaconda3/envs/torch/lib/python3.7/site-packages/torch/autograd/__init__.py", line 132, in backward allow_unreachable=True) # allow_unreachable flag RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling backward the first time. After as you see the model runs for 1 iteration.
There is ordering problem in your code, since you create Gaussian mixture model outside of training loop, then when calculate the loss the Gaussian mixture model will try to use the initial value of the parameters that you set when you define the model, but the optimizer1.step() already modify that value so even you set loss2.backward(retain_graph=True) there will still be the error: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation Solution to this problem is simply create new Gaussian mixture model whenever you update the parameters, example code running as expected: import numpy as np import matplotlib.pyplot as plt import sklearn.datasets as datasets import torch from torch import nn from torch import optim import torch.distributions as D num_layers = 8 weights = torch.ones(8,requires_grad=True) means = torch.tensor(np.random.randn(8,2),requires_grad=True) stdevs = torch.tensor(np.abs(np.random.randn(8,2)),requires_grad=True) parameters = [weights, means, stdevs] optimizer1 = optim.SGD(parameters, lr=0.001, momentum=0.9) num_iter = 10001 for i in range(num_iter): mix = D.Categorical(weights) comp = D.Independent(D.Normal(means,stdevs), 1) gmm = D.MixtureSameFamily(mix, comp) optimizer1.zero_grad() x = torch.randn(5000,2)#this can be an arbitrary x samples loss2 = -gmm.log_prob(x).mean()#-densityflow.log_prob(inputs=x).mean() loss2.backward() optimizer1.step() print(i, loss2)
Simple regression with Keras seems not working properly
I am trying, just for practising with Keras, to train a network to learn a very easy function. The input of the network is 2Dimensional . The output is one dimensional. The function can indeed represented with an image, and the same is for the approximate function. At the moment I'm not looking for any good generalization, I just want that the network is at least good in representing the training set. Here I place my code: import matplotlib.pyplot as plt import numpy as np from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.optimizers import SGD import random as rnd import math m = [ [1,1,1,1,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,1,1], [1,0,0,0,1,1,0,1,0,0], [1,0,0,1,0,0,0,0,0,0], [0,0,0,0,1,1,0,0,0,0], [0,0,0,0,1,1,0,0,0,0], [0,0,0,0,0,0,1,0,0,1], [0,0,1,0,1,1,0,0,0,1], [1,1,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,1,1,1,1]] #A representation of the function that I would like to approximize matrix = np.matrix(m) evaluation = np.zeros((100,100)) x_train = np.zeros((10000,2)) y_train = np.zeros((10000,1)) for x in range(0,100): for y in range(0,100): x_train[x+100*y,0] = x/100. #I normilize the input of the function, between [0,1) x_train[x+100*y,1] = y/100. y_train[x+100*y,0] = matrix[int(x/10),int(y/10)] +0.0 #Here I show graphically what I would like to have plt.matshow(matrix, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) #Here I built the model model = Sequential() model.add(Dense(20, input_dim=2, init='uniform')) model.add(Activation('tanh')) model.add(Dense(1, init='uniform')) model.add(Activation('sigmoid')) #Here I train it sgd = SGD(lr=0.5) model.compile(loss='mean_squared_error', optimizer=sgd) model.fit(x_train, y_train, nb_epoch=100, batch_size=100, show_accuracy=True) #Here (I'm not sure), I'm using the network over the given example x = model.predict(x_train,batch_size=1) #Here I show the approximated function print x print x_train for i in range(0, 10000): evaluation[int(x_train[i,0]*100),int(x_train[i,1]*100)] = x[i] plt.matshow(evaluation, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) plt.colorbar() plt.show() As you can see, the two function are completely different, and I can't understand why. I think that maybe model.predict doesn't work as I axpect.
Your understanding is correct; it's just a question of hyperparameter tuning. I just tried your code, and it looks like you're not giving your training enough time: Look at the loss, under 100 epochs, it's stuck at around 0.23. But try using the 'adam' otimizer instead of SGD, and increase the number of epochs up to 10,000: the loss now decreases down to 0.09 and your picture looks much better. If it's still not precise enough for you, you may also want to try increasing the number of parameters: just add a few layers; this will make overfitting much easier ! :-)
I have changed just your network structure and added a training dataset. The loss decreases down to 0.01. # -*- coding: utf-8 -*- """ Created on Thu Mar 16 15:26:52 2017 #author: Administrator """ import matplotlib.pyplot as plt import numpy as np from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.optimizers import SGD import random as rnd import math from keras.optimizers import Adam,SGD m = [ [1,1,1,1,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,1,1], [1,0,0,0,1,1,0,1,0,0], [1,0,0,1,0,0,0,0,0,0], [0,0,0,0,1,1,0,0,0,0], [0,0,0,0,1,1,0,0,0,0], [0,0,0,0,0,0,1,0,0,1], [0,0,1,0,1,1,0,0,0,1], [1,1,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,1,1,1,1]] #A representation of the function that I would like to approximize matrix = np.matrix(m) evaluation = np.zeros((1000,1000)) x_train = np.zeros((1000000,2)) y_train = np.zeros((1000000,1)) for x in range(0,1000): for y in range(0,1000): x_train[x+1000*y,0] = x/1000. #I normilize the input of the function, between [0,1) x_train[x+1000*y,1] = y/1000. y_train[x+1000*y,0] = matrix[int(x/100),int(y/100)] +0.0 #Here I show graphically what I would like to have plt.matshow(matrix, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) #Here I built the model model = Sequential() model.add(Dense(50, input_dim=2, init='uniform'))## init是关键字,’uniform’表示用均匀分布去初始化权重 model.add(Activation('tanh')) model.add(Dense(20, init='uniform')) model.add(Activation('tanh')) model.add(Dense(1, init='uniform')) model.add(Activation('sigmoid')) #Here I train it #sgd = SGD(lr=0.01) adam = Adam(lr = 0.01) model.compile(loss='mean_squared_error', optimizer=adam) model.fit(x_train, y_train, nb_epoch=100, batch_size=100, show_accuracy=True) #Here (I'm not sure), I'm using the network over the given example x = model.predict(x_train,batch_size=1) #Here I show the approximated function print (x) print (x_train) for i in range(0, 1000000): evaluation[int(x_train[i,0]*1000),int(x_train[i,1]*1000)] = x[i] plt.matshow(evaluation, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) plt.colorbar() plt.show()